Nginx

如何為 HTTP/2 限制與 nginx 的 TCP 連接?

  • June 22, 2021

我想使用 nginx 作為 https 前端,我正在尋找一種限制 TCP 連接的方法。這些限制應該基於遠端 IP 地址並且適用於HTTP/1.1HTTP 2

對於HTTP/1.1 ,我認為每個 IP 大約 15 個並發連接就可以了(因為大多數瀏覽器似乎最多使用 6 個),對於**HTTP/2來說應該綽綽有餘。但是nginx 文件指出:

在 HTTP/2 和 SPDY 中,每個並發請求都被視為一個單獨的連接。

HTTP/2 規範說明了該SETTINGS_MAX_CONCURRENT_STREAMS參數:

建議此值不小於 100,以免不必要地限制並行度。

這是否意味著我應該允許每個遠端 IP 至少有 100 個連接?在我的測試中似乎如此,但也許我遺漏了一些東西。因為這實際上意味著我不能對並發 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 請求。

引用自:https://serverfault.com/questions/873046