WEB Server - NGINX PHP 연동하기 - CentOS 7




    이번 포스팅에서는 NGINX와 PHP 연동 관련으로 알아보겠습니다.




    이전 글 :


    서버와 클라이언트 그리고 HTTP - https://server-talk.tistory.com/291


    WEB Server - NGINX 알아보기 - https://server-talk.tistory.com/297 

    WEB Server - NGINX Comfile 설치하기 - https://server-talk.tistory.com/301 

    WEB Server - NGINX 서비스 제어 - https://server-talk.tistory.com/302 

    WEB Server - NGINX 구성파일 및 기본설정 - CentOS 7 - https://server-talk.tistory.com/303 

    WEB Server - NGINX HTTP 설정 - CentOS 7 - https://server-talk.tistory.com/304








     CGI 와 FastCGI 알아보기




    CGI와 FastCGI 알아보기 - https://server-talk.tistory.com/308



    NGINX 와 PHP 연동에 앞서 CGI와 FastCGI를 먼저 선행적으로 학습하시고 오셔야 보다 쉽게 이해할수 있습니다









     NGINX와 FastCGI 그리고 PHP-FPM



    NGINX는 Apache와 다르게 전용 PHP 모듈을 설치하지 않고 FastCGI를 사용하여 PHP와 NGINX를 연동하게 됩니다


    FastCGI를 사용하여 PHP와 연동하려면 PHP 설치할경우에 --enable-fpm 옵션을 지정만하면 다른 추가작업 하지않아도 됩니다




    설치과정에서 NGINX와 연동 방식을 이해하는것이 가장 중요합니다


    PHP는 기본적으로 FastCGI 프로토콜을 지원하고 PHP는 스크립트를 처리하여 NGINX와 소켓으로 연동할 수 있습니다 이러한 FastCGI와 PHP가 소켓통신을 하려면 PHP-FPM과 연동이 필요합니다


    PHP-FPM 은 PHP 프로세스를 관리하는 스크립트 입니다 FPM은 NGINX에서 수신을 기다렸다가 FastCGI를 통해 PHP 를 실행하게 됩니다






     PHP 5.2 설치 및 PHP-FPM 연동 설정





    1. libmcrypt-2.5.8 설치


    libmcrypt-2.5.8.tar.gz


    1) libmcrypt-2.5.8.tar.gz 압축해제


    [root@nginx ~]# tar zxf libmcrypt-2.5.8.tar.gz
    



    2) libmcrypt-2.5.8 소스 트리 구성


    [root@nginx ~]# ./configure --prefix=/usr/local/
    



    3) libmcrypt-2.5.8 설치 시작


    [root@nginx ~]# make && make install
    



    4) libmcrypt-2.5.8 설치 시작





    2. PHP-FPM 다운로드


    PHP 5.2 이하버전은 기본적으로 FPM을 지원하지 않으므로 패치를 진행해야됩니다.


    PHP-FPM 다운로드 URL : https://php-fpm.org/downloads/


    위 URL로 버전에 맞는 PHP-FPM을 다운로드를 진행하시면 됩니다.






    3. PHP 설치하기



    1) 심볼릭 링크 설정


    [root@nginx php-5.2.15]# ln -s /usr/lib64/libjpeg.so /usr/lib/
    [root@nginx php-5.2.15]# ln -s /usr/lib64/libpng.so /usr/lib/
    




    2) PHP 압축해제


    [root@nginx ~]# tar zxf php-5.2.15.tar.gz
    



    3) PHP, PHP-FPM 패치


    [root@nginx ~]# gzip -cd php-5.2.15-fpm-0.5.14.diff.gz | patch -d php-5.2.15 -p1
    




    4) 패치파일 이동 및 패치


    libxml29_compat.patch


    [root@nginx ~]# mv libxml29_compat.patch php-5.2.15
    [root@nginx ~]# cd php-5.2.15
    [root@nginx php-5.2.17]# patch -p0 < ./libxml29_compat.patch
    



    5) PHP 소스트리 구성




    CentOS 7 APM 컴파일 설치 (php 5.2.x) - https://server-talk.tistory.com/59


    - 소스 트리구성에 MySQL 옵션이 설정되어 있습니다 MySQL 설치되지 않았을 경우 위 URL에서 MySQL를 설치하시고 진행 바랍니다.


    [root@nginx php-5.2.17]#  ./configure --prefix=/usr/local/php \
    --with-mysql=/server/mysql \
    --with-mysqli=/server/mysql/bin/mysql_config \
    --with-curl \
    --disable-debug \
    --enable-safe-mode \
    --enable-sockets \
    --enable-sysvsem=yes \
    --enable-sysvshm=yes \
    --enable-ftp \
    --enable-magic-quotes \
    --with-ttf \
    --enable-gd-native-ttf \
    --enable-inline-optimization \
    --enable-bcmath \
    --with-zlib \
    --with-gd \
    --with-gettext \
    --with-jpeg-dir=/usr \
    --with-png-dir=/usr/lib \
    --with-freetype-dir=/usr \
    --with-libxml-dir=/usr \
    --enable-exif \
    --enable-sigchild \
    --enable-mbstring \
    --enable-fastcgi \
    --enable-fpm \
    --with-openssl \
    --enable-soap
    




    5) PHP 설치시작


    [root@nginx php-5.2.17]# make && make install
    




    6) PHP 설정파일 복사


    [root@nginx php-5.2.17]# cp -a php.ini-dist /usr/local/php/lib/php.ini
    




    7) PHP-FPM 구동 스크립트


    [root@nginx ~]# cd /etc/init.d/
    [root@nginx ~]# ln -s /usr/local/php/sbin/php-fpm /etc/init.d/php-fpm
    



    8) PHP-FPM 설정파일 데몬 계정 주석 해제 - 63번 66번 줄 주석해제


    FILE : /usr/local/php/etc/php-fpm.conf


    <value name="user">nobody</value>
    <value name="group">nobody</value>
    



    9) PHP-FPM IP와 Port 설정 - 41번줄


    <value name="listen_address">192.168.85.177:9000</value>
    




    10) PHP-FPM이 허용하게될 FastGCI의 IP를 입력 - 137번줄


    <value name="allowed_clients">192.168.85.177</value>
    





    11) PHP-FPM 실행


    [root@nginx ~]# /etc/init.d/php-fpm start
    




     NGINX에서 PHP 파일을 PHP-FPM 에 전달과정


    NGINX와 PHP 연동하기전 NGINX가 PHP파일을 사용자에게 요청받았을때 어떻게 처리하고 PHP-FPM에게 전달하는 과정을 알아야 됩니다.




    NGINX에 PHP파일을 요청받게되면 PHP 처리가 정의 되어 있는 LOCATION 안에 제어문을 처리하게 됩니다.





    LOCATION 제어문 안에 있는 fastcgi_param 지시어로 $document_root(웹사이트 경로)변수와 $fastcgi_script_name(사용자가 요청한 파일)변수를 SCRIPT_FILENAME 변수에 넣어주게 됩니다





    처리해야될 파일에 위치 담아있는 SCRIPT_FILENAME 변수에 fastcgi_pass 지시어 있는 접속정로 PHP-FPM에게 전달하게 됩니다




    fastcgi_pass 지시어로 SCRIPT_FILENAME 에 처리해야될 파일을 전달 받은 PHP-FPM는 PHP가 실행할수 있도록 합니다.





     NGINX에서 FastCGI를 통해 PHP-FPM 연동






    PHP-FPM 정보 : 192.168.85.177:9000


    PHP 설치 및 PHP-FPM 설정이 완료 되었다면 NGINX와 연동을 해야됩니다 정의는 SERVER 블록에 설정을 해야됩니다




    server {
    	listen	192.168.85.177:80;
           server_name	server-talk.com;
           root	/home/server_talk/public_html;
    
            access_log  /usr/local/nginx/logs/server-talk.com.access.log;
            error_log   /usr/local/nginx/logs/server-talk.com.error.log;
    
    
           location / {
              include /usr/local/nginx/conf/naxsi.rules;
              index index.html index.htm;
              error_log  server-talk.com_naxsi_err.log
           }
    
           error_page 500 502 503 504 /usr/local/nginx/html/50x.html;
    
           location = /usr/local/nginx/html/50x.html {
              root html;
           }
    
    	# 사용자 요청파일이 php 확장자 파일을 요청할때 사용됩니다.
    	location ~ \.php$ {
    	    #PHP-FPM에서 지정한 IP와 포트를 입력합니다.
    	    fastcgi_pass   192.168.85.177:9001;
    
    	    #PHP-FPM에 전달하게될 스크립트 파일명
    	    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    
    	    #FastCGI 관련 구성 설정 정보를 포함합니다.
    	    include        fastcgi_params;
    	}
    }
    


    PHP 연동하실 NGINX의 웹사이트의 SERVER 블록에 LOCATION 블록에 PHP 확장자를 접근했을때 처리하는 구문을 설정하면 됩니다



    PHP LOCATION 제어문


    location ~ \.php$ : 사용자가 PHP 파일을 요청했을때 사용됩니다


    fastcgi_pass [IP]:[Port] : 사용자가 요청한 PHP파일을 PHP-FPM에게 주소 입니다


    fastcgi_param  SCRIPT_FILENAME  [웹 사이트 경로][사용자가 요청한 파일] : 사용자가 요청한 디렉토리와 사용자가 요청한 파일을 조합해서 SCRIPT_FILENAME 이라는 이름으로 fastcgi_pass 정의 되어 있는 방법을 이용하여 PHP-FPM 에게 PHP_FILENAME 변수에다가 처리해야될 파일의 위치를 전달하여 처리합니다


    include fastcgi_params : FastCGI 관련 구성 설정 정보를 포함합니다.



    PHP LOCATION 제어문 변수


    $document_root : 사용자가 접속한 웹사이트 경로가 담겨 있습니다


    $fastcgi_script_name : 사용자가 요청한 파일이 담겨 있습니다


    SCRIPT_FILENAME : fastcgi_param 지시어로 사용자가 접속한 경로와 요청한 파일의 위치가 담겨지게 됩니다


    Posted by 서버이야기