nginx

[nginx] FastCGI & PHP-FPM

Dev.Congsik 2025. 4. 25. 13:13
728x90

FastCGI는 웹 서버와 애플리케이션 서버(예: PHP, Python, Ruby 등으로 작성된 백엔드 프로그램) 사이의 고속 통신을 위한 인터페이스입니다.


🔧 FastCGI의 주요 역할

  1. 웹 서버와 애플리케이션 간의 중개자 역할
    • 웹 서버(Apache, Nginx 등)는 정적인 파일은 직접 처리하고, 동적인 요청은 FastCGI를 통해 백엔드 프로그램에게 전달합니다.
    • FastCGI는 이 요청을 처리하고, 결과(HTML 등)를 웹 서버에 돌려줍니다.
  2. 프로세스 재사용으로 성능 향상
    • CGI(Common Gateway Interface) 방식은 요청마다 프로세스를 새로 생성하지만,
    • FastCGI는 애플리케이션을 데몬처럼 계속 실행된 상태로 유지해서 반복되는 요청에 빠르게 응답합니다.
  3. 로드 밸런싱 및 보안 분리 가능
    • 웹 서버와 애플리케이션 서버를 분리할 수 있기 때문에, 여러 서버에 요청을 분산하거나 보안적으로 격리하는 것도 용이합니다.

 

 

  • PHP를 실행할 때, Nginx는 PHP 스크립트를 직접 실행하지 않고, FastCGI를 통해 PHP-FPM(PHP FastCGI Process Manager) 에게 전달합니다.

 

PHP-FPM이란?

PHP-FPM (FastCGI Process Manager) 는 PHP를 FastCGI 방식으로 실행하기 위한 고성능 프로세스 관리 도구입니다.

기존의 PHP CGI 방식보다 훨씬 효율적이고 유연한 방식으로, 대규모 트래픽 처리나 다양한 설정이 필요한 환경에서 특히 강력함.


주요 기능 및 특징


프로세스 관리 요청마다 새 프로세스를 만드는 대신, 풀(pool) 방식으로 PHP 프로세스를 미리 만들어 놓고 재사용
성능 향상 CGI는 요청마다 PHP를 실행 → 느림 / FPM은 프로세스를 유지하므로 훨씬 빠름
풀 설정 가능 여러 웹사이트에 대해 각각 별도의 풀을 설정 가능 (사용자별 리소스 제한 등)
모니터링 및 로깅 상태 페이지, 슬로우 로그 등을 통해 성능 분석 가능
보안 분리 각 풀을 서로 다른 사용자 권한으로 실행할 수 있어, 보안 격리 가능

 

예시: Nginx + PHP-FPM 설정 (nginx.conf 또는 사이트 설정 파일)

server { 
  listen 80; server_name example.com; 
  root /var/www/html; 
  index index.php index.html; 
    location / { 
      try_files $uri $uri/ =404; 
    } # PHP 파일을 FastCGI를 통해 처리 
    
    location ~ \.php$ { 
      include fastcgi_params; 
      fastcgi_pass unix:/run/php/php8.1-fpm.sock;       # PHP-FPM 소켓 경로 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    } 
}

항목별 설명

fastcgi_pass PHP-FPM이 사용하는 소켓 또는 IP:포트 (127.0.0.1:9000 같은 경우도 있음)
fastcgi_param SCRIPT_FILENAME PHP 스크립트의 실제 경로를 PHP-FPM에 전달
include fastcgi_params FastCGI 동작에 필요한 기본 환경 변수들 포함
location ~ \.php$ .php로 끝나는 URL 요청을 처리하는 블록

 

FastCGI + PHP-FPM 내부 동작 흐름

1. 클라이언트가 PHP 페이지 요청

GET /index.php HTTP/1.1 Host: example.com

2. Nginx가 정적 파일 아닌 걸 감지 → FastCGI로 전달

  • Nginx는 .php 확장자를 보고 동적 파일임을 인식
  • FastCGI 프로토콜을 사용해 PHP-FPM으로 전달
location ~ \.php$ {
  fastcgi_pass unix:/run/php/php8.1-fpm.sock; 
  fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 
}

3. PHP-FPM이 처리

PHP-FPM은 PHP 스크립트를 빠르게 처리하기 위해 아래와 같은 구조로 작동함:

  • 요청이 들어오면, 대기 중인 워커 프로세스가 PHP 코드를 실행
  • 이 워커는 매번 새로 생성되지 않음 → 빠름
  • 실행된 결과(HTML, JSON 등)를 FastCGI 포맷으로 다시 웹 서버에 전달

 

4. Nginx가 결과 받아 클라이언트에게 응답

  • FastCGI 응답을 받아 HTTP 응답으로 클라이언트에게 전달
HTTP/1.1 200 OK Content-Type: text/html <html>...</html>
 

 

PHP-FPM 설정 예시 (/etc/php/8.1/fpm/pool.d/www.conf)

listen = /run/php/php8.1-fpm.sock 
pm = dynamic pm.max_children = 10 
pm.start_servers = 2 
pm.min_spare_servers = 1 
pm.max_spare_servers = 3

 

항목별 설명

listen Nginx와 통신할 소켓 경로 또는 포트
pm 프로세스 관리 방식 (static, dynamic, ondemand)
pm.max_children 최대 동시 처리 가능 요청 수
pm.start_servers 시작 시 실행되는 워커 수

요약

  • FastCGI는 Nginx와 PHP-FPM 사이의 메신저
  • PHP-FPM은 PHP 스크립트를 처리하는 백엔드 워커
  • 둘이 합쳐지면 CGI보다 훨씬 빠르고 효율적인 PHP 실행 구조가 완성됨

 

728x90