PHP-FPM을 사용할 때 설정이 누락되거나 잘못 구성되면 성능 저하, 메모리 부족, 연결 실패 등 다양한 문제가 발생할 수 있습니다. 자주 누락되는 중요한 설정들과 해결책을 알아보겠습니다.
가장 중요한 설정 중 하나인 프로세스 관리 설정입니다.
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
메모리 관련 설정이 누락되면 OOM 에러가 발생합니다.
memory_limit = 256M
max_execution_time = 30
max_input_time = 60
post_max_size = 32M
upload_max_filesize = 32M
웹서버와 PHP-FPM 간 통신 설정이 중요합니다.
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
}
문제 진단을 위한 로깅 설정을 추가합니다.
; 슬로우 로그 설정
slowlog = /var/log/php8.1-fpm-slow.log
request_slowlog_timeout = 10s
; 상태 페이지 활성화
pm.status_path = /fpm-status
ping.path = /fpm-ping
; 액세스 로그
access.log = /var/log/php8.1-fpm-access.log
보안 관련 설정이 누락되면 취약점이 발생할 수 있습니다.
; 사용자/그룹 설정
user = www-data
group = www-data
; 보안 설정
security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8
; 환경 변수 제한
clear_env = yes
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
세션 관련 설정이 누락되면 세션 문제가 발생합니다.
session.save_handler = files
session.save_path = "/var/lib/php/sessions"
session.gc_maxlifetime = 1440
session.gc_probability = 1
session.gc_divisor = 1000
성능 향상을 위한 OPcache 설정을 추가합니다.
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1
설정이 올바른지 확인하는 스크립트를 작성합니다.
<?php
function checkFPMConfig() {
$checks = [
'memory_limit' => ini_get('memory_limit'),
'max_execution_time' => ini_get('max_execution_time'),
'post_max_size' => ini_get('post_max_size'),
'upload_max_filesize' => ini_get('upload_max_filesize'),
'opcache.enable' => ini_get('opcache.enable')
];
foreach ($checks as $setting => $value) {
echo "$setting: $value\n";
}
// FPM 상태 확인
if (function_exists('fastcgi_finish_request')) {
echo "PHP-FPM is running\n";
}
}
checkFPMConfig();
프로세스 문제 발생 시 자동 재시작 설정을 추가합니다.
sudo systemctl enable php8.1-fpm
[Service]
Restart=always
RestartSec=10
FPM 상태를 모니터링하는 스크립트를 작성합니다.
#!/bin/bash
STATUS_URL="http://localhost/fpm-status"
RESPONSE=$(curl -s $STATUS_URL)
if [[ $? -ne 0 ]]; then
echo "FPM status check failed"
systemctl restart php8.1-fpm
else
echo "FPM is healthy"
fi
이러한 설정들을 체계적으로 구성하면 PHP-FPM 관련 문제를 예방하고 안정적인 서비스를 운영할 수 있습니다. 특히 프로덕션 환경에서는 모니터링과 로깅 설정을 반드시 포함해야 합니다.