Назад | Перейти на главную страницу

Время ожидания скриптов PHP истекает, но обычные страницы работают быстро

У меня странная проблема с 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