본문 바로가기

리눅스

PHP-FPM Pool을 구성하는 방법

반응형

PHP-FPM Pool을 구성하는 방법

우분투 24.04에서 CPU 개수, 메모리 용량, PHP 프로세스당 메모리 용량을 자동으로 수집하고 이를 기반으로 PHP-FPM 풀 설정을 계산하는 Bash 스크립트입니다.

PHP-FPM Pool 설정 파일 위치

PHP-FPM의 Pool 설정은 /etc/php/{PHP_VERSION}/fpm/pool.d/ 디렉토리 내의 개별 파일로 관리됩니다. 기본적으로 www.conf라는 파일이 존재하지만 여러 개의 Pool을 설정할 수 있습니다.

cd /etc/php/8.3/fpm/pool.d/

기본 Pool 설정 파일 수정

www.conf 파일을 편집하여 기본 Pool 설정을 수정할 수 있습니다.

sudo vim /etc/php/8.3/fpm/pool.d/www.conf

주요 설정 항목

www.conf 파일에서 PHP-FPM의 Pool을 구성하는 주요 설정 항목입니다.

1. user / group

PHP-FPM 프로세스가 실행될 사용자와 그룹을 설정합니다.

user = www-data
group = www-data

2. listen

PHP-FPM이 클라이언트 요청을 수신할 소켓 파일 또는 IP:포트 주소를 설정합니다.

listen = /run/php/php8.3-fpm.sock ; 소켓 파일을 사용할 경우
; listen = 127.0.0.1:9000 TCP 소켓을 사용할 경우

3. pm(Process Management)

PHP-FPM의 프로세스 관리 방식을 설정합니다. dynamic, static, ondemand 모드가 있습니다.

  • dynamic : 프로세스 수가 자동으로 조정됩니다.
  • static : 설정된 수의 프로세스가 항상 유지됩니다.
  • ondemand : 요청이 있을 때만 프로세스가 생성됩니다.
pm = dynamic

4. pm.max_children

PHP-FPM에서 최대 활성화 가능한 자식 프로세스 수입니다. 이 값은 서버의 사용 가능한 메모리와 각 PHP 프로세스의 메모리 사용량을 기반으로 계산됩니다.

  • 공식
pm.max_children = (Available Memory for PHP-FPM) / (PHP-FPM Process Memory Usage)

5. pm.start_servers

PHP-FPM이 시작할 때 생성할 기본 자식 프로세스 수입니다. 서버가 시작될 때 초기 PHP 프로세스의 수를 설정합니다.

  • 공식
pm.start_servers = CPU Count * 2

6. pm.min_spare_servers

PHP-FPM이 최소한으로 유지할 자식 프로세스 수입니다. 이 값은 PHP-FPM이 요청을 처리할 때 대기 중인 작업을 처리할 수 있도록 준비된 자식 프로세스의 최소 수를 설정합니다.

  • 공식
pm.min_spare_servers = CPU Count

7. pm.max_spare_servers

PHP-FPM이 최대한으로 유지할 수 있는 여유 자식 프로세스 수입니다. 이 값은 부하가 많을 때 최대한 유지할 수 있는 대기 프로세스 수를 설정합니다.

  • 공식
pm.max_spare_servers = CPU Count * 4
728x90

8. pm.max_requests

각 PHP-FPM 프로세스가 처리할 최대 요청 수를 지정하여 지정된 요청 수 이후 프로세스를 종료하고 새로 시작합니다.

pm.max_requests = 500

9. pm.process_idle_timeout

유휴 상태의 프로세스가 종료되기까지 대기할 시간을 설정하여 불필요하게 자원을 차지하는 유휴 프로세스를 종료시킵니다.

pm.process_idle_timeout = 10s

PHP-FPM Pool 설정 예시

  • 총 메모리 : 16GB(15882 MB)
  • CPU 코어 : 32 EA
  • 사용 가능한 메모리 : 13,834 MB
  • PHP 프로세스당 메모리 : 41.9364 MB
