Назад | Перейти на главную страницу

Как ограничить TCP-соединения с nginx для HTTP / 2?

Я хочу использовать nginx в качестве интерфейса https и ищу способ ограничить TCP-соединения. Эти ограничения должны основываться на удаленных IP-адресах и работать для HTTP / 1.1 так же как HTTP 2.

Для HTTP / 1.1 Я думал, что мне хватит 15 одновременных подключений на IP (поскольку большинство браузеров, кажется, используют не более 6), чего должно быть более чем достаточно для HTTP / 2. Но документы nginx состояния:

В HTTP / 2 и SPDY каждый параллельный запрос считается отдельным соединением.

И HTTP / 2 спецификации заявляет о SETTINGS_MAX_CONCURRENT_STREAMS параметр:

Рекомендуется, чтобы это значение было не меньше 100, чтобы излишне не ограничивать параллелизм.

Означает ли это, что я должен разрешить не менее 100 подключений на удаленный IP-адрес? В моих тестах так кажется, но, возможно, я что-то упускаю. Поскольку эти швы по сути означают, что я не могу установить никаких значимый ограничения на количество одновременных TCP-соединений, без серьезных ограничений HTTP / 2.

Вот как я решил это сейчас:

map $http2 $v1ip {
    default "";
    ""  $binary_remote_addr;
}
map $http2 $v2ip {
    default $binary_remote_addr;
    "" "";
}

limit_conn_zone $v1ip zone=v1ips:10m;
limit_conn v1ips 10;

limit_conn_zone $v2ip zone=v2ips:10m;
limit_conn v2ips 125;

Поскольку ограничение на количество подключений для HTTP / 2 должно быть таким высоким, я также добавил ограничение скорости… но я все еще изменяю значения.

НОТА: хотя это позволяет установить "разумное" значение для соединений HTTP <2, оно по-прежнему требует - imo ненужного - большого количества одновременных соединений для соединений HTTP / 2. Я бы очень хотел увидеть limit_conn заботиться только о TCP-соединениях, а не о HTTP-запросах.