웹서버(Nginx+FastCGI PHP)구축 및 성능 시험

by 조쉬 posted Sep 20, 2017
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
1. 개요

  최근에 Nginx 와 fastCGI모드로 설치한 PHP가 성능이 뛰어나다는 얘기가 있다. Nginx를 최적으로 설치하고 설치 한 뒤에는 얼마만큼 뛰어난지 조사해 보는 것이 본 내용이다. 
 Nginx는 웹서버이다. Nginx는 성능이 아주 뛰어나고, 현재(2011.04) 전 세계 약 7.5% 정도 사용하고 있는 것으로 알려져있다. Nginx는 아직 베타 버전이지만, 성능이 뛰어나고 가벼운 웹 데몬이라고 한다.

 (내용 작성을 완료한 시점에 1.0.0이 나왔다.- 4월 12일)

 그리고 PHP를 fastCGI모드로 컴파일 하여 WAS처럼 작동하게 한다. Nginx와 PHP는 모듈 연결이 아닌, TCP/IP를 사용한 네트웍 연결을 구성한다. 이렇게 하게되면 웹서버와 WAS(PHP서버)를 분리 할 수 있다. 대형 시스템에서는 고려해 볼만한 구조이다.

 Nginx를 웹서버로 사용하면 많은 이점이 있다. 그렇지만, 여러가지 이점이 국내에서 가장 많이 사용해 왔고, 사용하고 있어 익숙한 Apache를 대체할 만한 웹서버인지는 의문이다. 필자의 생각은 성능이 중요하지만, 안정성 및 유지보수성도 아주 중요하다고 생각한다. 

  본 내용은 Nginx를 설치한다. 그리고 기본 설정을 하고, 마지막으로 성능테스트를 할 것이다.



2. 프로그램 설치

 ( 본 내용는 SULinux 2.0 32Bit을 기반으로 작성한다. )


  2.1. apmtools로 최신버전의 APM 설치

  설치된 프로그램 중, MySQL만을 사용할 것이며, 확장성을 위하여 Apache, PHP는 설치만 하고 사용하지는 않는다. (본 내용은 성능 시험을 위해 사용할 것이다. )

  apmtools

  위 명령어 입력 후 최신 버전을 설치 한다. 
  (참고, 본 내용 사용 버전 : Apache 2.2.16, PHP 5.2.14, MySQL 5.1.51 )

  APM이 설치되었다면, 아래 명령어로 서비스를 중지 시키고 부팅시 시작되지 않게 설정한다. 

  service httpd stop
  chkconfig httpd off




2.2 Libevent 설치 

  php fpm은 event를 사용한다. 최신버전의 라이브러리를 설치해 주어야 한다. 정상 설치 되기 때문에 다음과 같이 설치 한다. 
  참조 URL : http://monkey.org/~provos/libevent/

 프로그램 소스는 /usr/local/src에 저장한다. 그리고 컴파일 등의 작업을 진행한다. 특별이 용량이 부족하지 않다면, 프로그램은 남겨두는 것이 좋다. 

 다음 과정은 프로그램을 다운로드 한 후 압축 해제, 설정, 컴파일, 설치 등의 과정이다.

    cd /usr/local/src
    wget http://monkey.org/~provos/libevent-2.0.10-stable.tar.gz
    tar xvfpz libevent-2.0.10-stable.tar.gz
    cd libevent-2.0.10-stable
    ./configure
    make -j 4 && make install
    cd ../





