Nginx 503: limiting connections excess by zone — Настройка limit_conn
Веб-сервер отклоняет попытку установления новых параллельных соединений, отдавая клиенту статус 503 Service Temporarily Unavailable. В журнале error.log регистрируется: limiting connections, excess: 10 by zone "addr", client: 203.0.113.19, server: download.example.com.
| Директива | Объект ограничения | Эффект при срабатывании |
|---|---|---|
limit_conn_zone $binary_remote_addr | Число одновременных TCP/TLS сессий с 1 IP | Блокировка параллельных потоков одного клиента |
limit_conn_zone $server_name | Суммарные активные сессии на весь virtual host | Защита всего сайта от перегрузки пула соединений |
limit_conn_status | HTTP-код ответа при сбросе | По умолчанию 503 (рекомендуется 429) |
- Пользователи при использовании многопоточных менеджеров загрузки (IDM, wget в несколько потоков) получают ошибку 503 на части скачиваемых файлов.
- Браузеры при активной загрузке большого числа медиафайлов по HTTP/1.1 упираются в лимит одновременных соединений.
- Проверьте текущие лимиты соединений в блоках конфигурации Nginx:
grep -rn "limit_conn" /etc/nginx/ - Увеличьте допустимое количество одновременных соединений для пользователя в
nginx.conf:# В блоке http: задаем зону для учета соединений по IP limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; # В блоке server или location: location /downloads/ { # Увеличиваем лимит параллельных соединений (например, до 20): limit_conn conn_limit_per_ip 20; limit_conn_status 429; } - Если используется протокол HTTP/2 или HTTP/3, помните о мультиплексировании: все параллельные запросы браузера идут внутри одной TCP-сессии, поэтому лимит
limit_connсчитает их за 1 соединение только до момента открытия новых сокетов. - Настройте отдельное ограничение скорости скачивания на каждое соединение вместо грубого сброса соединений:
location /downloads/ { limit_conn conn_limit_per_ip 5; limit_rate 2m; # Ограничение 2 МБ/сек на каждое соединение } - Примените обновленную конфигурацию:
sudo nginx -s reload.
limit_conn только тогда, когда сервер уже прочитал все заголовки запроса и начал обработку. Для защиты от атак типа Slowloris используйте директивы client_header_timeout и client_body_timeout.Частые вопросы (FAQ)
В чем разница между limit_req и limit_conn?
limit_req ограничивает частоту поступления запросов в единицу времени (rate per second). limit_conn ограничивает количество одновременно открытых и обрабатываемых в данный момент соединений.
Как браузер реагирует на ошибку limit_conn?
Если веб-страница загружает 30 картинок параллельно по HTTP/1.1 при limit_conn 5, часть картинок вернет ошибку 503 и не отобразится на странице.
Считает ли limit_conn соединения в состоянии Keep-Alive?
Соединения в состоянии Keep-Alive (ожидающие новых запросов без активной передачи данных) не учитываются счетчиком активных соединений зоны limit_conn.
Как ограничить суммарное число подключений ко всему сайту?
Создайте зону limit_conn_zone $server_name zone=perserver:10m; и укажите limit_conn perserver 1000; внутри блока server.