По аналогии с Apache: включение server-status в связке NGINX+PHP-FPM тоже можно включить подробный вывод информации о выполняющихся скриптах PHP (для самого NGINX имеется другой модуль, в данном случае речь конкретно про PHP-FPM).
По-умолчанию он отключён, а пример и описание можно взять в файле /etc/php-fpm.d/www.conf
(CentOS) и настроить отдельно для каждого пула PHP-FPM.
; The URI to view the FPM status page. If this value is not set, no URI will be ; recognized as a status page. By default, the status page shows the following ; information: ; accepted conn - the number of request accepted by the pool; ; pool - the name of the pool; ; process manager - static or dynamic; ; idle processes - the number of idle processes; ; active processes - the number of active processes; ; total processes - the number of idle + active processes. ; The values of 'idle processes', 'active processes' and 'total processes' are ; updated each second. The value of 'accepted conn' is updated in real time. ; Example output: ; accepted conn: 12073 ; pool: www ; process manager: static ; idle processes: 35 ; active processes: 65 ; total processes: 100 ; By default the status page output is formatted as text/plain. Passing either ; 'html' or 'json' as a query string will return the corresponding output ; syntax. Example: ; http://www.foo.bar/status ; http://www.foo.bar/status?json ; http://www.foo.bar/status?html ; Note: The value must start with a leading slash (/). The value can be ; anything, but it may not be a good idea to use the .php extension or it ; may conflict with a real PHP file. ; Default Value: not set ;pm.status_path = /status
Копируем строку pm.status_path = /status
в файл пула, например – /etc/php-fpm.d/domain.ua.conf
(или раскомментриуем, если уже есть), и перезапускаем службу:
# service php-fpm restart Stopping php-fpm: [ OK ] Starting php-fpm: [ OK ]
Настраиваем NGINX, в котором добавляем:
location /status { auth_basic_user_file /var/www/vhosts/domain/.htpasswd; auth_basic "Password-protected Area"; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_pass 127.0.0.1:9003; }
Если используется сокет, вместо TCP-порта – тогда последняя строка:
fastcgi_pass unix:/var/lib/php/php-fpm.sock;
auth_basic
нужна, что бы не давать всем подряд открывать страницу статуса.
Проверяем файл конфигурации и перезапускаем NGINX;
# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
# service nginx restart Stopping nginx: [ OK ] Starting nginx: [ OK ]
После чего – переходим на страницу статуса, где видим информацию:
pool: domain.ua process manager: dynamic start time: 04/Oct/2014:22:39:10 +0300 start since: 235 accepted conn: 331 listen queue: 0 max listen queue: 0 listen queue len: 128 idle processes: 2 active processes: 1 total processes: 3 max active processes: 2 max children reached: 0
Тут:
pool
– имя пула;process manager
– тип Process Manager (pm - dynamic, static, ondemand
);start time
– время запуска FPM (FastCGI Process Manager);start since
– время в секундах с момента запуска;accepted conn
– количество обработанных пулом запросов;listen queue
– количество запросов в очереди на обработку этим пулом, если количество > 0 – надо подумать об увеличении количества процессов;max listen queue
– максимальное количество запросов, которые были в очереди с момента запуска пула;listen queue len
– количество запросов в очереди к сокету;idle processes
– количество процессов вidle
статусе;active processes
– количество активных процессов;total processes
– общее количество процессов (idle + active processes
);max active processes
– максимальное количество активных процессов с момента запуска пула;max children reached
– максимальное количество дочерних потоков PHP-FPM с момента запуска, если количество >0 – есть смысл подумать об увеличенииpm.max_children
;slow requests
– количество медленных запросов (должен быть включёнslowlog
).
По-умолчанию – status
возвращает страницу в plain-text
.
Что бы вызвать её в HTML – добавьте ?html
:
http://domain.ua/status?html
Или в Json:
http://domain.ua/status?json
Для удобства парсинга данных, например скриптом на Python:
{"pool":"domain.ua","process manager":"dynamic","start time":1412451550,"start since":1219,"accepted conn":1685,"listen queue":0,"max listen queue":1,"listen queue len":128,"idle processes":0,"active processes":2,"total processes":2,"max active processes":3,"max children reached":0}
Что бы вывести больше информации – добавьте ?full
:
http://domain.ua/status?full
pool: domain.ua process manager: dynamic start time: 04/Oct/2014:22:39:10 +0300 start since: 422 accepted conn: 591 listen queue: 0 max listen queue: 0 listen queue len: 128 idle processes: 0 active processes: 2 total processes: 2 max active processes: 2 max children reached: 0 ************************ pid: 8362 state: Running start time: 04/Oct/2014:22:45:26 +0300 start since: 46 requests: 33 request duration: 198 request method: GET request URI: /status?full content length: 0 user: setevoy script: - last request cpu: 0.00 last request memory: 0 ************************ pid: 8355 state: Running start time: 04/Oct/2014:22:45:20 +0300 start since: 52 requests: 34 request duration: 361036 request method: POST request URI: /wp-login.php content length: 21 user: - script: /var/www/vhosts/domain/domain.ua/wp-login.php last request cpu: 0.00 last request memory: 0
Так же можно вызвать ?xml
и комбинировать ?full
с разными типами, например – ?json&full.
Про настройку ProcessManager
можно почитать в статье NGINX: настройка сервера и PHP-FPM.
P.S. Очень вовремя начал писать этот пост: пока писал его и заглядывал в status
– заметил, что скрипт wp-login.php
постоянно висит в active
состоянии, и 100% CPU. Когда заглянул в логи – оказалось, что какой-то бот на него ломится. Забанил, LA упало с 0.5 до 0.01. Так что – очень полезная вещь.