2.3. PHP 다운로드 및 PHP FPM 패치 설치

  PHP를 fastCGI 모드로 작동시키기 위해서는 php-fpm 패치를 해야 한다. 다음과 같은 과정으로 패치 한다.

  (주의) PHP 5.3.X와 5.2.X 설치법이 다르니 주의 하고, 다른 버전을 설치 해야 한다면, (http://php-fpm.org/wiki/Documentation) 참조하기 바란다.
 
 본 내용에서는 활발하게 개발되고 있는 5.2.X를 선택하여 설치한다.



 cd /usr/local/src
 # PHP 다운로드
wget http://www.php.net/get/php-5.2.17.tar.bz2/from/kr.php.net/mirror  

 # PHP 압축 해제
 tar xvfpj php-5.2.17.tar.bz2

 # PHP-FPM 다운로드
 wget http://php-fpm.org/downloads/php-5.2.17-fpm-0.5.14.diff.gz
 # PHP-FPM 압축해제
 gzip -d 
php-5.2.17-fpm-0.5.14.diff.gz
 # PHP-FPM 패치  
 cd php-5.2.17
 patch -p1 < ../
php-5.2.17-fpm-0.5.14.diff

 # PHP Configure 과정 ( Apmtools와 동일한 옵션 )    
   ./configure --prefix=/usr/local/php_5.2.17-fpm --enable-fpm --enable-fastcgi\
  --with-curl --with-xpm-dir=/usr \
  --with-mcrypt --with-zlib --with-gd --with-ttf --with-png --with-expat-dir=/usr \
  --with-gmp --with-xml --with-language=korean --with-charset=euc_kr \
  --disable-debug --disable-rpath --with-iconv --enable-safe-mode \
  --enable-magic-quotes --enable-bcmath --enable-dio \
  --enable-gd-native-ttf --enable-sysvsem --enable-sysvshm --enable-wddx \
  --enable-pic --enable-inline-optimization --enable-mbstring \
  --enable-mbregex --enable-mbstr-enc-trans --with-config-file- \
  --enable-ftp --disable-debug --enable-track-vars=yes --with-jpeg-dir \
  --with-freetype-dir --enable-gd-native-ttf \
  --enable-dl --enable-gd-imgstrttf --enable-exif --with-openssl --with-fpm \
  --with-libevent=/usr/local/lib --with-xml2 \
  --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config

 # PHP 컴파일
 make -j 4
 # PHP 설치
 make install
 


## 부팅시 자동시작을 위해 스크립트 수정
#  파일명 : /usr/local/php_5.2.17-fpm/sbin/php-fpm 
# 파일의 윗 부분에 다음 내용 추가
---------------- 다음 -----------------------------
# php - this script starts and stops the php-fpm daemon
#
# chkconfig:   - 85 15 
# description:  php cgi


ln -s /usr/local/php_5.2.17-fpm/sbin/php-fpm  /etc/init.d/
chkconfig --add php-fpm
chkconfig php-fpm on






  2.4 Nginx 설치

  Nginx는 웹서버이다. 다음과 같은 같이 설치 한다.


     VERSION_NGINX=0.8.45
     cd /usr/local/src 

     wget http://sysoev.ru/nginx/nginx-${
VERSION_NGINX}.tar.gz
     tar xvfpz nginx-
${VERSION_NGINX}.tar.gz
     cd nginx-
${VERSION_NGINX}


    ./configure --pid-path=/usr/local/nginx/logs/nginx.pid \
      --sbin-path=/usr/local/sbin/nginx \

      --with-md5=/usr/lib --with-sha1=/usr/lib --with-http_ssl_module \
      --with-http_dav_module \

      --without-mail_pop3_module --without-mail_imap_module \
      --without-mail_smtp_module    


    make -j 4
    make install
 


Nginx 시작 스크립트 다운로드 및 설정, 자동시작 등록

wget 'http://wiki.nginx.org/index.php?title=RedHatNginxInitScript&action=raw&anchor=nginx' -O nginx 
 mv nginx /etc/init.d/
 chmod 755 /etc/init.d/nginx
 chkconfig --add nginx
 chkconfig nginx on


Nginx 시작 스크립트(/etc/init.d/nginx)의 일부를 다음과 같이 변경한다.

   ## 23줄 수정
   nginx="/usr/local/sbin/nginx"
   ## 26줄 수정
   NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"



