我使用 nginx 作为后端的反向代理。配置非常简单,例如核心只是:
upstream myservice {
server 127.0.0.1:80;
server 123.123.123.123:80;
}
location / {
proxy_pass http://myservice;
proxy_set_header Host myservice;
}
现在我的服务计算量非常大,我希望 nginx 将对单个上游后端的活动并行(同时)请求数限制为例如 10 个。
我调查了限制请求数模块,但该模块似乎只关注每分钟的传入请求。我特别想限制积极的后端连接;即考虑请求是否已经返回。这可能吗?
在 Varnish 中可以使用例如
backend cpu1 {
.host = "127.0.0.1";
.port = "80";
.max_connections = 20;
}
然而我需要为此使用 nginx。
答案1
看看limit_conn模块。虽然我发现的所有示例都是通过远程 IP 进行限制的,但是如果您将常量而不是远程 IP 传递给 limit_conn_zone,那么您将受到与服务器的总连接数的限制。
像这样:
upstream myservice {
server 127.0.0.1:80;
server 123.123.123.123:80;
}
set $const 1;
limit_conn_zone $const zone=one:1m;
location / {
limit_conn one 10;
proxy_pass http://myservice;
proxy_set_header Host myservice;
}
编辑:似乎只有较新版本的 nginx(可能 >=v1.1.8)才有此模块。如果您想使用此选项并且拥有较旧版本的 nginx,则可能需要从源代码进行编译。
编辑2:如果你的 nginx 只做代理任务,请查看worker_connections
答案2
我认为您需要的配置选项是:
proxy_cache_use_stale updating;
proxy_cache_lock on;
这样可以从缓存中获取过期元素,并从后端发出更新。因此,当您的后端服务器在 2 秒后处理页面时,客户端已经从缓存中获取了旧资源。
第二个从缓存中锁定一个元素,而对后端的更新缓存请求已经在运行,因此对一个缓存项没有并行请求。
这应该比硬代理限制好得多。
如果您仍希望对连接进行硬代理限制,您可以在后端运行 nginx 并在那里限制连接或请求的速率。否则,您可能想尝试使用 iptables 进行连接限制,其性能应该比 nginx 好得多。