1

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

4

1 回答 1

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使用一个进程,该进程反过来创建线程来处理请求。
  • 在 UNIX 上,如果您使用的是操作系统附带的 Apache,那么不幸的是,您很有可能拥有prefork MPM Apache,它为每个请求创建一个进程,并且 max 参数不起作用:

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