Как настроить limit_conn_zone и limit_conn, чтобы один адрес не занимал все соединения сервера.
Чтобы один адрес не занимал все соединения сервера — например, агрессивный парсер или простая атака, — в nginx ограничивают число одновременных подключений с одного IP. Нужный модуль входит в обычную сборку nginx.
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_status 429;
server {
# ...
limit_conn perip 10;
}
}
limit_conn_zone— память для счётчиков, задаётся в блокеhttp. 10 МБ хватает больше чем на 100 тысяч адресов.limit_conn perip 10— не больше 10 одновременных подключений с адреса. Можно задать вhttp,serverилиlocation.limit_conn_status 429— код ответа сверх предела (по умолчанию 503).
Проверьте настройку и примените её без остановки сайта:
sudo nginx -t && sudo systemctl reload nginx
Не ставьте слишком маленький предел: браузер открывает к сайту несколько соединений сразу, а за одним адресом может работать целый офис. Ограничить частоту запросов, а не число соединений, можно модулем limit_req.
В старых инструкциях встречается директива limit_zone — её убрали из nginx в версии 1.7.6, вместо неё limit_conn_zone. Подробнее — в документации nginx.

