База знаний по Open Source
Yandex поиск по всему сайту
Авторизация

Всем известное сообщение об ошибке «502 bad gateway». Причин может быть масса, здесь рассматривается одна из возможных: php7.2-fpm.sock failed (11: Resource temporarily unavailable).

При получении 502 ошибки иногда при открытии лога nginx мы видим строчки:

2018/12/06 21:37:58 [error] 11819#11819: *1 connect() to
unix:/run/php/php7.2-fpm.sock failed (11: Resource temporarily unavailable)

Это означает, что невозможно подключится к unix сокету unix:/run/php/php7.2-fpm.sock, так как этот ресурс временно недоступен. Происходит это потому, что либо превышено максимальное количество соединений к сокету либо превышено максимальное количество пакетов в очереди на обработку, если интерфейс получает пакеты быстрее, чем ядро может их обработать. И ресурс стал недоступен.

Эти параметры хранятся в файле /etc/sysctl.conf.

Проверяем лимиты, заданные системе в этом файле:

$ sysctl net.core

Вывод на эту команду достаточно большой, но находим строки (они берутся из файла /etc/sysctl.conf):

net.core.somaxconn = 128 
net.core.netdev_max_backlog = 200

Это значения по умолчанию для большинства web-серверов они очень малы. Из-за них и происходит ошибка, так как максимальное количество соединений равно 128 а максимальное количество пакетов в очереди на обработку равно 200.

Меняем лимиты — в файле /etc/sysctl.conf меняем значения этих строк:

net.core.somaxconn = 20000
net.core.netdev_max_backlog = 65535

Эти значения взяты из рекомендаций по настройке сетевых параметров для высоко-нагруженных серверов и в принципе их можно убавить, но то, что по умолчанию — это очень плохо.

Применяем параметры

$ sudo sysctl -p

а лучше всего перезагружаем сервер.

Если перезагрузить нельзя, то перезапускаем php-fpm:

$ sudo service php7.2-fpm restart

и web-сервер nginx:

$ sudo service nginx restart

Эта ошибка должна пропасть. Ну и попутно — существуют рекомендации для параметров php-fpm для высоко-нагруженных серверов:

php-fpm.conf

emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10
events.mechanism = epoll

Pool config (www.conf)

listen.backlog = -1
pm = dynamic
pm.max_children = 9
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 10000
request_slowlog_timeout = 5s
slowlog = /var/log/$pool.log.slow
request_terminate_timeout = 300s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Если вместо этой ошибки вылезла другая, то стоит попробовать поиграть с этими параметрами. Подробнее о параметрах php-fpm для высоко-нагруженных серверов можно почитать здесь (eng.).