У меня странная проблема с nginx и PHP-FPM. У меня есть сервер, настроенный для загрузки загрузок для моего веб-сайта. Это не так уж и плохо, это всего лишь Celeron G530 и 4 ГБ ОЗУ, из-за этого я использую nginx из-за его низких накладных расходов. Сервер обычно передает данные со скоростью 30-40 Мбит / с постоянно, а порт - 100 Мбит / с.
Проблема в том, что когда я запрашиваю некоторые PHP-скрипты с сервера через HTTP, время ожидания запроса часто истекает. Я знаю, что ограничение по времени в nginx составляет 60 секунд, и я проверил через журналы, что он достигает этого времени и закрывает соединение.
у меня тоже есть Мунин выполняется на сервере для мониторинга, и хотя это все еще выполняется по протоколу HTTP, на том же сервере и в тех же условиях, это очень быстро и быстро, загрузка страницы занимает не более 150 мс.
В моей голове логично, что проблема заключается в PHP-FPM (насколько я знаю, Мунин использует Perl), но как я могу это проверить? Что я могу сделать, чтобы разобраться в проблеме и увидеть, каковы реальные узкие места?
Если это PHP-FPM, что я могу сделать, чтобы ускорить процесс? Он не занимает много ЦП или ОЗУ и настроен на использование сокетного соединения, а не TCP с nginx.
Спасибо за любую помощь.
когда я запрашиваю некоторые сценарии PHP с сервера через HTTP, запрос часто истекает
Это означает, что это происходит не для всех скриптов - а для затронутых скриптов это случается только в некоторых случаях - поэтому решение состоит в том, чтобы просто посмотреть, что отличается в то время, когда скрипты работают, по сравнению с тем, когда они не работают, и сравнить сценарии, которые работают, с теми, которые не работают. Также проверьте свои журналы.
(вы можете добавить мониторинг количества процессов php-fpm и HTTP-соединений к munin, если у вас его еще нет).
Вам следует добавить медленное ведение журнала в конфигурацию php-fpm:
request_slowlog_timeout = 10
slowlog = /var/log/php-fpm/slow.$pool.log
Это будет регистрировать все запросы, которые занимают больше 10 секунд, чтобы вы могли видеть, какие скрипты не работают мгновенно. Он дает полную трассировку стека того, где находится код в момент, когда был достигнут предел времени медленной регистрации.
Также вы можете настроить страницу статуса PHP-FPM. Добавьте это в конфигурацию пула PHP-FPM:
pm.status_path = /www-status
И передать запросы через nginx в PHP-FPM
location ~ ^/(www-status)$ {
include %mysite.root.directory%/conf/fastcgi.conf;
fastcgi_pass unix:%phpfpm.socket%/php-fpm-www.sock;
# or IP address
# fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
allow 127.0.0.1;
allow stats_collector.localdomain;
allow watchdog.localdomain;
deny all;
}
Затем переход на yoursite.com/www-status?full даст вам большую распечатку каждого процесса php-fpm, например:
pool: www
process manager: dynamic
start time: 18/Mar/2013:20:17:21 +1100
start since: 243
accepted conn: 3
listen queue: 0
max listen queue: 0
listen queue len: 0
idle processes: 3
active processes: 1
total processes: 4
max active processes: 1
max children reached: 0
slow requests: 0
************************
pid: 6233
state: Idle
start time: 18/Mar/2013:20:17:21 +1100
start since: 243
requests: 1
request duration: 631
request method: GET
request URI: /www-status
content length: 0
user: -
script: /documents/projects/intahwebz/intahwebz/basereality/www-status
last request cpu: 0.00
last request memory: 262144