limit_req режет частоту запросов в секунду, а limit_conn в nginx решает другую задачу — ограничивает, сколько соединений с одного ключа (обычно IP) может быть открыто одновременно. Это разные лимиты, и путать их не стоит: клиент может укладываться в лимит запросов в секунду и всё равно держать десятки параллельных закачек с одного адреса.
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
limit_conn addr 1;
}
}
}
Здесь на один IP разрешено одно одновременное соединение с /download/ — типичный кейс для раздачи файлов, где важно не количество запросов в секунду, а то, сколько параллельных закачек тянет один клиент. При превышении лимита nginx по умолчанию отвечает 503, код меняется через limit_conn_status.
Важный нюанс именно limit_conn: засчитывается только соединение, в котором уже обрабатывается запрос — простаивающее keepalive-соединение в счётчик не попадает. А ограничивать можно не только по IP: ключом зоны может быть $server_name, и тогда лимит общий на весь виртуальный хост, а не на клиента.
Отдельно стоит сочетание limit_conn с limit_rate — само по себе ограничение числа соединений не мешает клиенту открыть одно соединение и тянуть его на полной скорости канала:
location /download/ {
limit_conn addr 1;
limit_rate 50k;
}
Без limit_rate лимит на соединения просто не даёт обойти ограничение скорости параллельными закачками — сам по себе он скорость не режет.
#nginx #network #sysadmin