pm.max_children = 13834 / 41.9364 = 356
pm.start_servers = 32 * 2 = 64
pm.min_spare_servers = 32
pm.max_spare_servers = 32 * 4 = 128

스크립트

vim calculate_php_fpm_pool.sh
더보기

---

#!/bin/bash

# -------------------------------
# 시스템 정보 수집
# -------------------------------

# 1. 시스템 총 메모리 (MB 단위)
TOTAL_MEMORY_MB=$(free -m | awk '/^Mem:/ {print $2}')

# 2. 시스템의 CPU 개수
CPU_COUNT=$(nproc)

# 3. PHP-FPM 프로세스당 평균 메모리 사용량 (MB)
PROCESS_MEMORY_MB=$(ps --no-headers -o rss -C php-fpm8.3 | awk '{sum+=$1} END {if (NR > 0) print sum / NR / 1024}')
if [ -z "$PROCESS_MEMORY_MB" ] || [ "$(echo "$PROCESS_MEMORY_MB == 0" | bc)" -eq 1 ]; then
  echo "No running php-fpm8.3 processes found or unable to calculate memory usage."
  exit 1
fi

# -------------------------------
# 설정값 계산
# -------------------------------

# OS 및 기타 서비스에 할당할 메모리 (2GB 예시)
RESERVED_MEMORY_MB=2048

# 사용 가능한 메모리 (PHP-FPM에 할당 가능한 메모리)
AVAILABLE_MEMORY_MB=$((TOTAL_MEMORY_MB - RESERVED_MEMORY_MB))

# pm.max_children 계산 (소수점 처리 위해 bc 사용)
MAX_CHILDREN=$(echo "scale=0; $AVAILABLE_MEMORY_MB / $PROCESS_MEMORY_MB" | bc)

# pm.start_servers, pm.min_spare_servers, pm.max_spare_servers 설정 (기본값 사용)
START_SERVERS=$((CPU_COUNT * 2))
MIN_SPARE_SERVERS=$((CPU_COUNT))
MAX_SPARE_SERVERS=$((CPU_COUNT * 4))

# -------------------------------
# 출력
# -------------------------------

echo "System Information:"
echo "---------------------"
echo "Total Memory: $TOTAL_MEMORY_MB MB"
echo "CPU Count: $CPU_COUNT"
echo "PHP-FPM Process Memory Usage: $PROCESS_MEMORY_MB MB"
echo "Available Memory for PHP-FPM: $AVAILABLE_MEMORY_MB MB"
echo ""

echo "Calculated PHP-FPM Pool Settings:"
echo "-------------------------------"
echo "pm = dynamic"
echo "pm.max_children = $MAX_CHILDREN"
echo "pm.start_servers = $START_SERVERS"
echo "pm.min_spare_servers = $MIN_SPARE_SERVERS"
echo "pm.max_spare_servers = $MAX_SPARE_SERVERS"
echo "pm.max_requests = 500"
echo "pm.process_idle_timeout = 10s"

---

System Information:
---------------------
Total Memory: 15882 MB
CPU Count: 32
PHP-FPM Process Memory Usage: 41.9595 MB
Available Memory for PHP-FPM: 13834 MB

Calculated PHP-FPM Pool Settings:
-------------------------------
pm = dynamic
pm.max_children = 329
pm.start_servers = 64
pm.min_spare_servers = 32
pm.max_spare_servers = 128
pm.max_requests = 500
pm.process_idle_timeout = 10s

 

PHP-FPM Pool을 구성하는 방법은 서버의 메모리와 CPU 성능을 고려하여 적절한 프로세스 수와 동작 방식을 설정하는 것입니다. PHP-FPM의 성능을 최적화하려면 각 설정을 조정하여 웹 서버의 요구 사항에 맞는 최적의 성능을 발휘할 수 있도록 해야 합니다.

 

참고URL

- 변군이글루 블로그(Byeon-gun's Igloo Blog) - PHP-FPM 풀 설정을 구성하는 방법

- PHP Manual : FastCGI Process Manager (FPM)

 

728x90
반응형