Apache 负载平衡器限制与 Tomcat over AJP

Pet*_*kas 6 tomcat load-balancing mod-proxy-ajp mod-balancer apache-2.2

我让 Apache 在 3 个 Tomcat 服务器前充当负载平衡器。有时,Apache 会返回 503 响应,我想将其完全删除。所有 4 个服务器在 CPU、内存或磁盘方面都没有承受重大负载,所以我有点不确定是什么达到了它的限制或为什么。当所有工作人员都处于错误状态时,将返回 503s - 无论这意味着什么。以下是详细信息:

阿帕奇配置:

<IfModule mpm_prefork_module>
  StartServers           30
  MinSpareServers        30
  MaxSpareServers        60
  MaxClients            200
  MaxRequestsPerChild  1000
</IfModule>

...

<Proxy *>
  AddDefaultCharset Off
  Order deny,allow
  Allow from all
</Proxy>

# Tomcat HA cluster
<Proxy balancer://mycluster>
  BalancerMember ajp://10.176.201.9:8009 keepalive=On retry=1 timeout=1 ping=1
  BalancerMember ajp://10.176.201.10:8009 keepalive=On retry=1 timeout=1 ping=1
  BalancerMember ajp://10.176.219.168:8009 keepalive=On retry=1 timeout=1 ping=1
</Proxy>

# Passes thru track. or api.
ProxyPreserveHost On
ProxyStatus On

# Original tracker
ProxyPass /m  balancer://mycluster/m
ProxyPassReverse /m balancer://mycluster/m
Run Code Online (Sandbox Code Playgroud)

Tomcat配置:

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true"
          xmlValidation="false" xmlNamespaceAware="false">
    </Engine>
  </Service>
</Server>
Run Code Online (Sandbox Code Playgroud)

阿帕奇错误日志:

[Mon Mar 22 18:39:47 2010] [error] (70007)指定的超时已过期:代理:AJP:尝试连接到 10.176.201.10:8009 (10.176.201.10) 失败
[Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend 禁用 (10.176.201.10) 的工人
[Mon Mar 22 18:39:47 2010] [error] 代理:AJP:无法连接到后端:10.176.201.10
[Mon Mar 22 18:39:47 2010] [error] (70007)指定的超时已过期:代理:AJP:尝试连接到 10.176.201.9:8009 (10.176.201.9) 失败
[Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend 禁用 (10.176.201.9) 的工作器
[Mon Mar 22 18:39:47 2010] [error] 代理:AJP:无法连接到后端:10.176.201.9
[Mon Mar 22 18:39:47 2010] [error] (70007)指定的超时已过期:代理:AJP:尝试连接到 10.176.219.168:8009 (10.176.219.168) 失败
[Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend 为 (10.176.219.168) 禁用工作器
[Mon Mar 22 18:39:47 2010] [error] 代理:AJP:无法连接到后端:10.176.219.168
[Mon Mar 22 18:39:47 2010] [error] 代理:BALANCER: (balancer://mycluster)。所有工人都处于错误状态
[Mon Mar 22 18:39:47 2010] [error] 代理:BALANCER: (balancer://mycluster)。所有工人都处于错误状态
[Mon Mar 22 18:39:47 2010] [error] 代理:BALANCER: (balancer://mycluster)。所有工人都处于错误状态
[Mon Mar 22 18:39:47 2010] [error] 代理:BALANCER: (balancer://mycluster)。所有工人都处于错误状态
[Mon Mar 22 18:39:47 2010] [error] 代理:BALANCER: (balancer://mycluster)。所有工人都处于错误状态
[Mon Mar 22 18:39:47 2010] [error] 代理:BALANCER: (balancer://mycluster)。所有工人都处于错误状态

负载均衡器top信息:

top - 23:44:11 up 210 days, 4:32, 1 user, load average: 0.10, 0.11, 0.09
任务:总共 135 个,运行 2 个,睡眠 133 个,停止 0 个,僵尸 0 个
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.2%id, 0.1%wa, 0.0%hi, 0.1%si, 0.3%st
内存:总共 524508k,已使用 517132k,空闲 7376k,9124k 缓冲区
交换:总共 1048568k,已使用 352k,1048216k 免费,334720k 缓存

雄猫top信息:

top - 23:47:12 up 210 days, 3:07, 1 user, load average: 0.02, 0.04, 0.00
任务:总共 63 个,运行 1 个,睡眠 62 个,停止 0 个,僵尸 0 个
Cpu(s): 0.2%us, 0.0%sy, 0.0%ni, 99.8%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
内存:总共 2097372k,已使用 2080888k,16484k 空闲,21464k 缓冲区
交换:总共 4194296k,已使用 380k,4193916k 免费,1520912k 缓存

Catalina.out 中没有任何错误消息。

根据 Apache 的服务器状态,它似乎最大为 143 个请求/秒。我相信服务器可以处理比它们更多的负载,因此任何有关低默认限制或此设置将最大化的其他原因的提示将不胜感激。

小智 7

此问题的解决方案非常简单:

添加到代理通行证:

BalancerMember ajp://10.176.201.9:8009 keepalive=On ttl=60

添加到 Tomcats Server.xml:

连接器端口="8009" 协议="AJP/1.3" redirectPort="8443 connectionTimeout="60000"

在这些更改之后,一切都应该正常工作:-)