이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 11218|회답: 4

PHP-FPM 매개변수 구성 및 튜닝

[링크 복사]
게시됨 2017. 7. 26. 오전 9:20:54 | | |
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 파일 디스크립터 열 수 제한을 추가했습니다





이전의:알리바바 클라우드 SLB 부하 분산 HTTP 건강 확인 실패 분석
다음:DZ x3.4 파일 검증 파일 누락
 집주인| 게시됨 2021. 11. 28. 오후 1:42:00 |
[연습] Nginx를 통해 php-fpm 상태 정보를 확인하세요
https://www.itsvse.com/thread-10180-1-1.html
 집주인| 게시됨 2021. 12. 19. 오전 10:48:43 |
 집주인| 게시됨 2022. 1. 16. 오후 3:26:55 |
[root@old_server conf]# cat /alidata/server/php/etc/php-fpm.conf | 그렙 max_spare_servers
;             pm.max_spare_servers - '대기 상태'에 있는 최대 자식 수
; 기본 값: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.max 예비 서버 = 35
[root@old_server conf]# cat /alidata/server/php/etc/php-fpm.conf | 그렙 min_spare_servers
;             pm.min_spare_servers - '아이들' 상태에 있는 최소 아동 수
; 기본 값: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.min_spare_servers = 5
[root@old_server conf]# cat /alidata/server/php/etc/php-fpm.conf | 그렙 start_servers
;             pm.start_servers - 창업 시 생성된 자녀 수.
pm.start_servers = 20
[root@old_server conf]# cat /alidata/server/php/etc/php-fpm.conf | 그렙 max_requests
pm.max_requests = 10240
[root@old_server conf]# cat /alidata/server/php/etc/php-fpm.conf | 그렙 request_slowlog_timeout
; 참고: request_slowlog_timeout 설정이 완료되면 슬로우로그는 필수입니다
; request_slowlog_timeout = 0
[root@old_server conf]# cat /alidata/server/php/etc/php-fpm.conf | 그렙 슬로우로그
; - '슬로우로그'
; 참고: request_slowlog_timeout 설정이 완료되면 슬로우로그는 필수입니다
Slowlog = /alidata/log/php/$pool.log.slow
; '슬로우로그' 파일에 덤프됩니다. '0' 값은 '오프'를 의미합니다.
; request_slowlog_timeout = 0
[root@old_server conf]# cat /alidata/server/php/etc/php-fpm.conf | 그렙 리미트
; 마스터 프로세스에 대해 열린 파일 디스크립터 rlimit을 설정하세요.
; rlimit_files = 1024
; 마스터 프로세스의 최대 코어 크기 제한을 설정하세요.
; rlimit_core = 0
; 오픈 파일 디스크립터 rlimit을 설정하세요.
; rlimit_files = 1024
; 최대 코어 크기 제한을 설정하세요.
; rlimit_core = 0
[root@old_server 대화] #
 집주인| 게시됨 2022. 1. 16. 오후 4:54:04 |
request_terminate_timeout = 10초

기본 값은 0초로, PHP 스크립트는 계속 실행됩니다. 이렇게 모든 php-cgi 프로세스가 한창일 때, Nginx+PHP 웹서버는 새로운 PHP 요청을 처리할 수 없게 되고, Nginx는 사용자에게 "502 불량 게이트웨이"를 반환합니다. request_terminate_timeout = 30
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com