Apache:如何在Apache / mod_proxy中设置并发转发请求数的上限?

时间:2010-07-02 17:40:52

标签: apache tomcat mod-proxy

我有一个相当标准的设置,前端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)。

1 个答案:

答案 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

  • 在Windows上,你应该都很好,而且很可能不必担心这一点,因为winnt MPM使用一个进程来创建线程来处理请求。 / LI>
  • 在UNIX上,如果您使用的是操作系统附带的Apache,很遗憾,您很可能拥有prefork MPM Apache,每个请求创建一个进程,以及max参数不起作用:

    1. 要查看您拥有的MPM,请运行apachectl -l
    2. 在列表中,如果您看到worker.cevent.c,那么您几乎是好的:您现在只需要确保Apache只创建一个进程。为此,将ThreadsPerChildMaxClients设置为相同的值,这将是Apache将能够处理的并发连接总数。同时将ServerLimit设置为1。
    3. 在列表中,如果您看到prefork.c,则首先需要将Apache替换为工作者或事件MPM Apache。您可以通过自己重新编译Apache(MPM不是运行时配置参数)或为您的平台获取现有软件包来实现。然后,转到第二步。