Речь пойдет о комбинации 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 проводите заранее, само собой)
В качестве исходного материала использовал статью Eduard Yamaltdinov за что ему огромное спасибо.