limit_conn
Тема дорожной карты · Nginx
Директива limit_conn в Nginx ограничивает максимальное число одновременных соединений с одного ключа — как правило, IP-адреса клиента — защищая веб-сервер и вышестоящие бэкенды от атак с исчерпанием соединений и неконтролируемых клиентов. Ограничение соединений требует двух шагов: сначала объявите зону разделяемой памяти через limit_conn_zone $binary_remote_addr zone=conn_limit:10m; в блоке http, затем примените её директивой limit_conn conn_limit 20; внутри блока server или location, ограничивая каждый IP-адрес клиента 20 одновременными соединениями. При превышении лимита Nginx по умолчанию возвращает ответ 503 Service Unavailable; этот код можно изменить через limit_conn_status 429; для соответствия стандартным соглашениям ограничения скорости. Директива limit_conn_log_level warn; задаёт уровень серьёзности, на котором Nginx журналирует отклонённые соединения, что удобно для мониторинга злоупотреблений без переполнения журнала ошибок. limit_conn хорошо работает в связке с limit_req для комплексного ограничения скорости: limit_conn ограничивает одновременно открытые соединения, а limit_req ограничивает скорость запросов во времени, вместе обеспечивая многоуровневую DoS-защиту для обратного прокси или балансировщика нагрузки Nginx.
Как это работает
limit_conn использует модули limit_req и limit_conn. Определите зону (limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;) и примените (limit_req zone=mylimit burst=20 nodelay;). binary_remote_addr ключует по IP (мало места); используйте $http_x_forwarded_for за load balancer. limit_conn ограничивает конкурентные соединения. Комбинируйте с fail2ban для IP-blocking постоянных нарушителей; с WAF (ModSecurity, naxsi) для L7-атак.
Когда применять
Rate limit на login-эндпойнты с первого дня (5 req / 15 min на IP). Лимит общего трафика на IP против скрейпинга (100 req/s burst 200). Разные зоны на endpoint-паттерн (/api/expensive — 1 req/s; /api/cheap — 100 req/s). За load balancer всегда forwarded-for IP, никогда LB IP.
Типичные ошибки
Ловушки limit_conn: rate limit по source IP за CDN/load balancer, скрывающим реальный client IP (все упираются в лимит IP LB); burst слишком низкий (легитимные всплески упираются в лимит); не возвращают нормальный 429 с Retry-After (клиенты долбят эндпойнт); rate-limit аутентифицированных юзеров по IP, когда они делят офисный NAT.