我使用nginx作为我的后端的反向代理。 configuration是非常基本的,例如核心只是:
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。
我查看了limit_req模块,但是这个模块似乎只关注每分钟的传入请求。 我特别想限制活动后端连接的数量; 即如果请求已经返回或者不考虑。 这可能吗?
在清漆,这可以使用例如
backend cpu1 { .host = "127.0.0.1"; .port = "80"; .max_connections = 20; }
不过,我需要使用nginx这个。
看看limit_conn模块。 尽pipe我发现的所有示例都受到远程IP的限制,但是如果将常量传递给limit_conn_zone而不是远程IP,则您将受到与服务器的总连接限制。
像这样的东西:
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
我认为你需要的configuration选项是:
proxy_cache_use_stale updating; proxy_cache_lock on;
这从caching中提供过时的元素,并从后端发布更新。 所以当你的后端服务器在2秒钟之后服务器页面时,客户端已经从caching中获得了旧的资源。
第二个从caching中locking一个元素,而已经有一个到后端的更新caching请求正在运行,所以对于一个caching项目没有并行请求。
这应该是好得多的硬代理限制。
如果您仍然想要连接的硬代理限制,您可以在后端运行nginx,并在那里运行速率限制连接或请求。 否则,你可能想尝试iptables的连接限制,这应该比在nginx中执行得更好。