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