我有一个相当标准的设置,前端Apache服务器通过mod_proxy / AJP将请求转发给Tomcat。如何设置Apache / mod_proxy,以便它最多只能向Tomcat转发N个(比方说,N = 4个)并发请求?其他并发请求进入Apache不应该被拒绝,而应该排队等待以后发送到Tomcat。
PS 1:请注意,您可以在Tomcat级别使用maxThreads
属性执行此操作,但我更喜欢在Apache级别处理此问题。
PS 2:我看到Apache有一个MaxClients配置,似乎正在寻找我正在寻找的东西。但是我不清楚每个服务器mod_proxy的MaxClient是如何转发的,而不是每个Apache的MaxClient。即如果Apache转发请求到4个Tomcat机器的集群,我希望Apache将转发到任何给定Tomcat的并发请求数量限制为N(例如,N = 4)。
答案 0 :(得分:1)
通过向ProxyPass指令添加参数,解决方案是mod_proxy。你想要设置的可能是 max 。但是,这会立即引发错误,并且在您点击 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,很遗憾,您很可能拥有prefork MPM Apache,每个请求创建一个进程,以及max参数不起作用:
apachectl -l
。worker.c
或event.c
,那么您几乎是好的:您现在只需要确保Apache只创建一个进程。为此,将ThreadsPerChild
和MaxClients
设置为相同的值,这将是Apache将能够处理的并发连接总数。同时将ServerLimit
设置为1。prefork.c
,则首先需要将Apache替换为工作者或事件MPM Apache。您可以通过自己重新编译Apache(MPM不是运行时配置参数)或为您的平台获取现有软件包来实现。然后,转到第二步。