3. 프로그램 설정 및 튜닝

  3.1 PHP-FPM 설정파일 튜닝

  PHP-FPM설치 후 기본 값을 사용하면, 성능이 제대로 나오지 않는다. 그래서 다음과 같이 설정파일(/usr/local/php_5.2.17-fpm/etc/php-fpm.conf)을 사용하여 튜닝 한다.

 ## 63줄 수정
    <value name="user">nobody</value>
 ## 66줄 수정
    <value name="group">nobody</value>

 ## 82줄 수정
    <value name="max_children">2048</value>
 ## 116줄 수정
    <value name="rlimit_files">102400</value>



3.2. Nginx와 PHP 연결 설정

  다음과 같이 php확장자를 가진 프로그램을 PHP-FPM이 실행 할 수 있게 설정한다.
  설정파일 (/usr/local/nginx/conf/nginx.conf)편집

 ## 3줄 수정 
 # MaxClient  = worker_processes * worker_connections 라고 하는데,
    worker_processes  5;

## 약 16줄에 다음과 같이 추가 (리눅스에서 성능이 좋아진단다.)
events {
    worker_connections  1024;
}

## 약 29라인 다음과 같이 변경 (리눅스에서 성능이 좋아진단다.)
    sendfile        on;

 ## 65줄 주석 해제 및 설정 
       location ~ \.php$ {
           root           html;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           fastcgi_param  scRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
             include        fastcgi_params;
       }




4. 프로그램 시작 
  
  php, Nginx 모두 데몬 형태로 시작되어야 한다. 다음과 같이 시작 시킨다.
(주의! 꼭 아래와 같이 ulimit로 file open limit를 늘려준다!.)

echo "ulimit -n 10240" >> /root/.bash_profile
source /root/.bash_profile

  service nginx start
  service php-fpm start




5. 프로그램 성능 테스트

 Nginx를 설치 한 이유는 Apache보다 성능이 우수하다고 해서이다. 여기에서는 앞에서 설치한 Nginx 서버와 SULinux 2.0 의 APM_Install-tools로 설치된 Apache+PHP를 대상으로 성능 시험 해 보았다.


 5.1. 시험 환경 ( 하드웨어 ) 
   제조사 :  HP
   모델    :  HP530
   CPU    :  Intel Core2Duo T5200 (1.6GHz, FSB:533MHz, L2: 2M)
   RAM   :  2G (DDR2, 667MHz, 1G*2)
   Disk    : 160G (SATA, 5400RPM)
   네트워크  : 100M (Intel PRO 100 VE)
   메인보드  : Mobile Intel 940GML Express



 5.2. 시험 명령어

  ab -n 100000 -c 100 192.168.0.183/test2.php

   위 내용은 100개의 쓰레드를 사용하여 100,000의 연결을 시도한다.




 5.3. 시험 PHP 프로그램 

## test1.php (곱셈 테스트)
<? 
   for($i=1;$i<=100;$i++){ 
        echo "$i"; 
        $mult*=$i;
   }
?>






## test2.php ( 배열, 연산 테스트)
<?
  $str=array();
  for($i=1;$i<=100;$i++){
     $str2+=$i%3;
     $str[$i]=$str2;
   }
   echo "ok";
?>




5.4. 시험 결과



Nginx
Apache
test1.php
3121.703775.65
test2.php
3166.623760.82


 위 결과는 동일한 HW에서 Nginx와 Apache의 성능을 비교하였다. 위 값은 초당 처리되는 연결을 의미하며, SULinux 2.0 에서 제공되는 Apache가 훨씬 많은 접속을 처리 할 수 있었다. ( 위 결과는 10회 시험 결과 평균을 낸 것 임 )



6. 마치며
  
  제가 작성한 글이 많은 사람에게 도움이 되었으면 하는 바램입니다. 본 내용의 성능시험 결과는 시험 환경에 따라 다르니 혹시 다른 결과가 나오거나 본 내용에 대한 지적 사항이 있다면 댓글에 남겨주시기 바랍니다.