nginx proxy_cache:限制对后端的并行请求

nginx proxy_cache:限制对后端的并行请求

我使用 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 好得多。

相关内容