[웹서버] 레드헷7.1 웹호스팅 서버 구축하기 -아랑
=========================================================================
Redhat 7.1 Linux webhosting server install
=========================================================================
* 위 문서는 서진우(alang at
sysmng.com) 님이 정리 하신 내용입니다.
* 참조는 가능하나 무단 배포는 금합니다.
* 참조시 발생하는 문제에 대해서도 본인은 책임을 지지 않습니다.
* 작성날짜 : 2001 년 6월 27일
웹호스팅용 리눅스 서버 인스톨기 입니다.
1. 사용되는 패키지
OS : Redhat linux 7.1
Kernel : 2.4.5
apache : 1.3.20
php : 4.0.5
Zend : 4.0.5
Mysql : 3.23.39
bind : 9.1.0-10
sendmail : 8.11.2-14
proftpd : 1.2.2rc2
popper : qpopper3.1.2
realserver
Data-Dumper-2.101
Data-ShowTable-3.3
DBI-1.14
Msql-Mysql-modules-1.2215
2. Redhat 7.1 설치 ( 최소 버젼으로 간단하게 설치한다.)
3. Apache + php + mysql + zend 설치
————————————————————————-
———
3.1.1. 필요한 프로그램
Apache-1.3.20.tar.gz
php-4.0.5.tar.gz
mysql-3.23.39.tar.gz
ZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz
3.1.2. Mysql 설치
먼저 /usr/local/src 및에 위의 소스파일을 놓고 모두 푼다.
Mysql 부터 설치 한다.
# ./configure –prefix=/usr/local/mysql –with-charset=euc_kr
기타 추가 옵션
–with-unix-socket-dir=/usr/local/mysql/sock/socket.mysql
소켓정보파일을 /usr/local/mysql/sock/socket.mysql 로 지정생성하겠다
이 부분을 기술하지 않으면 /tmp/(디폴트 소켓이름) 으로 사용됩니다.
–localstatedir=/mysqldb : 이것은 데이타베이스파일을 어디에다가 생성
할것인지 지정해주는 것입니다.
# make
# make install
설치 완료
# cd /usr/local/mysql mysql 프로그램 생성 위치로 가서
# bin/mysql_install mysql DB 를 생성시켜준다.
# cd /usr/local/mysql/share/mysql
# vi mysql.server mysql 제어 스크립트 수정
편집기로 열어서 safe_mysql이 실행되는 라인에 — language=korean 옵션을 추가
$bindir/safe_mysqld –user=$mysql_daemon_user –pid-file=$pid_file \\
–datadir=/usr/local/mysql/var –language=korean &
# chmod 700 mysql.server
# cp -p mysql.server /usr/bin
mysql 시작과 종료를 보다 편리하게 하기 위해서..
mysql.server stop 중지
mysql.server start 시작
3.1.3. APACHE 1차 설치
apache 를 설치하기 전에 기본적인 튜닝을 먼저 해야 한다.
웹호스팅용 서버는 많은 사용자들이 접속하기 때문에 기본 설치에서는
256 개의 프로세스밖에 생성하지 못한다. 그러므로 설치 소스에세 부
터 이부분을 변경을 해주어야 한다.
먼저 apache 소스 및의 src/include 디렉토리에 httpd.h 파일을 열어서
‘define HARD_SERVER_LIMIT 256’ 되어진 부분을 1024 로 변경하여 준다.
그런뒤 ..
# cd /usr/local/src/apache_1.3.20
# ./configure –prefix=/usr/local/apache –enable-module=so
3.1.4. PHP4 설치
# ./configure –with-mysql=/usr/local/mysql \\
–with-apache=/usr/local/src/apache_1.3.20 \\
–with-gd –with-libpng –with-zlib
–enable-track-vars \\
–with-language=korean \\
–with-charset=euc_kr \\
–enable-magic-quotes \\
# make
# make install
# cp php.ini-dist /usr/local/lib/php.ini
# vi /etc/ld.so.conf
———————————————————————–
/usr/local/lib –> 추가 해줌
/usr/lib
/usr/kerberos/lib
/usr/X11R6/lib
———————————————————————–
# ldconfig
3.1.5. APACHE 2차 설치
# ./configure –prefix=/usr/local/apache \\
–activate-module=src/modules/php4/libphp4.a \\
–enable-module=so \\
옵션 –enable-module=so 는 DSO 모듈로 설치하는 옵션이다.
나중에 apache 설정시 트래픽 제한에 사용되는 bandwidth.so 모듈을
사용하기 때문에 설치시 부터 DSO 방식으로 설치를 한다.
# make
# make install
3.1.6. Zend 설치
# tar xzvf ZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz
# mkdir -p /usr/local/Zend/lib
# cd ZendOptimizer-1.1.0-PHP_4.0.5
# mv * /usr/local/Zend/lib
# vi /usr/local/lib/php.ini
마지막 줄에 다음을 추가 한다.
zend_optimizer.optimization_level=7
zend_extension=”/usr/local/Zend/lib/ZendOptimizer.so”
4. FTP 설치
proftpd 최신 버젼을 rpm 으로 다운 받아서 설치한다.
# rpm -Uvh proftpd-1.2.2rc2-2kr.i386.rpm
다음 설정 파일을 수정한다.
# vi /etc/proftpd/conf/proftpd.conf
——————————————————————–
# 접속시 나타나는 서버 이름
ServerName ” WEB HOSTING FTP SERVER ”
# 웹호스팅 서버에서는 inetd 보단 standalone mode 로 운영한다.
ServerType standalone
DefaultServer on
AuthPAMAuthoritative on
# 사용할 포트 번호다. standalone 에선 이부분 주석을 제거해준다.
Port 21
RootLogin off
DefaultRoot ~ # !wheel
<Global>
Umask 022
# (최대 접속 수)
MaxClients 10
# (같은 위치에서 접속할수 있는 최대 접속수 )
MaxClientsPerHost 3 “Sorry, one connection allow per one host”
# (같은 계정으로 접속할수 있는 최대 접속수 )
MaxHostsPerUser 3 “Sorry, one hosts allow per one user”
</Global>
# 회선의 bound width 를 특정 속도로 제한한다. 단위는 bbs
# 다운 속도를 256k 로 제한
RateReadBPS 2560000
RateReadFreeBytes 512000
RateReadHardBPS on
# Dos 공격을 막기 위해 자식 Process 의 Maximun number 를
# 조정한다.
MaxInstances 10
# 접속 대기 시간 설정
TimeoutIdle 100
# Client가 접속인증을 허락 받기 전에 Server name를 display
# 하지 않는다.
DeferWelcome on
DisplayLogin /etc/proftpd/conf/welcome.msg
DisplayFirstChdir .message
——————————————————————-
이정도 수정을 하시면 FTP 보안과 설정이 대충 마무리 된다.
5. 메일 서버 설치
기본으로 sendmail-8.11.2-14 이 설치 되어져 있다.
기본 셋팅으로는 자체 서버 내부에 있는 계정끼리만 메일을 주고 받을수
있도록 설치가 되어진다. 새롭게 sendmail.cf 파일을 만들어 주어야 한다.
기본 sendmail.cf 를 백업하고..
# mv /etc/sendmail.cf /etc/sendmail.cf.bak
# cd /etc/mail
/etc/mail/sendmail.mc 파일을 수정한후 m4 를 이용하여 새로운 sendmail.cf
파일을 만든다. (redhat 7.1 부터 변경된 사항)
# vi sendmail.mc
——————————————————————
.
.
아래 설정 부분 제일 앞에 “dnl” 을 붙여준다.
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA’)
.
.
——————————————————————
# m4 sendmail.mc > /etc/sendmail.cf
# /etc/rc.d/init.d/sendmail restart
확인 하도록 하자.
# telnet <ip address> 25
Trying x.x.x.x…
Connected to 0.
Escape character is ‘^]’.
220 ns1.sysmng.com ESMTP Sendmail 8.11.2/8.11.2; Wed, 27 Jun 2001 01:29:51
+0900
pop 데몬으로 qpopper 를 사용할것이기 때문에 최신 소스를 다운 받는다.
다운 받은 소스를 풀고 그 디렉토리로 이동한 다음…
# ./configure –enable-specialauth –enable-servermode –enable-shy
# make
# cp popper/popper /usr/local/lib
inetd.conf 파일을 redhat 7.1 부터는 쓰지 않으므로 xinetd 방식으로 전환 한다.
먼저 inetd.conf 파일을 /etc 밑에 만들고 pop 설정 부분을 적어준다.
# vi inetd.conf
————————————————————————-
—
pop-3 stream tcp nowait root /usr/local/lib/popper
————————————————————————-
—
# inetdconvert -d /etc/xinetd.d pop-3
# /etc/rc.d/init.d/xinetd restart
확인 하자.
# telnet 0 110
Trying 0.0.0.0…
Connected to 0.
Escape character is ‘^]’.
+OK ready
이것으로 센드메일에 관련되어 smtp, pop 모든 셋팅을 마쳤다.
6. Perl 관련 모듈 설치
웹프로그램중 perl 로 짜여진 많은 프로그램이 있다. 이중 특이한 perl 모듈을
이용하는게 있는데 기본 perl 설치에는 없는 모양이다. 설치해 준다.
Data-Dumper-2.101.tar.gz
Data-ShowTable-3.3.tar.gz
DBI-1.14.tar.gz
Msql-Mysql-modules-1.2215.tar.gz
각각 소스를 풀고 하나씩 설치 한다.
# tar xzvf Data-Dumper-2.101.tar.gz
# cd Data-Dumper-2.101
# perl Makefile.PL
# make test
# make install
# cd ../
# tar xzvf Data-ShowTable-3.3.tar.gz
# cd Data-ShowTable
# perl Makefile.PL
# make
# make test
# make install
# cd ../
# tar xzvf DBI-1.14.tar.gz
# cd DBI-1.14
# perl Makefile.PL
# make
# make test
# make install
# cd ../
# tar xzvf Msql-Mysql-modules-1.2215.tar.gz
# cd Msql-Mysql-modules-1.2215
# perl Makefile.PL –config –mysql-use-client-found-rows
Which drivers do you want to install?
1) MySQL only
2) mSQL only (either of mSQL 1 or mSQL 2)
3) MySQL and mSQL (either of mSQL 1 or mSQL 2)
4) mSQL 1 and mSQL 2
5) MySQL, mSQL 1 and mSQL 2
Enter the appropriate number: [3] (mysql 만 설치 되어져 있으니 당근 1 번)
Do you want to install the MysqlPerl emulation? You might keep your old
Mysql module (to be distinguished from DBD::mysql!) if you are concerned
about compatibility to existing applications! [n]
( 응용 프로그램 사용시 이용되는 모듈이므로 n 선택 )
Do you want to install the MysqlPerl emulation? You might keep your old
Mysql module (to be distinguished from DBD::mysql!) if you are concerned
about compatibility to existing applications! [n] n
Where is your MySQL installed? Please tell me the directory that
contains the subdir ‘include’. [/usr/local/mysql] /usr/local/mysql
(Mysql 프로그램이 설치된 위치를 적는다. )
Which database should I use for testing the MySQL drivers? [test]root
(mysql 접속 테스트용 아이디를 적는다..기본 셋팅이니깐..그냥.root)
On which host is database root running (hostname, ip address
or host:port) [localhost] localhost
(mysql hostname 을 적는다..원격 접속이 아니면 그냥 localhost)
User name for connecting to database root? [undef] mysql
(DB명을 적는다. )
Password for connecting to database root? [undef] xxxxxxxxx
(DB 접속 패스워드를 적는다.)
설정 완료 .
# make
# make test
# make install
이것으로 perl 관련 모듈 설치 완료 된다.
7. RealServer 설치
Redhat 7.1 에서는 공유라이브러리 차이로 RealRerver 프로그램 설치시 에러가
뜬다..
./g2p3-linux-c6.bin: error while loading shared libraries: libstdc++.so.2.8:
cannot load shared object file: No such file or directory
libstdc++.so.2.8 라이브러리를 다른 서버에서 받아와서 /usr/lib 에 복사해 둔다.
다시 설치 명령어를 실행한다.
# ./g2p3-linux-c6.bin
질문에 맞추어 답하면서 설치하면 된다.
이로써 웹호스팅용 서버 인스톨에 관련된 부분을 설명했다.
다음으로 위에서 설치된 프로그램의 설정 부분이다.
8. 서버 프로그램 설정 부분
8.1 DNS 서버 설정
아래 파일을 차례로 설정한다.
/etc/host.conf
/etc/hosts
/etc/named.conf
/var/named/name.rev
/var/named/name.zone
/etc/resolv.conf
[root@ns1 /root]# cat /etc/host.conf
————————————————————————-
——
order hosts,bind
multi on
[root@ns1 /root]# cat /etc/hosts
————————————————————————-
——
127.0.0.1 localhost.localdomain localhost
211.47.67.154 sysmng.com sys
211.47.64.145 zzang911.net alang
[root@ns1 /root]# cat /etc/named.conf
————————————————————————-
——
options {
directory “/var/named”;
};
zone “.” IN {
type hint;
file “named.ca”;
};
zone “localhost” IN {
type master;
file “localhost.zone”;
allow-update { none; };
};
zone “0.0.127.in-addr.arpa” IN {
type master;
file “named.local”;
allow-update { none; };
};
key “key” {
algorithm hmac-md5;
secret “fTdunkCbyezFBQGObApE00yqW0WRYlWNmrvSDiTn0HZHOrdveOSbsOfVUi
Eo”;
};
//
// Name Zone file 셋팅 시작
//
zone “67.47.211.in-addr.arpa” IN {
type master;
file “name.rev”;
allow-update { none; };
};
zone “sysmng.com” IN {
type master;
file “name.zone”;
allow-update { none; };
};
[root@ns1 /root]# cat /var/named/name.rev
————————————————————————-
——
$TTL 86400
@ IN SOA ns.sysmng.com. root.sysmng.com. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
;Name Server
IN NS ns.sysmng.com.
;in-addr-arpa
154 IN PTR sysmng.com.
[root@ns1 /root]# cat /var/named/name.zone
————————————————————————-
—–
@ IN SOA ns.sysmng.com. root.ns.sysmng.com. (
1997022700 ; Serial
28800 ; Refresh
900 ; Retry
360000 ; Expire
3600 ) ; Minimum
;Name Server
IN NS ns.sysmng.com.
IN MX 10 @
IN A 211.47.67.154
;Host name & Informations
localhost IN A 127.0.0.1
@ IN A 211.47.67.154
ns IN A 211.47.67.154
IN HINFO “i686 Pentium” “Linux”
;
www IN CNAME ns
mail IN CNAME ns
[root@ns1 /root]# cat /etc/resolv.conf
————————————————————————-
—-
search ns.sysmng.com
nameserver 211.47.67.154
nameserver 211.47.67.1
8.2 apache 설정
아래 파일을 수정 한다.
/usr/local/apache/conf/httpd.conf
————————————————————————-
—-
ServerType standalone
ServerRoot “/usr/local/apache”
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
Timeout 300
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 10
MinSpareServers 15
MaxSpareServers 40
StartServers 10
MaxClients 512
MaxRequestsPerChild 100
Port 80
User nobody
Group nobody
ServerAdmin root at
ns.sysmng.com
ServerName sysmng.com
DocumentRoot “/home/webmaster/www”
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory “/usr/local/apache/htdocs”>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory “/home”>
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Deny from env=go_out
Deny from export=go_out
</Directory>
<IfModule mod_userdir.c>
UserDir www
</IfModule>
<IfModule mod_dir.c>
DirectoryIndex index.html index.htm index.php index.php3
index.phtml index.shtml
index.cgi
</IfModule>
AccessFileName .htaccess
<Files ~ “^\\.ht”>
Order allow,deny
Deny from all
</Files>
<Files ~ “*Chat*”>
Order allow,deny
Deny from all
</Files>
<Files ~ “*CHAT*”>
Order allow,deny
Deny from all
</Files>
UseCanonicalName On
<IfModule mod_mime.c>
TypesConfig /usr/local/apache/conf/mime.types
</IfModule>
DefaultType text/plain
<IfModule mod_mime_magic.c>
MIMEMagicFile /usr/local/apache/conf/magic
</IfModule>
HostnameLookups Off
ErrorLog /usr/local/apache/logs/error_log
LogLevel warn
LogFormat “%h %l %u %t \\”%r\\” %>s %b \\”%{Referer}i\\”
\\”%{User-Agent}
i\\””
combined
LogFormat “%h %l %u %t \\”%r\\” %>s %b” common
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent
LogFormat “%v %{%m:%d}t %b” aol02
CustomLog /usr/local/apache/logs/access_log common
ServerSignature On
<IfModule mod_alias.c>
Alias /icons/ “/usr/local/apache/icons/”
<Directory “/usr/local/apache/icons”>
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</IfModule>
<IfModule mod_autoindex.c>
IndexOptions FancyIndexing
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
</IfModule>
<IfModule mod_mime.c>
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
AddLanguage da .dk
AddLanguage nl .nl
AddLanguage en .en
AddLanguage et .ee
AddLanguage fr .fr
AddLanguage de .de
AddLanguage el .el
AddLanguage he .he
AddCharset ISO-8859-8 .iso8859-8
AddLanguage it .it
AddLanguage ja .ja
AddCharset ISO-2022-JP .jis
AddLanguage kr .kr
AddCharset ISO-2022-KR .iso-kr
AddLanguage no .no
AddLanguage pl .po
AddCharset ISO-8859-2 .iso-pl
AddLanguage pt .pt
AddLanguage pt-br .pt-br
AddLanguage ltz .lu
AddLanguage ca .ca
AddLanguage es .es
AddLanguage sv .se
AddLanguage cz .cz
AddLanguage ru .ru
AddLanguage zh-tw .tw
AddLanguage tw .tw
AddCharset Big5 .Big5 .big5
AddCharset WINDOWS-1251 .cp-1251
AddCharset CP866 .cp866
AddCharset ISO-8859-5 .iso-ru
AddCharset KOI8-R .koi8-r
AddCharset UCS-2 .ucs2
AddCharset UCS-4 .ucs4
AddCharset UTF-8 .utf8
<IfModule mod_negotiation.c>
LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ru ltz ca es sv tw
</IfModule>
AddType application/x-httpd-php .php .php3 .phtml .html .htm .ph .inc
AddType application/x-httpd-php-source .phps
AddType application/x-tar .tgz
AddHandler cgi-script .cgi .pl
AddType text/html .shtml
AddHandler server-parsed .shtml
</IfModule>
<IfModule mod_setenvif.c>
BrowserMatch “Mozilla/2” nokeepalive
BrowserMatch “MSIE 4\\.0b2;” nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch “RealPlayer 4\\.0” force-response-1.0
BrowserMatch “Java/1\\.0” force-response-1.0
BrowserMatch “JDK/1\\.0” force-response-1.0
BrowserMatch “Webzip” go_out
BrowserMatch “WebZip” go_out
BrowserMatch “Teleport” go_out
BrowserMatch “GetRight” go_out
BrowserMatch “Wget” go_out
</IfModule>
NameVirtualHost 211.47.67.154
#BandWidthModule On
#<Directory “/home”>
#LargeFileLimit 10 153600
#LargeFileLimit 300 51200
#MinBandWidth all -1
#</Directory>
<VirtualHost 211.47.67.154>
ServerAdmin webmaster at
sysmng.com
DocumentRoot /home/webmaster/www
ServerName sysmng.com
CustomLog “/usr/local/apache/logs/log” “aol02”
ServerAlias sysmng.com www.sysmng.com
</VirtualHost>
————————————————————————-
—–
9. 기본 보안 셋팅
9.1 불필요한 파일 퍼미션 설정
chmod 700 /usr/bin/finger
chmod 700 /usr/bin/nslookup
chmod 700 /usr/bin/gcc
chmod 700 /usr/bin/cc
chmod 700 /usr/bin/suidperl
chmod 700 /usr/bin/whereis
chmod 700 /usr/bin/sperl5.6.0
chmod 700 /usr/bin/c++
chmod 700 /usr/bin/make
chmod 700 /usr/bin/finger
chmod 700 /usr/bin/pstree
chmod 700 /usr/bin/rlog
chmod 700 /usr/bin/rlogin
chmod 700 /usr/bin/which
chmod 700 /usr/bin/who
chmod 700 /usr/bin/w
chmod 700 /bin/mail
chmod 700 /bin/ps
9.2 setuid,setgid 파일 퍼미션 설정
일단 모든 setuid,setgid 를 검색한다.
# find / -type f \\( -perm -04000 -o -perm -02000 \\)
/bin/su
/usr/bin/passwd
/usr/sbin/sendmail
이정도를 남겨두고 모두 700 으로 퍼미션을 막는다.
/bin/su 는 관리자 계정만 사용할수 있도록 하자.
root 권한을 얻을수 있는 계정이 많을수록 안좋다.
# chgrp wheel /bin/su
# chmod 4750 /bin/su
/usr/bin/telnet 명령어도 관리자 계정만 사용할수 있도록 하자.
아무나 사용할수 있으면 해킹에 이용될수가 있다.
# chgrp wheel /usr/bin/telnet
# chmod 750 /usr/bin/telnet
9.3 디렉토리 퍼미션 설정
웹호스팅 서버는 여러개의 계정을 가지고 있기 때문에 다른 사람의 데이터를
철저히 보호해야 한다. 기본 셋팅에서는 일반 사용자가 다른 사용자의 데이터
를 보는가 하면..시스템 설정 파일까지 볼수가 있다. 이는 피해야 할것이다.
# chmod 711 /
# chmod 711 /home
# chmod 711 /var
# chmod 711 /var/log
# chmod 711 /etc
# chmod 700 /root
이밖에 보안상 문제가 있다는 프로그램이나 kernel 은 필히 패치를 시켜야
할것이다. 그리고 항상 시스템 관리자의 부지런한 관심히 필요할것이다.
이정도면 기본 서버 셋팅 정도는 되었다고 본다.