php-fpm.conf 중요한 매개변수들이 자세히 설명되어 있습니다
PID = run/php-fpm.pid #pid设置 기본적으로 설치 디렉터리에서 var/run/php-fpm.pid를 활성화하는 것이 권장됩니다
error_log = 로그/php-fpm.log #错误日志 설치 디렉터리의 기본값은 var/log/php-fpm.log입니다
log_level = 공지 #错误级别. 사용 가능한 레벨은 경고, 오류, 경고, 알림, 디버그입니다. 기본 설정: 통지.
emergency_restart_threshold = 60 emergency_restart_interval = 60대 #는 SIGSEGV 또는 SIGBUS 오류가 있는 php-cgi 프로세스 수가 emergency_restart_interval 값 내에서 emergency_restart_threshold을 초과하면 php-fpm이 우아하게 재시작된다는 것을 나타냅니다. 이 두 가지 옵션은 일반적으로 기본값으로 남아 있습니다.
process_control_timeout = 0 #设置子进程接受主进程复用信号的超时时间. 사용 가능한 단위: s(초), m(분), h(시간), 또는 d(일) 기본 단위: s(초). 기본값: 0.
데모나이즈 = 예 #后台执行fpm 기본 값은 예이고, 디버깅을 원하면 '아니오'로 바꿀 수 있습니다. FPM에서는 여러 프로세스 풀을 실행하는 데 다양한 설정을 사용할 수 있습니다. 이 설정들은 각 프로세스 풀별로 개별적으로 설정할 수 있습니다.
listen = 127.0.0.1:9000 #fpm监听端口, 즉 nginx에서 PHP가 처리하는 주소가 일반적으로 기본값입니다. 사용 가능한 형식은 'ip:port', 'port', '/path/to/unix/socket'입니다. 각 프로세스 풀을 설정해야 합니다.
listen.backlog = -1 #backlog数, -1은 무제한을 의미하며, 운영체제에 의해 결정됩니다. 이 줄을 주석으로 빼면 됩니다. 참고문헌: http://www.3gyou.cc/?p=41
listen.allowed_clients = 127.0.0.1 #允许访问FastCGI进程的IP, 어떤 노드를 IP를 제한하지 않게 설정하세요. 다른 호스트들의 nginx를 이 FPM 프로세스에 접근하도록 설정하려면 듣기 비용을 감수하면서도 접근할 수 있는 IP 주소를 설정해야 합니다. 기본 값은 임의입니다. 각 주소는 쉼표로 구분되어 있습니다. 설정되어 있지 않거나 비어 있으면 어떤 서버든 연결을 요청할 수 있습니다
listen.owner = www listen.group = www listen.mode = 0666 소켓 설정 옵션#unix, TCP를 사용해 접근한다면 여기에 댓글을 달 수 있습니다.
사용자 = www 그룹 = www #启动进程的帐户和组
pm = 동적 #对于专用服务器, PM은 정적으로 설정할 수 있습니다. #如何控制子进程, 선택지는 정적이고 동적입니다. 정적 프로세스가 선택되면 pm.max_children이 정해진 수의 자식 프로세스를 지정합니다. 동적 선택이 가능하면 다음 매개변수에 의해 결정됩니다: pm.max_children #, 최대 자식 프로세스 수 pm.start_servers #, 시작 시 프로세스 수 pm.min_spare_servers #, 최소 유휴 프로세스 수를 보장하고, 유휴 프로세스가 이 값보다 적으면 새 자식 프로세스를 생성합니다 pm.max_spare_servers#, 유휴 프로세스의 최대 수를 확인하세요. 유휴 프로세스가 이 값보다 크면 정제됩니다
pm.max_requests = 1000 #设置每个子进程重生之前服务的请求数. 이는 메모리 누수가 있을 수 있는 서드파티 모듈에 매우 유용합니다. '0'으로 설정하면 요청이 항상 수락됩니다. PHP_FCGI_MAX_REQUESTS 환경 변수와 동등합니다. 기본값: 0.
pm.status_path = /상태 #FPM状态页面的网址. 설정이 없으면 상태 페이지에 접근할 수 없습니다. 기본값: 없음. 무닌 모니터링이 사용됩니다
ping.path = /ping #FPM监控页面的ping网址. 설정이 없으면 핑 페이지에 접근할 수 없습니다. 이 페이지는 FPM이 살아 있고 요청에 응답할 수 있는지 외부에서 감지하는 데 사용됩니다. 반드시 슬래시(/)로 시작해야 한다는 점에 유의하세요.
핑.응답 = 퐁 #用于定义ping请求的返回相应. HTTP 200의 텍스트를 텍스트/일반 형식으로 반환합니다. 기본값: 퐁.
request_terminate_timeout = 0 #设置单个请求的超时中止时间. 이 옵션은 설정에서 'max_execution_time' php.ini 특별한 이유로 중단되지 않은 스크립트에 유용할 수 있습니다. '0'으로 설정하면 '꺼짐'을 의미합니다. 502 오류가 자주 발생하면 이 옵션을 변경해 보세요.
request_slowlog_timeout = 10초 #当一个请求该设置的超时时间后, 해당 PHP 호출 스택 정보가 느린 로그에 기록됩니다. '0'으로 설정하면 '꺼짐'을 의미합니다
slowlog = log/$pool.log.slow #慢请求的记录日志, request_slowlog_timeout와 함께 사용하세요
rlimit_files = 1024 #设置文件打开描述符的rlimit限制. 기본 값: 기본 오픈 핸들은 1024이며, ulimit -n으로 볼 수 있고 ulimit -n 2048로 수정할 수 있습니다.
rlimit_core = 0 #设置核心rlimit最大限制值. 사용 가능한 값: '무한', 0 또는 양의 정수. 기본 값: 시스템 정의 값.
chroot = #启动时的Chroot目录. 정의된 디렉터리는 절대 경로여야 합니다. 설정이 없으면 chroot가 사용되지 않습니다.
chdir = #设置启动目录, Chdir가 시작될 때 자동으로 그 디렉터리로 전송됩니다. 정의된 디렉터리는 절대 경로여야 합니다. 기본값: 현재 디렉터리, 또는 /디렉터리 (chroot화 시)
catch_workers_output = 예 #重定向运行过程中的stdout和stderr到主要的错误日志文件中. 설정되지 않으면 stdout과 stderr가 FastCGI 규칙에 따라 /dev/null로 리디렉션됩니다. 기본값: Null.
PHP-FPM 매개변수 튜닝
pm = 동적 변수; 사용되는 공정 수량 관리 방법을 나타냅니다
동적 프로세스는 PHP-FPM 프로세스 수가 동적이며, 수가 처음에 지정되어 pm.start_servers 있습니다. 요청이 많으면 자동으로 증가하여 유휴 프로세스 수가 pm.min_spare_servers 이하가 되지 않도록 하고, 프로세스 수가 많으면 초과 프로세스 수가 pm.max_spare_servers 이상이 되지 않도록 정리됩니다
정적이란 PHP-FPM의 프로세스 수가 정적이며, 프로세스 수는 항상 pm.max_children이 지정한 수이며 증가하거나 감소하지 않는다는 의미입니다
pm.max_children = 300; 정적 모드에서 활성화된 php-fpm 프로세스의 수입니다 pm.start_servers = 20; 동적 모드에서 시작하는 php-fpm 프로세스의 수 pm.min_spare_servers = 5; 동적 모드에서 최소 수의 php-fpm 프로세스 pm.max 예비 서버 = 35; 동적 모드에서 php-fpm 프로세스의 최대 수(php-fpm)
pm이 정적이라면, 매개변수 pm.max_children만 유효합니다. 시스템은 정해진 수의 php-fpm 프로세스를 엽니다
만약 PM이 동적이라면 pm.max_children 매개변수는 유효하지 않으며, 마지막 세 매개변수가 적용됩니다. 시스템은 php-fpm 실행 시작 시 php-fpm 프로세스를 pm.start_servers 시작하고, 시스템의 필요에 따라 pm.min_spare_servers와 pm.max_spare_servers 간 php-fpm 프로세스 수를 동적으로 조정합니다
그렇다면 우리 서버에서는 어떤 PM 방식을 선택하는 것이 더 좋을까요? 사실 Apache처럼 PHP 프로그램을 실행하면 실행 후 메모리 누수 문제가 생깁니다. 그래서 php-fpm 프로세스는 초반에 약 300만 메모리만 차지하고, 일정 시간 실행하면 2천-3천만 메모리로 올라갑니다.
8G 이상과 같은 대용량 메모리를 가진 서버의 경우, 추가 프로세스 제어가 필요 없고 효율성을 높이기 때문에 정적 max_children을 지정하는 것이 더 적합합니다. php-fpm 프로세스의 잦은 전환도 지연 시간을 초래하기 때문에, 메모리가 충분히 클 때 정적 효과를 켜는 것이 더 좋습니다. 메모리/30M에 따라 용량을 얻을 수도 있는데, 예를 들어 8GB 메모리를 100GB로 설정하면 php-fpm이 소비하는 메모리를 2G-3G로 제어할 수 있습니다. 메모리가 약간 작은(예: 1G) 경우, 정적 프로세스 수를 지정하는 것이 서버의 안정성에 더 유리합니다. 이로 인해 php-fpm은 충분한 메모리만 확보하고, 다른 애플리케이션에 소량의 메모리를 할당하여 시스템이 더 원활하게 작동하도록 합니다.
VPS처럼 256M 메모리를 가진 작은 메모리의 서버에서는 20M 메모리 용량으로 계산해도 10개의 php-cgi 프로세스가 2억 메모리를 소모하므로 시스템 충돌은 정상이어야 합니다. 따라서 php-fpm 프로세스 수를 조절하고, 다른 애플리케이션이 차지하는 메모리를 대략적으로 명확히 한 후, 정적인 작은 수로 지정해야 합니다. 이 경우 시스템이 더 안정적으로 유지됩니다. 또는 동적 방법을 사용하는데, 동적 방법은 중복 프로세스를 종료하고 일부 메모리를 회수하므로 메모리가 적은 서버나 VPS에서 사용하는 것이 권장됩니다. 구체적인 최대 금액은 메모리/20M을 기준으로 산정됩니다. 예를 들어, 512M VPS의 경우 pm.max_spare_servers 20으로 설정하는 것이 권장됩니다. pm.min_spare_servers에 관해서는 서버 부하에 따라 설정하는 것이 권장되며, 더 적절한 값은 5~10 사이입니다.
4G 메모리 서버에서 200 정도면 괜찮습니다(제 1G 테스트 머신에서는 64가 최고이며, 최적의 값을 얻기 위해 스트레스 테스트를 권장합니다).
pm.max_requests = 10240;
nginx php-fpm 설정 과정에서 가장 큰 문제는 내부 누수 문제입니다: 서버 부하가 크지 않지만 메모리 점유가 급격히 증가하여 메모리를 빠르게 소모하고 스왑 파티션도 점검하기 시작하며 시스템이 빠르게 끊깁니다! 실제로 공식 소개에 따르면 php-cgi는 메모리 누수가 없으며, php-cgi는 각 요청이 완료되면 메모리를 회수하지만 운영체제에 해제되지 않아 php-cgi가 많은 메모리를 차지하게 됩니다.
공식 해결책은 PHP_FCGI_MAX_REQUESTS 값을 낮추는 것입니다. php-fpm을 사용할 경우 해당 php-fpm.conf가 max_requests이고, 이는 스레드 재시작을 위한 요청 횟수를 의미합니다. 이 값을 적절히 낮춰야 하며, php-fpm이 자동으로 메모리를 확보하도록 해야 합니다. 인터넷에 있는 대부분의 51200 등이 아니라, 실제로 이와 관련된 다른 값도 있습니다max_ 여러분, 이것은 php-fpm 매번 구축되는 프로세스 수로, 실제 메모리 소비는 max_children*max_requests*가 됩니다. 이 데이터를 통해 메모리 사용량을 추정할 수 있어 스크립트를 작성할 필요가 없습니다.
request_terminate_timeout = 30;
최대 실행 시간, php.ini 설정 가능 (max_execution_time)
request_slowlog_timeout = 2; 느린 장목을 켜세요 슬로로그(Slowlog = 로그/$pool.log.느림); 느린 통나무 경로
rlimit_files = 1024; php-fpm 파일 디스크립터 열 수 제한을 추가했습니다
|