Как побороть ошибку Resource temporarily unavailable у nginx?

В дальнейшем используя интернет страницу cloudhosting.lv, вы соглашаетесь с правилами пользования Куки. Узнай больше. Согласен

Как побороть ошибку Resource temporarily unavailable у nginx?

Речь пойдет о комбинации nginx + php-fpm (на момент написания статьи версия php — 7.3)

Столкнулся с проблемой, что при небольшой нагрузке на сервер все сайты начинают резко выдавать 502 Bad Gateway

В логах можно наблюдать приблизительно такую картинку:

[error] 7460#7460: *5365312 connect() to unix:/run/php/php7.3-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream

Возникает эта ситуация из-за того, что операционная система отвергает попытки nginx подключиться к unix сокету. Причина либо превышено максимальное кол-во соединений к сокету либо максимальное кол-во не обработанных соединений к сокету.

Проверяем лимиты:

sysctl net.core

Нас интересуют строки:

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

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

Меняем лимиты, в файл /etc/sysctl.conf прописываем строки

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

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

sysctl -p

Перезапускаем php-fpm

/etc/init.d/php7.3-fpm restart

И с помощью утилиты loadem проводим тестирование своего сайта и получившейся конфигурации

./loadem -l 1 https://mysite.ru 200
URL: https://mysite.ru
Clients: 2000
Starting
MaTps    7.81, Tps    7.81, Err  0.00%, Resp Time  0.966
Completed 8 requests in 1.03 seconds
Total TPS: 7.74
Avg. Response time:  0.966
Max Response time:   1.064

Обращаем внимание на Err 0.00%. Оно должно теперь быть равно 0 (тестирование до изменений параметров sysctl проводите заранее, само собой)