PHP-FPM: PHP 사이트
VDS에 PHP-FPM을 설치하고, Nginx와 연동하고, 등급의 메모리에 맞게 프로세스 수를 선택하고, 502와 504 오류를 해결하는 방법을 설명해요.
업데이트 2026년 8월 23일
PHP-FPM은 PHP 코드를 실행하는 별도 서비스이고, 웹 서버는 요청을 그쪽으로 전달하기만 해요. WordPress, Laravel, Bitrix를 비롯해 PHP로 돌아가는 거의 모든 것이 이렇게 동작해요.
설치
apt update
apt install -y php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip
systemctl enable --now php8.3-fpm
AlmaLinux와 CentOS Stream에서는 dnf install -y php-fpm php-mysqlnd ...를 사용해요. 서비스 이름은 php-fpm이에요. 정확한 버전을 확인하려면 다음을 실행하세요:
php -v
systemctl list-units | grep fpm
Nginx 연결
server {
listen 80;
server_name example.ru;
root /var/www/example.ru/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~ /\.(?!well-known) { deny all; }
}
nginx -t && systemctl reload nginx
echo '<?php phpinfo();' > /var/www/example.ru/public/info.php
/info.php를 열어 PHP가 제대로 동작하는지 확인하고, 곧바로 파일을 삭제하세요. 이 파일은 버전, 경로, 모듈 목록을 그대로 노출해요.
프로세스는 몇 개나 유지할까
PHP 워커 프로세스 하나는 40–120 MB를 차지해요. 데이터베이스와 시스템을 위한 메모리를 남겨 두고 티어에 맞춰 산정하세요. 이 설정은 /etc/php/8.3/fpm/pool.d/www.conf에서 구성해요:
| 티어 | 메모리 | 적정 pm.max_children |
|---|---|---|
| VDS-1 | 2 GB | 5 |
| VDS-2 | 4 GB | 10 |
| VDS-3 | 8 GB | 20 |
| VDS-5 | 24 GB | 60 |
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 500
pm.max_requests는 N개의 요청을 처리한 뒤 프로세스를 재시작하므로, 코드의 메모리 누수가 주말까지 쌓이지 않아요.
FPM에 유용한 php.ini 값은 memory_limit = 256M, upload_max_filesize = 64M, post_max_size = 64M, opcache.enable = 1이에요.
변경한 뒤에는 systemctl reload php8.3-fpm을 실행하세요.
자주 발생하는 오류
| 증상 | 원인 | 해결 방법 |
|---|---|---|
502 Bad Gateway | 소켓 경로가 잘못되었거나 서비스가 실행 중이 아님 | fastcgi_pass를 /run/php/에 있는 실제 파일과 대조해 확인하세요 |
504 Gateway Time-out | 스크립트가 타임아웃보다 오래 실행됨 | fastcgi_read_timeout과 max_execution_time을 늘리세요 |
| 브라우저가 실행 대신 파일을 다운로드함 | location ~ \.php$ 블록이 일치하지 않음 | location 블록의 순서를 확인하고 nginx -t를 실행하세요 |
로그에 server reached pm.max_children | 프로세스가 부족함 | 메모리가 허락한다면 한도를 높이고, 그렇지 않다면 상위 티어로 옮기세요 |
로그: /var/log/php8.3-fpm.log와 /var/log/nginx/error.log.
사이트의 데이터베이스는 자기 스키마에 대한 권한만 가진 별도 사용자로 만드세요 — 사용자와 권한. CMS 설정에서
root계정을 사용하는 것은 모든 데이터베이스를 한 번에 잃는 지름길이에요.