[英]Apache: how to setup in Apache/mod_proxy an upper bound on the number of concurrent forwarded requests?
我有一个相当标准的设置,其中前端Apache服务器通过mod_proxy / AJP将请求转发到Tomcat。 如何设置Apache / mod_proxy,使其最多仅转发N个(例如N = 4)并发请求到Tomcat? 进入Apache的其他并发请求不应被拒绝,而应该排队等待稍后发送到Tomcat。
PS 1:请注意,您可以使用maxThreads
属性在Tomcat级别执行此操作,但是我更喜欢在Apache级别进行处理。
PS 2:我看到Apache具有MaxClients配置,这似乎可以满足我的需求。 但是我不清楚如何将每台服务器的MaxClient传递给mod_proxy,而不是每个Apache的MaxClient。 即,如果Apache将请求转发到4个Tomcat计算机的集群,我希望Apache将转发给任何给定Tomcat的并发请求数限制为N(例如,N = 4)。
通过向ProxyPass指令添加参数,解决方案是mod_proxy。 您想要设置的可能是max 。 但是,这将立即引发错误,并且在您达到最大值时不会将请求排队。
如果您确实要排队,则还必须使用mod_proxy_balancer。 例如,最多允许4个连接:
ProxyPass / balancer://appservers/ stickysession=JSESSIONID|jsessionid nofailover=On
<Proxy balancer://appservers>
BalancerMember ajp://192.168.0.100:8009 max=4
BalancerMember ajp://192.168.0.101:8009 max=4
BalancerMember ajp://192.168.0.102:8009 max=4
BalancerMember ajp://192.168.0.103:8009 max=4
</Proxy>
不幸的是,在Apache中, max
的值是每个进程的。 因此,仅当Apache有一个进程并使用线程而不是进程来处理多个连接时,才可以有效地限制与后端服务器的连接数,这取决于Apache使用的MPM :
在UNIX上 ,如果您使用的是操作系统随附的Apache,那么很可能您有预分支MPM Apache,它会为每个请求创建一个进程,并且max参数无法使用:
apachectl -l
。 worker.c
或event.c
,那么您几乎可以做到:现在只需要确保Apache仅创建一个进程即可。 为此,请将ThreadsPerChild
和MaxClients
设置为相同的值,这将是Apache能够处理的并发连接总数。 ServerLimit
设置为1。 prefork.c
,则首先需要用工作程序或事件MPM Apache替换Apache。 您可以自己重新编译Apache(MPM不是运行时配置参数),也可以为平台获取现有的软件包。 然后,转到第二步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.