Я хочу использовать 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-запросах.