STUDY/PHP

Web Server에서 PHP가 실행되는 구조

devmel 2026. 8. 29. 21:01
 

Web Server는 PHP를 어떻게 처리하는가?

 

 

Web Server는 Client의 HTTP Request를 받아 Resource를 처리하고 Response를 반환함 

 

정적인 파일(HTML, CSS, Image)은 Web Server가 직접 읽어서 반환 가능하지만, 

PHP File은 PHP Code를 실행한 결과를 반환해야 하기 때문에 PHP를 실행할 수 있는 환경이 필요함. 

 

대표적으로 Nginx+PHP-FPM 환경에서는 FastCGI를 사용하여 PHP 실행 요청과 결과를 주고받음

Client
  ↓ HTTP
Nginx
  ↓ FastCGI
PHP-FPM
  ↓
PHP Worker
  ↓
PHP Code 실행

 


 

FastCGI

 

CGI(Common Gateway Interface)

Web Server가 외부 Program에 Request를 전달하고, 해당 Program이 생성한 결과를 다시 받아 Resonse로 사용하는 방식

ex) Web Server와 PHP 실행 환경이 분리되어 있다면, Web Server가 받은 Request 정보를 PHP 실행 환경에 전달하고 실행 결과를 다시 받음 

 

기본적으로, Request를 처리할 때마다 Program을 실행하기 위한 Process가 생성되고, 처리가 끝나면 종료된다

=> Request가 반복되면 Process 생성과 종료도 반복됨, 요청이 많아질수록 Process를 반복해서 생성하고 종료하는 비용이 발생

 

Fast CGI

CGI의 구조를 개선하여 Application Process를 미리 실행해 두고 여러 Request에서 재사용할 수 있도록 한 방식 

Web Server
    ↓
  FastCGI
    ↓
Application Process
    ├─ Request 1 처리
    ├─ Request 2 처리
    └─ Request 3 처리

=> 요청이 들어올 때마다 Application Process를 새로 생성할 필요 없이, 이미 실행 중인 Process에 Request를 전달할 수 있음.

 


 

PHP-FPM

 

개념

FastCGI Request를 받아 PHP를 실행하는 Process들을 관리

=> PHP를 처리할 Worker Process들이 준비되고, Web Server로 부터 FastCGI Request가 들어오면 Worker가 해당 Request를 받아 PHP Code를 실행함.

 

특징

Request 처리가 끝났다고 Worker Process 자체가 매번 종료되는 것은 아니고. 

Worker는 실행 상태를 유지하다가 이후 들어오는 다른 Request를 다시 처리할 수 있음. 

Request 1
   ↓
PHP Worker
   ↓
PHP 실행
   ↓
처리 완료
   │
   └─ Worker 유지
          ↓
       Request 2 처리

 

 

PHP-FPM 내부에는 관리 역할을 하는 Process와 실제 PHP를 실행하는 Worker Process의 역할이 나뉜다. 

PHP-FPM
│
├─ Master Process
│     └─ Worker Process 관리
│
├─ Worker Process
│     └─ PHP Request 처리
│
├─ Worker Process
│     └─ PHP Request 처리
│
└─ Worker Process
      └─ PHP Request 처리

 

 


 

Nginx가 PHP Request를 전달하는 방법

 

Nginx는 PHP Code를 직접 실행하지 않고, 

PHP 실행이 필요한 Reqeuest를 확인하면 FastCGI를 통해 PHP-FPM으로 전달함. 

 

관련된 Nginx 설정 => location, fastcgi_*

 

흐름]

GET /index.php?id=10
        ↓
      Nginx
        ↓
PHP Request에 해당하는 location 선택
        ↓
FastCGI Parameter 구성
        ↓
fastcgi_pass에 지정된 PHP-FPM으로 전달
        ↓
PHP Worker가 PHP Code 실행

 

location ~ \.php$ {
    # FastCGI 요청에 필요한 기본 Parameter 설정을 불러옴
    include fastcgi_params;

    # FastCGI Request를 전달할 PHP-FPM Endpoint
    fastcgi_pass [PHP_FPM_ENDPOINT];

    # PHP-FPM이 실행해야 할 PHP File의 실제 경로 전달
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

 

설정 / 항목 역할 세부 내용 / 예시
location 어떤 Request에 설정을 적용할지 결정 PHP-FPM으로 전달할 Request를 구분함.
ex) location ~ \.php$ {} → .php로 끝나는 URI 대상
fastcgi_pass FastCGI Request를 전달할 PHP-FPM Endpoint 지정 PHP-FPM과 연결할 위치를 지정함. TCP Socket 또는 Unix Socket 사용 가능
└ TCP Socket Hostname 또는 IP + Port로 연결 서로 다른 Container나 Host에서도 사용 가능
ex) 127.0.0.1:9000, php:9000
└ Unix Socket Socket File을 통해 연결 주로 같은 Linux Host에서 Nginx와 PHP-FPM이 실행될 때 사용
ex) unix:/run/php/php-fpm.sock
fastcgi_param PHP 실행에 필요한 Request 정보를 FastCGI Parameter로 전달 실행할 File, HTTP Method, Query String, Server 정보, Request Body 정보 등을 전달
└ SCRIPT_FILENAME 실행해야 할 PHP File의 실제 경로 ex) GET /index.php?id=10, Document Root가 /var/www/html → /var/www/html/index.php
└ REQUEST_METHOD HTTP Request Method ex) GET
└ QUERY_STRING URL에 포함된 Query String ex) id=10
└ SERVER_NAME Request 대상 Server Name ex) example.com
└ CONTENT_TYPE Request Body의 Content Type ex) application/json
└ CONTENT_LENGTH Request Body의 크기 ex) 128