Skip to content
VDS · 웹사이트 및 웹 서버

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-12 GB5
VDS-24 GB10
VDS-38 GB20
VDS-524 GB60
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 계정을 사용하는 것은 모든 데이터베이스를 한 번에 잃는 지름길이에요.