Nginx
如何為 HTTP/2 限制與 nginx 的 TCP 連接?
我想使用 nginx 作為 https 前端,我正在尋找一種限制 TCP 連接的方法。這些限制應該基於遠端 IP 地址並且適用於HTTP/1.1和HTTP 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 請求。