Всем известное сообщение об ошибке «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.).