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

Nginx перестает отправлять трафик на не отвечающие серверы php?

Мы запускаем веб-сайт на 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: 2016/10/04 14:34:25 [error] 17661#0: *2309784 connect() failed (113: No route to host) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: api.mywebsite.com, request: "GET /some/route HTTP/1.1", upstream: "fastcgi://internalip:9000", host: "api.mywebsite.com"

nginx.conf

worker_processes 4;
worker_connections 19000;

Конфигурация сайта nginx

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 обращается к внутреннему ELB AWS. Немного погуглив, я нашел этот вопрос: Некоторые конфиги обратного прокси nginx перестают работать раз в день и добавление резольвера помогло - у меня не было простоев уже 3 дня.

Также интересно отметить, что в каждой найденной мною статье говорится о proxy_pass но, похоже, он отлично работает с fastcgi_pass также.

Надеюсь, это поможет кому-то в такой же ситуации!