Nginx php-fpm пул блокируется и перестает отвечать

У меня есть некоторые проблемы с запросами на страницы, не получающие ответ после того, как запросы занимают много времени для обработки.

У меня есть настройка nginx для использования php-fpm. У меня есть два пула настройки в PHP-FPM. Один пул для общих запросов веб-страниц, один пул для обслуживания изображений и других больших файлов.

Из моего файла конфигурации php-fpm:

[www]
listen = var/run/php54/php-fpm-www.sock
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 20
pm.max_requests = 200


[www-images]

listen = var/run/php54/php-fpm-images.sock

pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 40

Nginx настроен на использование этих двух отдельных пулов, при этом запросы на изображения, хранящиеся в Amazon S3, проходят через пул "www-images" для изменения размера до требуемого размера. Из моего конфигурационного файла nginx:

location ~* ^/proxy  {
    try_files $uri @404;
    fastcgi_pass   unix:/opt/local/var/run/php54/php-fpm-images.sock;
    include       /opt/local/etc/nginx/fastcgi.conf;
}

location  / {
    try_files $uri /routing.php?$args;
    fastcgi_pass   unix:/opt/local/var/run/php54/php-fpm-www.sock;
    include       /opt/local/etc/nginx/fastcgi.conf;
}   

Поскольку я тестирую на ужасном интернет-соединении, эти запросы истекают в PHP, что ожидается.

2013/01/20 15:47:34 [ошибка] 77#0: *531 тайм-аут восходящего потока (60: тайм-аут операции) при чтении заголовка ответа из восходящего потока, клиент: 127.0.0.1, сервер: example.com, запрос: "GET /proxy/hugeimage.png HTTP/1.1", upstream: "fastcgi://unix:/opt/local/var/run/php54/php-fpm-images.sock:", хост: "example.com", реферер: " http://example.com/pictures"

Чего не ожидалось, и я хотел бы решить, что любые запросы, которые должны идти в пул 'www', имеют тайм-аут из-за того, что nginx не получает ответ от PHP-FPM.

2013/01/20 15:50:06 [ошибка] 77#0: *532 Тайм-аут восходящего потока (60: Тайм-аут операции) при чтении заголовка ответа из восходящего потока, клиент: 127.0.0.1, сервер: example.com, запрос: "GET /pictures HTTP/1.1", upstream: "fastcgi://unix:/opt/local/var/run/php54/php-fpm-www.sock:", хост: "example.com"

Через пару минут запросы к пулу www снова начинают работать, без каких-либо действий с моей стороны.

Я подумал, что использование отдельных пулов должно означать, что даже если один пул имеет проблемы с запросами, занимающими много времени, другой пул должен остаться неизменным.

Итак, мой вопрос: Как изолировать два пула, чтобы один пул был перегружен запросами, которые истекают по времени, и не влияют на другой пул.

Чтобы прояснить это, я намерен ограничить количество запросов, которые могут быть сделаны сразу через пул 'www-images'. Хотя на практике этот предел вряд ли когда-либо будет достигнут (из-за кэширования файлов, загруженных с S3 на сервер), если в необычной ситуации этот пул достигает своего предела, я хочу, чтобы пул www продолжал функционировать, поскольку где функциональность сайтов на самом деле сидит.

1 ответ

Решение

Я нашел две вещи:

  1. Добавить session_write_close(); к любым долго выполняющимся сценариям PHP, поскольку данные сеанса заблокированы, чтобы предотвратить одновременную запись, только один сценарий может работать с сеансом в любое время.
  2. Для любых изображений, которые могут загружаться медленно, убедитесь, что загружаете их из домена, отличного от того, с которого вы обслуживаете веб-страницы и вызовы Ajax, так как веб-браузеры будут ставить запросы в один и тот же домен, когда их число превышает несколько. запросы активны.

Хотя это две разные вещи, они имели тот же эффект, что и запросы к пулу 'www' блокировались запросами к пулу 'www-images'.

Другие вопросы по тегам