NGINX FastCGI 모듈과 PHP-FPM을 활용한 동적 응답 처리 구성

이 포스트는 NGINX FastCGI 모듈을 활용하여 PHP-FPM 서버와 연동하여 응답을 처리하는 방법을 다룹니다. 이를 통해 NGINX는 정적 파일을 직접 제공하고, 동적 요청은 PHP-FPM 서버에서 처리하도록 구성할 수 있습니다.

NGINX와 PHP-FPM을 별도의 VM에 구성하여 PHP-FPM을 설치하고, 외부 서버인 NGINX와 통신할 수 있도록 설정하는 방법을 알아보겠습니다. 이후, NGINX의 FastCGI 모듈을 활용해 PHP-FPM 서버에서 php 파일을 통해 동적 요청을 처리하도록 구성하는 방법을 알아보겠습니다.

NGINX FastCGI 모듈은 NGINX OSS/Plus 모두 사용 가능하며 컴파일 설치 시 별도의 매개변수 설정 없이도 기본적으로 구성됩니다.

목차

1. FastCGI란?
2. PHP-FPM이란?
3. 버전 정보
4. PHP-FPM 설치/ NGINX FastCGI 모듈 연동 구성
5. NGINX FastCGI 모듈 사용 구성
6. 결론

1. FastCGI란?

FastCGI는 웹 서버와 애플리케이션 서버 간의 통신을 위한 프로토콜입니다. 기존 CGI(Common Gateway Interface)의 성능 문제를 해결하기 위해 개발되었습니다.

FastCGI의 주요 특징:

  • 프로세스 재사용을 통한 성능 향상
  • 웹 서버와 애플리케이션 프로세스 간 분리
  • 프로세스가 계속 실행 상태를 메모리에 유지
  • 멀티프로세싱 및 멀티스레딩 지원

기존 CGI는 요청마다 새로운 프로세스를 생성했지만, FastCGI는 프로세스 풀을 사용하여 요청을 처리함으로써 시스템 리소스를 효율적으로 사용합니다.

NGINX FastCGI 모듈은 기본적으로 제공되어 효과적으로 FastCGI 프로토콜을 활용할 수 있습니다.

2. PHP-FPM이란?

PHP-FPM(PHP FastCGI Process Manager)은 PHP를 위한 고성능 FastCGI 구현체로, PHP 스크립트를 처리하기 위한 FastCGI 프로세스 관리자입니다.

PHP-FPM의 주요 특징:

  • 프로세스 풀 관리
  • 고급 프로세스 관리 기능 (시작, 중지, 재시작)
  • 동적 프로세스 생성 및 적응형 프로세스 관리
  • 상세한 상태 모니터링
  • 별도의 사용자/그룹으로 PHP 실행 가능

PHP-FPM은 웹 서버(NGINX)로부터 받은 PHP 요청을 처리하고, 결과를 다시 웹 서버로 반환합니다. NGINX는 정적 파일을 직접 처리하고, PHP 파일에 대한 요청만 PHP-FPM으로 전달하여 시스템 리소스를 효율적으로 사용할 수 있습니다.

3. 버전 정보

  • OS : Ubuntu 22.04.4
  • NGINX OSS : 1.25.5
  • PHP-FPM : 8.1.2-1ubuntu2.20

4. PHP-FPM 설치/ NGINX FastCGI 모듈 연동 구성

apt 저장소를 업데이트하고, PHP-FPM 설치를 진행합니다.

$ sudo apt-get update
$ sudo apt install php-fpm

설치가 완료되면 명령어를 사용해 실행 상태를 확인할 수 있습니다.
PHP-FPM 버전에 따라 명령어에 차이가 있을 수 있습니다.

$ sudo systemctl status php8.1-fpm
● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.1-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2025-02-20 05:09:51 UTC;

다음 명령어를 사용해 PHP-FPM 설정 파일을 편집합니다.

$ sudo vi /etc/php/8.1/fpm/pool.d/www.conf 
...

# 기본 설정의 경우 Unix 소켓을 통해 통신하도록 설정됨
# 외부 서버인 NGINX에서 통신할 수 있도록 TCP 포트 지정
;listen = /run/php/php8.1-fpm.sock
listen = 0.0.0.0:9000

...

# 기본적으로 비활성된 로그 활성화
; The access log file
; Default: not set
access.log = /var/log/php-fpm/$pool.access.log

...

