我想使用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参数:
build议这个值不小于100,以免不必要地限制并行性。
这是否意味着我应该允许每个远程IP至less100个连接? 在我的testing中似乎是如此,但也许我错过了一些东西。 因为这个接缝本质上意味着我不能对并发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连接设置一个“明智的”值,但仍然需要HTTP / 2连接的并发连接数量很高的数量。 我非常希望看到limit_conn只关心TCP连接而不关心HTTP请求。