← 전체 목록
서버백업운영

PHP-FPM pm 설정 튜닝으로 트래픽 급증 시 502 에러를 방지합니다

ℹ️ 본 글은 정보 제공 목적이며, 광고·제휴 링크가 포함될 수 있습니다.

PHP-FPM 설정 튜닝으로 워드프레스 속도 개선이 필요했던 건 병원 예약 페이지에 홍보 이메일이 나간 후 갑자기 접속이 몰리면서 502 Bad Gateway 에러가 쏟아졌을 때입니다. Nginx 로그를 보니 connect() to unix:/run/php/php8.1-fpm.sock failed였습니다. PHP-FPM의 pm.max_children이 너무 낮아서 요청이 쌓인 것이었습니다.

현재 PHP-FPM 상태 확인

# PHP-FPM 상태 페이지 활성화 후 확인
# /etc/php/8.1/fpm/pool.d/www.conf 에 추가:
# pm.status_path = /php-fpm-status

# 실시간 상태 확인
curl http://127.0.0.1/php-fpm-status

# 프로세스 수 확인
ps aux | grep php-fpm | wc -l

# 현재 설정 확인
cat /etc/php/8.1/fpm/pool.d/www.conf | grep "^pm"

pm.max_children 계산 방법

# PHP 프로세스 1개당 평균 메모리 사용량 확인
ps --no-headers -o "rss,cmd" -C php-fpm8.1 | awk '{ sum+=$1 } END { printf "%.0f MB\n", sum/NR/1024 }'

# 서버 가용 메모리 확인 (전체 - OS/DB 사용분)
free -m

계산식: pm.max_children = (가용 메모리 MB) / (PHP 1개 평균 MB) 예: 가용 메모리 800MB, PHP 1개 평균 50MB → max_children = 16

최적화된 PHP-FPM 설정

sudo nano /etc/php/8.1/fpm/pool.d/www.conf
; 동적 프로세스 관리 (추천)
pm = dynamic

; 최대 PHP 프로세스 수 (메모리 기준으로 계산)
pm.max_children = 20

; 상시 유지할 프로세스 수
pm.start_servers = 4

; 유휴 상태 최소 유지 수
pm.min_spare_servers = 2

; 유휴 상태 최대 유지 수
pm.max_spare_servers = 6

; 프로세스당 최대 요청 처리 후 재시작 (메모리 누수 방지)
pm.max_requests = 500

적용:

sudo systemctl reload php8.1-fpm

PHP-FPM 튜닝은 서버 메모리에 맞게 수치를 조정하는 것이 핵심입니다. pm.max_children을 너무 높게 잡으면 메모리가 부족해져 오히려 느려지므로, 서버 메모리 기준으로 계산한 값을 사용해야 합니다.

편집 정책

AI가 초안을 생성하고, 의료기관 인프라 운영자가 1차 데이터 기반으로 최종 검수·승인합니다.

작성·검수: WavePix 운영자 (의료기관 3곳 인프라 전담)