rand(life)
(APM(Apache Php Mysql) 설치 및 운영) 본문
서버를 설치한다면, 대부분 웹 서비스를 하기 위해서 서버를 설치할 것 입니다.
현재까지 나온 최신버전 APM을 설치하는 법을 대상으로 강좌를 써 내려가보도록 하겠습니다. 물론 시간이 지나서 제가 쓴 버전이 최신이 아니게 되며, 설치시 변경된 점들이 있을 것으로 예상됩니다. 하지만 설치법은 대부분 비슷하기 때문에 특별히 달라진점이 있으면, 본 강좌를 업데이트 하도록 하겠습니다. 지금 제가 쓰는 모든 강좌는 연관성이 있으니 다른 강좌들도 참고하시기 바랍니다.
지금 설치하려는 최신버전은 다음과 같습니다. 따로 준비하실 필요는 없고 설치과정에서 모든 자료는 받아서 설치합니다.
mysql 4.0.20
apache 2.0.49
php 4.3.6 (연관프로그램 : zlib 1.1.4 , libpng 1.2.5 ,free type 2.1.5, libjpeg v6b,gd 2.0.15 )
Zend Optimizer 2.5.1
1. zlib, libpng, free type, libjpeg, gd 설치
php 언어에는 여러 함수를 지원합니다. php설치시 라이브러리를 설치해 주어야 작동하는 함수들이 많습니다. 모든 라이브러리를 설치하는 것은 무리가 있다고 생각하며, gd라이브러리는 기본적으로 설치해 주어야 한다고 생각해서, 연관있는 위 프로그램들을 설치하도록 하겠습니다. 물론 제가 썼던 설치강좌대로 설치하셨다면, 위 라이브러리들은 모두 설치되어 있을 것입니다. 하지만, gd라이브러리와 연동이 안된 상태이며, php 연동시 문제를 일으키기 때문에 컴파일 설치하도록 하겠습니다. rpm 설치된 것들은 그대로 놔 두셔도 상관없으니 놔두고 설치하겠습니다.
(1) zlib 설치
zlib은 압축과 관련된 라이브러리 입니다.
[root@localhost local]# cd /usr/local
[root@localhost local]# wget http://ftp.superuser.co.kr/pub/etc/zlib-1.1.4.tar.gz
[root@localhost local]# tar xvfz zlib-1.1.4.tar.gz
[root@localhost local]# cd zlib-1.1.4
[root@localhost zlib-1.1.4]# ./configure && make && make install
[root@localhost zlib-1.1.4]# cd ..
[root@localhost local]# rm -rf zlib-1.1.4*
wget 명령어를 이용해서 ftp 사이트에서 압축된 소스파일을 가져오고 난 뒤에 압축을 해제합니다.
풀어진 디렉토리로 이동하여 configure와 컴파일과 설치를 한꺼번에 명령을 내여 설치합니다.
여기서 && 표시는 configure 가 성공하면 make를 실행하고 make 가 성공하면, make install를 실행하는 의미입니다.
마지막에 압축파일과 풀어진 소스파일은 필요없기 때문에 삭제합니다.
앞으로 설치할 모든 프로그램도 위와 같이 간단하게 설치할 것입니다.
(2) libpng 설치
png 포맷을 다루기 위한 라이브러리입니다.
[root@localhost local]# wget http://ftp.superuser.co.kr/pub/etc/libpng-1.2.5.tar.gz
[root@localhost local]# tar xvfz libpng-1.2.5.tar.gz
[root@localhost local]# cd libpng-1.2.5
[root@localhost libpng-1.2.5]# cp scripts/makefile.linux makefile
[root@localhost libpng-1.2.5]# make test && make install
[root@localhost libpng-1.2.5]# cd ..
[root@localhost local]# rm -rf libpng-1.2.5*
특별한 것은 makefile을 configure로 만들지 않고 , 복사한 것 외에는 다른 것이 없습니다.
(3) freetype 2 설치
글짜를 그릴 때 쓰는 라이브러리 입니다.
[root@localhost local]# wget http://ftp.superuser.co.kr/pub/etc/freetype-2.1.5.tar.gz
[root@localhost local]# tar xvfz freetype-2.1.5.tar.gz
[root@localhost local]# cd freetype-2.1.5
[root@localhost freetype-2.1.5]# ./configure && make && make install
[root@localhost freetype-2.1.5]# cd ..
[root@localhost local]# rm -rf freetype-2.1.5*
(4) libjpeg 설치
jpg 포맷을 다루는 라이브러리 입니다.
[root@localhost local]# wget http://ftp.superuser.co.kr/pub/etc/jpegsrc.v6b.tar.gz
[root@localhost local]# tar xvfz jpegsrc.v6b.tar.gz
[root@localhost local]# cd jpeg-6b
[root@localhost jpeg-6b]# ./configure --enable-shared --enable-static
[root@localhost jpeg-6b]# make && make test
[root@localhost jpeg-6b]# mkdir /usr/local/man/man1
[root@localhost jpeg-6b]# make install
[root@localhost jpeg-6b]# cd ..
[root@localhost local]# rm -rf jpeg*
위 설치법에서 특별한 것은 중간에 /usr/local/man/man1이라는 디렉토리를 생성합니다. 이유는 make install 하면 /usr/local/man/man1 디렉토리가 없다고 멘 페이지가 설치가 되지 않는다는 에러가 납니다.
(5) gd 설치
그래픽 라이브러리 입니다.
[root@localhost local]# wget http://ftp.superuser.co.kr/pub/etc/gd-2.0.15.tar.gz
[root@localhost local]# tar xvfz gd-2.0.15.tar.gz
[root@localhost local]# cd gd-2.0.15
[root@localhost gd-2.0.15]# ./configure && make && make install
[root@localhost gd-2.0.15]# cd ..
[root@localhost local]# rm -rf gd-2.0.15*
2. MySQL 설치
지금부터는 db 서버를 설치하겠습니다. mysql은 많은 프로그램과 연동이 가능하며, linux에서 유용하게 사용할 수 있는 dbms입니다. 아직 안정화된 버전에는 dbms의 중요 기능인 트랜젝션 처리 및 사용자정의 함수 등 부족한 점이 있지만 ( 이 부분은 db의 기능보다는 성능과 가볍게 만든다고 뺏다고 하더군요^^) 대부분 잘~~ 사용하지 않는 기능들입니다. mysql은 안정성 및 성능면에서 우수하죠^^;
(1) 설치
설치는 성능을 약 10% 정도 끌어올려준다는 static 모드로 설치하겠습니다.
[root@localhost local]# wget http://ftp.superuser.co.kr/pub/mysql/mysql-4.0.20.tar.gz
[root@localhost local]# tar xvfz mysql-4.0.20.tar.gz
[root@localhost local]# cd mysql-4.0.20
[root@localhost mysql-2.0.20]# CFLAGS="-static -O2 -march=i686 -funroll-loops" \
CXXFLAGS="-static -O2 -march=i686 -funroll-loops -felide-constructors -fno-exceptions -fno-rtti" \
./configure \
--prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data \
--disable-shared --enable-assembler \
--with-thread-safe-client --with-mysqld-user="mysql" \
--with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static \
--with-readline --without-debug \
--without-docs --without-bench \
--with-charset=euc_kr
MySQL 4.1.X 에서는 --with-charset=euckr 으로 해야 합니다.
위 설정에서 static 모드로 설치하며, 언어는 많이 사용하는 euc_kr로 설치합니다.
데이터 디렉토리는 /usr/local/mysql/data 에 저장하게 설정합니다.
[root@localhost mysql-2.0.20]# make && make install
[root@localhost mysql-2.0.20]# cd ..
[root@localhost local]# rm -rf mysql-4.0.20.tar
이렇게 한방에 컴파일 및 설치까지 합니다.
(2) 설정 파일 복사
메모리에 따라서 환경 설정 파일들을 복사해 줍니다.
my-huge.cnf 1~2G
my-large.cnf 512M
my-medium.cnf 128M~ 256M
my-small.cnf 64M 이하
위와같이 나와있지만 위 설정은 db 서버 전용으로 사용했을 때 설정입니다. 기본적을 my-medium.cnf를 복사한 다음 시스템에 맞게 설정해서 사용해야 합니다 .(모든게 그렇듯 절대적인 것이 아닙니다.)
[root@localhost local]# cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
(3) 기본 db 생성
[root@localhost local]# /usr/local/mysql/bin/mysql_install_db
(4) mysql 운영 사용자 생성
홈 디렉토리는 필요 없기 때문에 -M 옵션을 주어서 사용자를 생성합니다.
[root@localhost local]# useradd -M mysql
(5) data 디렉토리를 mysql이라는 사용자 권한으로 바꾸어 주어야 합니다.
[root@localhost local]# chown -R mysql:mysql /usr/local/mysql/data
(6) 아무곳에서나 mysql 및 mysqldump 명령어를 실행가능하게 심볼릭 링크를 걸어줍니다.
[root@localhost local]# ln -s /usr/local/mysql/bin/mysql /usr/bin/
[root@localhost local]# ln -s /usr/local/mysql/bin/mysqldump /usr/bin/
(7) mysql 데몬을 실행시킵니다.
[root@localhost local]# /usr/local/mysql/bin/mysqld_safe &
(8) mysql root 비밀번호를 설정합니다.
[root@localhost local]# /usr/local/mysql/bin/mysqladmin -u root password "암호"
(9) 운영중에 조취법&^^
- mysql root 비밀번호 잊어 먹었을 때
[root@localhost local]# killall mysqld
[root@localhost local]# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
[root@localhost local]# mysql
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 2 to server version: 4.0.20-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> use mysql
Database changed
mysql> update user set password=password('비밀번호') where user='root';
Query OK, 2 rows affected (0.02 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> exit
Bye
[root@localhost local]# killall mysqld
[root@localhost local]# /usr/local/mysql/bin/mysqld_safe &
(9) MySQL 4.0.X 에서 MySQL 4.1.X 달라진점
4.0.X 에선 4.1.X 는 많은 변화들이 있습니다. 모두 기술하기는 힘들고, 중효한 몇가지만 기술하도록 하겠습니다.
1. mysql 4.1의 table 이름은 utf8으로 저장(한글 테이블명을 사용할수 없습니다.)
2. mysql db 에 user 테이블의 password 필드가 더 길어졌습니다.(16->41)
3. password 다루는 방식이 달라졌습니다. 보안을 강하게 하기 위해서 hashing 메커니즘이 바뀌었습니다.
- hashing 이 16바이트에서 41바이트바뀌었습니다. 보이는건 45바이트. 4바이트는? 소금^^;
- 새로운 포멧은 *부터 시작. 예전포멧은 그렇지 않았습니다.
- 예전 포멧을 사용하려면, old_password()함수를 사용해야 합니다.
4. configure 할때 --with-charset=euc_kr 에서 --with-charset=euckr 으로 바뀌었습니다.
*. 더 자세한 것은. ... http://dev.mysql.com/doc/mysql/en/Upgrading-from-4.0.html 참조하세요
3. Apache 2 설치 web 서버인 apache 는 1 버전과 2버전이 있습니다. 설정 파일 이 다르고, 운영또한 다른 방법으로 돌아가기 때문에 설치 시에도 구분하여 설치해 주는 것이 좋습니다. 아파치 2 버전은 스레드를 사용하여 성능이 좋아졌다더군요.. apache 1버전을 사용하는 경우는 mod_throttle을 설치하기 위한 경우가 있죠^^; 본 강좌에서는 최신 버전을 다루기 때문에 2 버전을 설치합니다.
(1) 설치
[root@localhost local]# wget http://ftp.superuser.co.kr/pub/apache/httpd-2.0.49.tar.gz
[root@localhost local]# tar xvfz httpd-2.0.49.tar.gz
[root@localhost local]# cd httpd-2.0.49
** MaxClient 값 튜닝( 최대 256이지만 이상으로 올려줍니다== > 1280)
server/mpm/prefork/prefork.c 파일에서
#define DEFAULT_SERVER_LIMIT 256 부분을 찾아서
#define DEFAULT_SERVER_LIMIT 1280 으로 수정해 줍니다.
server/mpm/worker/worker.c 파일에서
#define DEFAULT_SERVER_LIMIT 16 부분을 찾아서 ( 16 * 16 = 1024)
#define DEFAULT_SERVER_LIMIT 20 이렇게 수정해 줍니다. (20 * 64 = 1280)
[root@localhost httpd-2.0.49]# ./configure --enable-so --prefix=/usr/local/apache
[root@localhost httpd-2.0.49]# make && make install
[root@localhost httpd-2.0.49]# cd ..
[root@localhost local]# rm -rf httpd-2.0.49.tar.gz
4. PHP 4 설치
현재 안정화된 최신버전이 4점대 버전입니다. php를 컴파일해서 apache 에 모듈로 올릴 것 입니다.
(1) 설치
[root@localhost local]# wget http://ftp.superuser.co.kr/pub/php/php-4.3.6.tar.gz
[root@localhost local]# tar xvfz php-4.3.6.tar.gz
[root@localhost local]# cd php-4.3.6
-- imap 라이브러리를 쓰기 위해서 패키지 설치
[root@localhost php-4.3.6]# wget
http://ftp.superuser.co.kr/pub/redhat/9/RPMS/imap-devel-2001a-18.i386.rpm
--16:32:18-- http://ftp.superuser.co.kr/pub/redhat/9/RPMS/imap-devel-2001a-18.i386.rpm
=> `imap-devel-2001a-18.i386.rpm'
Resolving ftp.superuser.co.kr... 완료.
Connecting to ftp.superuser.co.kr[210.114.223.221]:80... connected.
HTTP 요청을 보냅니다, 서버로부터의 응답을 기다림...200 OK
길이: 747,197 [audio/x-pn-realaudio-plugin]
100%[=========================================================>] 747,197 408.79K/s ETA 00:00
16:32:20 (408.79 KB/s) - `imap-devel-2001a-18.i386.rpm'가 보존되었습니다 [747197/747197]
[root@localhost php-4.3.6]# rpm -Uvh imap-devel-2001a-18.i386.rpm
경고: imap-devel-2001a-18.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
준비 중... ########################################### [100%]
1:imap-devel ########################################### [100%]
[root@localhost php-4.3.6]# rm -rf imap-devel-2001a-18.i386.rpm
[root@localhost php-4.3.6]# CFLAGS="-O3 -march=i686 -funroll-loops -fomit-frame-pointer" \
./configure \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-zlib --with-gd --with-ttf --with-png \
--with-expat-dir=/usr --with-gmp --with-xml \
--with-mysql=/usr/local/mysql \
--with-language=korean \
--with-charset=euc_kr \
--disable-debug --disable-posix --disable-rpath \
--enable-safe-mode --enable-magic-quotes \
--disable-dmalloc --enable-bcmath \
--enable-dio --enable-gd-native-ttf \
--enable-sysvsem --enable-sysvshm \
--enable-wddx --enable-versioning \
--enable-pic --enable-inline-optimization \
--enable-memory-limit --enable-mbstring \
--enable-mbregex --enable-mbstr-enc-trans \
--with-config-file-path=/usr/local/lib --enable-ftp --disable-debug --enable-track-vars=yes \
--with-jpeg-dir --with-freetype-dir \
--enable-gd-native-ttf --enable-dl \
--with-imap=shared --with-imap-ssl=/usr/lib --with-kerberos
[root@localhost php-4.3.6]# make && make install
[root@localhost php-4.3.6]# cp php.ini-dist /usr/local/lib/php.ini
- php.ini 파일을 복사 해 줍니다.
[root@localhost php-4.3.6]# cd ..
[root@localhost local]# rm -rf php-4.3.6.tar.gz
5. Zend Optimizer
php의 성능을 최대화 해 준다는 Zend Optimizer를 설치합니다. Zend 홈페이지에 가보면 성능을 40% 향상시킨다고 합니다. ^^; 검증은 못했지만 말이죠~~ Zend는 컴파일 할 필요없이 받아서 설치하면 됩니다.^^;
(1) 설치
[root@localhost local]# wget
http://ftp.superuser.co.kr/pub/ZendOptimizer/ZendOptimizer-2.5.2-Linux_glibc21-i386.tar.gz
[root@localhost local]# tar xvfz ZendOptimizer-2.5.2-Linux_glibc21-i386.tar.gz
[root@localhost local]# cd ZendOptimizer-2.5.2-Linux_glibc21-i386
[root@localhost ZendOptimizer-2.5.2-Linux_glibc21-i386]# ./install.sh - 위 명령을 실행시키면 다음과 같은 화면들이 주루룩~~ 나옵니다. 무조건 OK~ 또는 YES~^&^
하면 끝납니다.&&;
[root@localhost ZendOptimizer-2.5.2-Linux_glibc21-i386]# cd ..
[root@localhost local]# rm -rf ZendOptimizer-2.5.2-Linux_glibc21-i386*
6. 웹 서버 운영
(1) 아파치 설정파일(/usr/local/apache/conf/httpd.conf) 다루기
아파치 설정파일을 다룹니다. 변경후에는 꼭 아파치를 재시작하시기 바랍니다.
- .php 파일 및 html 파일에서 php 코드 실행되게 설정하려면
AddType application/x-httpd-php .php .phtml .php3 .html .htm
AddType application/x-httpd-php-source .phps위 내용을 추가해 줍니다. 추가 하게 되면 위 파일들에 있는 php 코드는 실행하게 됩니다.
- 기본 언어 설정
AddDefaultCharset ISO-8859-1 이렇게 되었는 것을
AddDefaultCharset EUC-KR 이렇게 바꾸업 줍니다. (mysql 언어와 똑같이 해 줍니다.)
- index.php를 기본으로 실행하게 설정 아파치는 기본적으로 DirectoryIndex index.html index.html.var 이렇게 설정 되어 있어 index.html 파일을 기본으로 읽습니다. 조금 바꾸어 주어 index.php 파일 및 기타 파일들도 기본으로 읽게 설정합니다.
DirectoryIndex index.html index.htm index.php index.php3 index.cgi
- 그림 파일 및 프래쉬 파일 로그 남기지 않게 설정
방문자 수가 많아지면 웹로그가 엄청 쌓이게 되고, 그 로그는 크기가 2G를 넘게 되면 웹페이지에 이상현상이 생깁니다. 그렇다고 로그를 안 남길 수는 없는 것이고, 이미지 파일들은 로그남기는 것에서 제외합니다.
CustomLog logs/access_log common 이렇게 되어 있는 것을 ..
SetEnvIfNoCase Request_URI (gif|png|jpg|css|js|bmp|jpeg|swf)$ IMAGE=1
CustomLog /usr/local/apache/logs/access_log common env=!IMAGE이렇게 바꾸면^^; 쉽게 가능합니다.
(2) php 설정파일 (/usr/local/lib/php.ini) 다루기
php와 관련된 설정을 다룹니다. 변경후에 꼭 아파치 재 시작을 해 주시기 바랍니다.
- post, get , 쿠키 , 세션등의 변수를 일반변수로
예전에 php는 기본적으로 위 변수를 일반변수로 사용할 수 있었습니다. 하지만 보안에 취약 하기 때문에 php 설치시 기본적으로 일반변수로 사용못하게 설정합니다. 이렇게 되면 문제가 예전에 사용하던 짜여졌던 프로그램은 정상적으로 실행되지 않습니다. 보안보다는 호환성이 더 중요하죠^^;
register_globals=On 이렇게 설정합니다.
- 업로드 용량 제한 풀기 기본적으로 업로드는 2M로 제한되어 있습니다. 만약 2M 이상으로 하면 여러 가지 설정들을 바꾸어 줘야 합니다. 업로드 되는 시간을 길 게 해 주어야 하고, 한번에 잡아먹을 메모리를 크게 해 주어야 합니다.
default_socket_timeout = 600
post_max_size = 20M
memory_limit = 20M
upload_max_filesize = 20M
(3) mysql 및 apache 시작
- mysql 시작 : /usr/local/mysql/bin/mysqld_safe &
- apache 시작 : /usr/local/apache/bin/apachectl start
(4) mysql 및 apache 재 시작
- mysql 재시작 : /usr/local/mysql/bin/mysqladmin -u root -p reload
==> 이 방법은 완벽한 재 시작이 아닙니다. 어떤 문제가 생겼을시는 완전히 중지시키고 다시 시작하세요.
- apache 재시작 : /usr/local/apache/bin/apachectl restart
(5) mysql 및 apache 중지
- mysql 중지 : /usr/local/mysql/bin/mysqladmin -u root -p shutdown
==> 이 방법으로 죽지 않을 때는 killall mysqld 라고 하면 죽습니다.
- apache 중지 : /usr/local/apache/bin/apachectl stop
==> 대부분 이 방법으로 죽으나 죽지 않는다면, killall httpd 하시면 죽습니다.
(6) 부팅시 자동 시작 등록하기
echo ' /usr/local/mysql/bin/mysqld_safe&
/usr/local/apache/bin/apachectl start' >> /etc/rc.d/rc.local
위와같은 한줄로 /etc/rc.d/rc.local 파일의 마지막 부분에 삽입합니다.
7. 확인
이렇게 열심히 설치 하였다면.. 확인을 해야 합니다. 서버단에서 확인은 이렇게 합니다.
(1) 프로세스 확인
[root@localhost local]# ps -ef | grep httpd
root 24247 1 0 17:14 ? 00:00:00 /usr/local/apache/bin/httpd -k start
nobody 24248 24247 0 17:14 ? 00:00:00 /usr/local/apache/bin/httpd -k start
nobody 24249 24247 0 17:14 ? 00:00:00 /usr/local/apache/bin/httpd -k start
nobody 24250 24247 0 17:14 ? 00:00:00 /usr/local/apache/bin/httpd -k start
nobody 24251 24247 0 17:14 ? 00:00:00 /usr/local/apache/bin/httpd -k start
nobody 24252 24247 0 17:14 ? 00:00:00 /usr/local/apache/bin/httpd -k start
root 24255 1677 0 17:14 pts/0 00:00:00 grep httpd
[root@localhost local]# ps -ef | grep mysql
root 5351 1677 0 16:06 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
mysql 5371 5351 0 16:06 pts/0 00:00:04 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql
--datadir=/usr/local/mysql/data --user=mysql --pid-file=/usr/local/mysql/data/localhost.localdomain.pid
--skip-locking --port=3306 --socket=/tmp/mysql.sock
root 24257 1677 0 17:14 pts/0 00:00:00 grep mysql
(2) 포트 확인
[root@localhost local]# netstat -an | grep LISTEN | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
[root@localhost local]# netstat -an | grep LISTEN | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
(3) 웹으로 확인
먼저 테스트 페이지 작성 합니다. 간단하게 phpinfo() 함수를 실행시켜 보도록 하겠습니다.
[root@localhost local]# echo " phpinfo(); ?>" > /usr/local/apache/htdocs/index.php
위 결과를 잘 살펴보면, 설치된 라이브러리와 환경변수들을 확인할 수 있습니다.