본문으로 건너뛰기

nginx와 FastCGI를 이용한 PHP 구축 방법은 무엇인가요?

💡 요약 정리

  • nginx에서 PHP를 사용하려면 php-fpm(FastCGI Process Manager)을 통한 연동이 필요합니다.
  • php는 5.3.3 버전 이상이어야 --enable-fpm 옵션을 사용할 수 있습니다.
  • 설정 순서는 MySQL 설치 → PHP 컴파일 → php-fpm 설정 → nginx 설치 및 설정 연동 → 테스트입니다.
  • nginx와 php-fpm 서비스를 연동시키기 위해서는 /etc/init.d/nginx에 시작/종료 스크립트를 추가해야 합니다.
  • phpinfo 페이지를 이용해 설정이 정상적으로 적용되었는지 확인합니다.

1. mysql 설치

(별도 명령어 생략)


2. php 설치

이전 버전의 PHP는 fpm 패치를 적용해야 하지만, php 5.3.3 이후 버전부터는 php-fpm이 내장되어 있어 --enable-fpm 옵션만 추가해 설치하면 됩니다.

php 5.3.3 이전 버전 사용 시에는 다음 페이지를 참고해 패치를 받아 설치합니다. http://php-fpm.org/download/

[root@localhost src]# tar xvzfp php-5.3.6.tar.gz
[root@localhost src]# cd php-5.3.6
[root@localhost php-5.3.6]# ./configure --prefix=/usr/local/php_fpm --enable-fpm --with-openssl --with-mysql=/usr/local/mysql
[root@localhost php-5.3.6]# make
[root@localhost php-5.3.6]# make test
[root@localhost php-5.3.6]# make install

3. php-fpm.conf 파일 수정

[root@localhost php-5.3.6]# cd /usr/local/php_fpm/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# vi php-fpm.conf

다음 항목의 주석을 제거합니다:

listen.owner = nobody
listen.group = nobody
listen.mode = 0666
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
rlimit_files = 1024

4. php-fpm 데몬 실행 및 테스트

[root@localhost etc]# /usr/local/php_fpm/sbin/php-fpm
[root@localhost etc]# ps ax | grep php-fpm
 6387 ?        Ss     0:00 php-fpm: master process (/usr/local/php_fpm/etc/php-fpm.conf)
 6388 ?        S      0:00 php-fpm: pool www
 6389 ?        S      0:00 php-fpm: pool www
 6390 ?        S      0:00 php-fpm: pool www
 6391 ?        S      0:00 php-fpm: pool www
 6392 ?        S      0:00 php-fpm: pool www
 6393 ?        S      0:00 php-fpm: pool www
 6394 ?        S      0:00 php-fpm: pool www
 6395 ?        S      0:00 php-fpm: pool www
 6396 ?        S      0:00 php-fpm: pool www
 6397 ?        S      0:00 php-fpm: pool www
 6398 ?        S      0:00 php-fpm: pool www
 6399 ?        S      0:00 php-fpm: pool www
 6400 ?        S      0:00 php-fpm: pool www
 6401 ?        S      0:00 php-fpm: pool www
 6402 ?        S      0:00 php-fpm: pool www
 6403 ?        S      0:00 php-fpm: pool www
 6404 ?        S      0:00 php-fpm: pool www
 6405 ?        S      0:00 php-fpm: pool www
 6406 ?        S      0:00 php-fpm: pool www
 6407 ?        S      0:00 php-fpm: pool www
 6410 pts/1    R+     0:00 grep php-fpm

5. nginx에 필요한 패키지 설치

[root@localhost src]# yum install gcc pcre-devel bzip2-devel openssl-devel

6. nginx 설치

[root@localhost src]# tar xvzfp nginx-1.0.5.tar.gz
[root@localhost src]# cd nginx-1.0.5
[root@localhost nginx-1.0.5]# ./configure --prefix=/usr/local/nginx

nginx 컴파일 로그 중 주요 확인 정보:

checking for OS
 + Linux 2.6.18-238.12.1.el5xen x86_64
checking for C compiler ... found
 + using GNU C compiler
 + gcc version: 4.1.2 20080704 (Red Hat 4.1.2-50)
...
Configuration summary
 + using system PCRE library
 + OpenSSL library is not used
 + md5: using system crypto library
 + sha1: using system crypto library
 + using system zlib library

 nginx path prefix: "/usr/local/nginx"
 nginx binary file: "/usr/local/nginx/sbin/nginx"
 nginx configuration prefix: "/usr/local/nginx/conf"
 nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
 nginx pid file: "/usr/local/nginx/logs/nginx.pid"
 nginx error log file: "/usr/local/nginx/logs/error.log"
 nginx http access log file: "/usr/local/nginx/logs/access.log"
 nginx http fastcgi temporary files: "fastcgi_temp"
[root@localhost nginx-1.0.5]# make
[root@localhost nginx-1.0.5]# make install

7. nginx 실행 스크립트 생성

[root@localhost nginx-1.0.5]# vi /etc/init.d/nginx

상세 스크립트는 원본 그대로 유지하며, PHP-FPM과 함께 시작/종료되도록 구성되어 있습니다.


8. nginx와 PHP 연동 설정

[root@localhost nginx-1.0.5]# vi /usr/local/nginx/conf/nginx.conf

다음 블록의 주석을 해제합니다:

    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;
    }

9. 서비스 시작 및 php-fpm 자동 연동 설정

[root@localhost nginx-1.0.5]# /etc/init.d/nginx start
[root@localhost nginx-1.0.5]# /usr/local/php_fpm/sbin/php-fpm

nginx 시작 시 php-fpm도 자동 실행되도록 스크립트를 수정합니다:

start() {
  [ -x $nginx ] || exit 5
  [ -f $NGINX_CONF_FILE ] || exit 6
  make_dirs
  echo -n $"Starting $prog: "
  daemon $nginx -c $NGINX_CONF_FILE
  retval=$?
  echo
  [ $retval -eq 0 ] && touch $lockfile
  /usr/local/php_fpm/sbin/php-fpm
  return $retval
}

stop() {
  echo -n $"Stopping $prog: "
  killproc $prog -QUIT
  retval=$?
  echo
  [ $retval -eq 0 ] && rm -f $lockfile
  killall php-fpm
  return $retval
}
[root@localhost nginx-1.0.5]# /etc/init.d/nginx restart

10. phpinfo 확인

php 동작 확인을 위해 phpinfo를 작성합니다.

[root@localhost nginx-1.0.5]# cd /usr/local/nginx/html/
[root@localhost html]# cat index.php
<?php
phpinfo();
?>

웹 브라우저에서 해당 파일을 확인하세요.


11. htm/html 확장자에서 PHP 코드 실행 허용

php-fpm.conf 파일에서 다음 설정을 변경해야 합니다.

; Default Value: .php
security.limit_extensions = .php .php3 .php4 .php5 .htm .html

변경 후 php-fpm 데몬을 재시작합니다.