Мы запускаем веб-сайт на AWS с определенной настройкой: ELB разделяет нагрузку на 2 экземпляра t2.medium, на которых запущен nginx. Оттуда трафик PHP разделяется на 2 потока (внешний интерфейс и API), как для внутренних ELB, выходящих на наши серверы PHP. Для справки, у нас есть 2 внешних сервера PHP (t2.medium) и 3 сервера API PHP (m4.large). Все они используют одну и ту же версию PHP-FPM на порту 9000.
Все работало отлично еще несколько дней назад. По какой-то причине, которую еще предстоит определить, трафик на серверах PHP API просто умирает, и только перезапуск nginx возвращает его к жизни.
Мы предполагаем, что у нас может быть какой-то длительный процесс, из-за которого один из серверов PHP становится занят, и оттуда все идет под откос. Однако загрузка ЦП на всех серверах PHP довольно постоянна, пока они не перестанут отвечать. PHP-FPM все еще работает, и нагрузка на серверы ngnix все еще очень низкая.
От клиентов получено 504 ответа, и вот что я вижу в журнале ошибок nginx:
04.10.2016 14:34:25 [ошибка] 17661 # 0: * 2309784 connect () не удалось (113: нет маршрута к хосту) при подключении к восходящему потоку, клиент: xxx.xxx.xxx.xxx, сервер : api.mywebsite.com, запрос: «GET / some / route HTTP / 1.1», восходящий поток: «fastcgi: // internalip: 9000», хост: «api.mywebsite.com»
nginx.conf
worker_processes 4;
worker_connections 19000;
nginx site conf
location ~ \.php$ {
try_files $uri =404;
fastcgi_buffer_size 512k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 1024k;
include fastcgi_params;
fastcgi_pass route53-php:9000;
fastcgi_index index.php;
fastcgi_param REQUEST_URI /api$request_uri;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
www.conf
listen = 9000
pm = dynamic
pm.max_children = 50
pm.start_servers = 25
pm.min_spare_servers = 25
pm.max_spare_servers = 25
pm.max_requests = 500
Поскольку настройка далеко не тривиальна, мне интересно, правильно ли настроен блок местоположения PHP. Это также может быть размер используемых серверов, но загрузка ЦП очень низкая.
Правильно, так что получается, что это обычная проблема, когда nginx разговаривает с AWS внутренней ELB. После еще немного погуглив, я нашел этот вопрос: Некоторые реверсные прокси-конфигураторы nginx перестают работать раз в день и добавление резольвера помогло - у меня уже 3 дня не было простоя.
Интересно также отметить, что в каждой найденной мною статье речь идет о proxy_pass, но и с fastcgi_pass, похоже, тоже неплохо работает.
Надеюсь, это кому-нибудь поможет в той же ситуации!