Nginx + PHP-FPM иногда возвращает 502 - PullRequest
0 голосов
/ 15 октября 2018

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

На одном из наших сайтов мы недавно начали случайно получать 502 ошибки.Это происходит довольно регулярно, по крайней мере, десяток раз в день (как сообщают nagios, а иногда и наши пользователи).Я не в курсе каких-либо изменений конфигурации.Веб-стек является стандартным - сервер nginx передает запросы php-fpm, который запускает приложение на основе wordpress.


Журнал ошибок nginx содержит много сообщений, подобных этому:

[error] 31180#31180: *451395 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: x.x.x.x, server: x.x, request: "GET /x/x/ HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "x.x.x"

Большинство из них приходят с IP-адреса клиента, который является IP-адресом самого сервера (не уверен, почему, может быть, какой-то мониторинг?), Но также есть ошибки от случайных общедоступных IP-адресов.

PHP-Журнал FPM выдает подобные предупреждения примерно каждый час:

WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 71 total children
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 75 total children
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 79 total children
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 83 total children
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 87 total children
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 91 total children
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 95 total children
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 99 total children
WARNING: [pool www] server reached pm.max_children setting (100), consider raising it

Вещи, которые я пробовал

Перезагрузка

Очевидно, но не помогло совсем.

Увеличение ресурсов PHP-FPM дочерних процессов

  • Увеличение доступной оперативной памяти, CPU не помогло.Диск не заполнен, иноды не используются полностью.
  • С увеличенными ресурсами я установил pm.max_children на 100. Первоначально было 40, и это было хорошо в течение многих лет работы.После просмотра журнала я попытался увеличить его до 75, а затем до 100.
  • На другом веб-сайте, в котором в несколько раз больше посетителей, меньше оборудования и он работает просто отлично.Этот веб-сайт не обслуживает какой-либо сложный контент, в основном, только блоги.
  • Для завершения конфигурация FPM выглядит следующим образом:

    pm.max_children = 100
    pm.start_servers = 24
    pm.min_spare_servers = 4
    pm.max_spare_servers = 64
    pm.max_requests = 500
    
  • Тамв журналах также нет упоминаний о запуске OOM.

Исследование opcache

  • Я прочитал, что из-за нехватки памяти в opcache может быть виновник.Увы, у него есть запасная память:

    Cache hits  89757614
    Cache misses    1174
    Used memory 58333696
    Free memory 75884032
    Wasted memory   0
    OOM restarts    0
    

Тайм-ауты Nginx

  • Параметры Nginx не должны быть проблемой, так как буфер и тайм-аутзначения кажутся довольно щедрыми (я предполагаю, что единица измерения - 3000 секунд):

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    

Другая информация

  • PHP-FPM не падает,в его логах ничего нет, кроме предупреждений о потомках
  • xdebug отключен
  • syslog, dmesg не содержит соответствующих сообщений
  • php7.0, nginx 1.12.2

Могу ли я попробовать еще что-нибудь?


Ссылки на вещи, которые не работали

...