# PHP-FPM 프로세스의 기본 작업 디렉터리를 지정
; Chdir to this directory at the start.
; Note: relative path can be used.
; Default Value: current directory or / when chroot
chdir = /var/www/html

...

포트 번호 및 경로의 경우 필요에 맞게 설정합니다.

설정에서 지정한 디렉터리를 생성하고, PHP-FPM 프로세스의 디렉터리 소유자/권한을 변경합니다.

$ sudo mkdir -p /var/log/php-fpm/
$ sudo mkdir -p /var/www/html

$ sudo chown -R www-data:www-data /var/www/html/
$ sudo chmod -R 755 /var/www/html/

다음 명령어를 사용해 PHP-FPM의 변경된 설정을 적용합니다.

$ sudo systemctl restart php8.1-fpm

PHP 환경 정보를 나타내는 php 파일을 생성합니다.

$ sudo vi /var/www/html/phpinfo.php

<?php
phpinfo();
?>

서버 정보를 출력하는 php 파일을 생성합니다.
파일의 내용은 NGINX STORE GitHub에서 확인하실 수 있습니다.

$ sudo vi /var/www/html/server_info.php

5. NGINX FastCGI 모듈 사용 구성

NGINX에서 제공할 정적 파일을 다음과 같이 구성했습니다.
해당 파일들은 NGINX STORE GitHub에서 확인하실 수 있습니다.

/usr/share/nginx/html/php
├── index.html
├── nginx-logo.png
├── script.js
└── style.css

NGINX의 설정 파일 구성입니다.

php.conf
server {
    listen 9000;  # 9000 포트로 listen

    access_log /var/log/nginx/php_access.log;
    root /usr/share/nginx/html/php;  # NGINX의 정적 파일 디렉터리

    # URI를 통해 파일을 확인하고, 없을 시 404 반환
    location / {
        try_files $uri $uri/ =404;
    }

    # php 파일 요청 처리 location
    location  ~ \.php$ { 
        root /var/www/html;          # PHP-FPM의 php 파일 디렉터리

        include /etc/nginx/fastcgi_params;   # fastcgi 관련 파라미터 설정 파일 적용
        fastcgi_pass  192.168.200.226:9000;  # PHP-FPM 설치 서버:포트 지정

        # PHP-FPM 서버로 전달할 파라미터 설정
        # $document_root = root /var/www/html 로 설정됨
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

}

NGINX FastCGI 모듈에서는 캐시/버퍼와 같은 추가적인 기능도 구성할 수 있습니다. 관련 지시문들은 NGINX FastCGI 모듈 문서를 참고하세요.

/etc/nginx/fastcgi_params 파일은 NGINX 설치 시 기본적으로 설치되는 파일로, FastCGI 관련 파라미터 설정이 사전 구성되어 있습니다. 내용은 다음과 같습니다.

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

웹 브라우저에서 NGINX 서버의 9000 포트로 접속하면 다음과 같은 화면을 확인할 수 있습니다.

NGINX fastcgi example page

서버 정보 불러오기 버튼을 클릭하면 server_info.php 파일을 통해 출력된 정보가 나타납니다.

NGINX fastcgi example page2

하단의 PHP 정보 보기를 클릭하면 phpinfo.php 파일로 제공되는 정보 페이지로 이동합니다.

이와 같은 구성을 통해 NGINX는 정적 파일을 제공하면서, 동적 요청은 php 파일을 통해 제공할 수 있습니다.

6. 결론

이번 포스트에서는 NGINX의 동적 요청 처리를 위해 FastCGI 모듈을 활용하여 PHP-FPM 서버와 연동되도록 구성하는 방법을 알아봤습니다. 먼저 PHP-FPM을 설치하고 외부 서버와 통신할 수 있도록 구성하는 방법을 알아보고, NGINX의 FastCGI 모듈을 통해 구성된 PHP-FPM 서버를 통해 동적 응답을 제공하는 방법을 알아봤습니다.

이와 같은 구성을 통해 NGINX는 정적 파일을 직접 제공하고, 동적 콘텐츠는 PHP-FPM에서 처리하여 서버의 성능을 최적화할 수 있습니다.

NGINX의 다양한 모듈과 NGINX Plus 전용 모듈을 지원하는 상업용 구독 버전의 NGINX를 체험해 보고 싶으시다면 NGINX STORE를 통해 문의해 무료로 체험해 보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required