У меня возникают проблемы с запросами страниц, которые не получают ответа после того, как обработка запросов занимает много времени.
У меня есть настройка 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", восходящий поток: "fastcgi: // unix: /opt/local/var/run/php54/php-fpm-images.sock:", host: "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», восходящий поток: «fastcgi: // unix: /opt/local/var/run/php54/php-fpm-www.sock:», хост: «example.com»
Через пару минут запросы к пулу www снова начинают работать, без каких-либо действий с моей стороны.
Я думал, что использование отдельных пулов должно означать, что даже если у одного пула есть проблемы с запросами, занимающими много времени, другой пул не будет затронут.
Итак, мой вопрос: как изолировать два пула, чтобы один пул был перегружен запросами, срок ожидания которых истек, не влиял на другой пул.
Чтобы прояснить, я намеренно хочу ограничить количество запросов, которые могут быть сделаны одновременно через пул www-images. Хотя на практике этот предел вряд ли когда-либо будет достигнут (из-за кеширования файлов, загруженных с S3 на сервер), если возникает необычная ситуация, когда этот пул достигает своего предела, я хочу, чтобы пул www продолжал функционировать, так как это где на самом деле находится функциональность сайтов.
Я обнаружил две вещи:
Хотя это две разные вещи, они имели тот же эффект, что запросы к пулу «www» блокировались запросами к пулу «www-images».