PHP

PHP-FPM 프로세스 개수 설정하는 방법

저사양 서버에서 PHP 웹서버를 사용할 경우, 메모리 리소스 부족으로 인해 응답 속도가 느려질 수 있다.
이를 해결하는 방법 중 하나로, pm 관련 옵션을 조정하여 PHP-FPM의 프로세스 개수를 제한하는 방법을 설명한다.

1. 설정 파일 확인

PHP-FPM 의 풀(pool) 설정 파일을 수정해야 합니다. 기본적으로 설정 파일은 다음 위치에 있습니다.

  • Debian / Ubuntu :
    • /etc/php/{PHP_VERSION}/fpm/pool.d/www.conf
  • CentOS / RHEL /AWS Linux  :
    •  /etc/php-fpm.d/www.conf

PHP_VERSION은 설치된 PHP 버전(예: 8.1 등)을 의미합니다.

2. 프로세스 개수 제한 설정 (www.conf 수정)

www.conf 파일을 열고, pm 관련 설정을 조정합니다.

(1) Static 방식

프로세스 개수를 고정하려면 pm 값을 static으로 설정하고, pm.max_children을 원하는 값으로 지정합니다.

pm.max_children = 10
  • static 방식은 항상 pm.max_children 개수만큼 프로세스를 유지합니다.
    트래픽이 일정하고 고정된 워커 개수가 필요한 경우 사용합니다.

(2) Dynamic 방식 (기본값)

기본적으로 php-fpm은 dynamic 모드를 사용하며, 다음 설정을 조정하면 됩니다.

pm = dynamic
pm.max_children = 50 ; 최대 프로세스 개수 (최대 동시 요청 처리 가능 개수)
pm.start_servers = 5 ; 초기 시작 프로세스 개수
pm.min_spare_servers = 5 ; 최소 대기 프로세스 개수
pm.max_spare_servers = 10 ; 최대 대기 프로세스 개수
  • dynamic 방식은 트래픽에 따라 프로세스를 자동으로 조절합니다.
  • 트래픽이 변동이 있는 경우 적절한 값으로 조정해야 합니다.

(3) Ondemand 방식

요청이 있을 때만 프로세스를 생성하고, 일정 시간 동안 요청이 없으면 종료합니다.

pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s
  • 트래픽이 들쑥날쑥하거나 메모리 절약이 필요한 경우 유용합니다.
  • 하지만 빈번한 프로세스 생성/종료로 인해 성능이 저하될 수도 있습니다.

3. 설정 적용 및 재시작

설정을 변경한 후 php-fpm을 다시 시작해야 합니다.

# Debian/Ubuntu
sudo systemctl restart php{PHP_VERSION}-fpm
# CentOS/RHEL/AWS Linux
sudo systemctl restart php-fpm

설정이 제대로 적용되었는지 확인하려면 다음 명령어를 사용할 수 있습니다.

shps aux | grep php-fpm 또는  systemctl status로 확인
sudo systemctl status php-fpm

4. 성능 튜닝 팁

  • pm.max_children 값은 서버의 메모리 및 CPU 성능에 맞춰 조정해야 합니다.
  • 일반적으로 pm.max_children = (총 메모리 / PHP 프로세스당 메모리 사용량) 정도로 설정하는 것이 좋습니다.
  • 메모리 사용량을 확인하려면 top, htop, ps aux –sort=-%mem | grep php-fpm 등을 활용할 수 있습니다.

메모리가 부족한 서버에서는 Ondemand 방식을 추천합니다.
필요한 환경에 맞춰 적절한 설정을 적용하면 됩니다! 😊

5. PHP-FPM 프로세스 개수 제한을 통한 서버 성능 향상

  • pm.max_children을 서버 메모리와 프로세스 개수에 맞게 설정
  • 트래픽이 높은 서버 → dynamic, 트래픽이 낮은 서버 → ondemand 사용
  • 실시간 모니터링을 통해 최적의 프로세스 개수를 유지

PHP-FPM의 적절한 설정을 통해 서버 부하를 줄이고, 응답 속도를 높일 수 있습니다! 🚀

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!