NGINX: PHP-FPM — включение PHP server-status

Автор: | 10/08/2014
 

nginx_logoПо аналогии с 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. Так что — очень полезная вещь.