我让 Apache 充当 3 个 Tomcat 服务器前面的负载平衡器。有时,Apache 会返回 503 响应,我想完全删除它。所有 4 个服务器在 CPU、内存或磁盘方面都没有承受很大的负载,所以我有点不确定是什么达到了它的极限或原因。当所有工作程序都处于错误状态时,就会返回 503 - 无论这意味着什么。以下是详细信息:
Apache 配置:
<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
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>
Apache 错误日志:
[2010 年 3 月 22 日星期一 18:39:47] [错误](70007)指定的超时已过期:代理:AJP:尝试连接到 10.176.201.10:8009(10.176.201.10)失败 [2010 年 3 月 22 日星期一 18:39:47] [错误] ap_proxy_connect_backend 禁用 (10.176.201.10) 的工作程序 [2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:AJP:无法连接到后端:10.176.201.10 [2010 年 3 月 22 日星期一 18:39:47] [错误](70007)指定的超时已过期:代理:AJP:尝试连接到 10.176.201.9:8009(10.176.201.9)失败 [2010 年 3 月 22 日星期一 18:39:47] [错误] ap_proxy_connect_backend 禁用 (10.176.201.9) 的工作程序 [2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:AJP:无法连接到后端:10.176.201.9 [2010 年 3 月 22 日星期一 18:39:47] [错误](70007)指定的超时已过期:代理:AJP:尝试连接到 10.176.219.168:8009(10.176.219.168)失败 [2010 年 3 月 22 日星期一 18:39:47] [错误] ap_proxy_connect_backend 禁用 (10.176.219.168) 的工作程序 [2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:AJP:无法连接到后端:10.176.219.168 [2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态 [2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态 [2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态 [2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态 [2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态 [2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态
负载均衡器top
信息:
顶部 - 23:44:11 启动 210 天,4:32,1 个用户,平均负载:0.10、0.11、0.09 任务:共 135 个,其中 2 个正在运行,133 个正在休眠,0 个已停止,0 个僵尸 CPU: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
Tomcattop
信息:
顶部 - 23:47:12 启动 210 天,3:07,1 个用户,平均负载:0.02、0.04、0.00 任务:共 63 个,1 个正在运行,62 个正在休眠,0 个已停止,0 个僵尸 CPU: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 个请求/秒。我相信服务器可以处理比现在多得多的负载,因此,任何有关低默认限制或其他此设置将达到最大值的原因的提示都将不胜感激。
答案1
这个问题的解决方案非常简单:
添加到 Proxypass:
BalancerMember ajp://10.176.201.9:8009 keepalive=On生存时间=60
添加到 Tomcats Server.xml:
连接器端口=“8009”协议=“AJP/1.3”重定向端口=“8443连接超时=“60000”
经过这些改变后,一切都应该正常工作:-)
答案2
鉴于 Apache 日志表明它无法连接到 Tomcat(从您的错误日志来看),看起来似乎是 Tomcat 应用程序无法跟上。
当我担任大型 Tomcat 网站的系统管理员时,我注意到严重的性能限制,这不是由 CPU 引起的,而是由线程之间的同步问题或查询后端 Web 服务的延迟引起的。
后者是个大问题,因为流行的 Java HTTP 接口默认将同时连接到另一个 Web 服务器的数量限制为 2(当我发现这一点时,我大吃一惊)。参见http://hc.apache.org/httpclient-3.x/threading.html
您的网络应用是否调用任何其他网络服务?
答案3
答案4
伊斯兰党,
我没有在您粘贴的 Apache 日志中看到超时值。如果是 300,请尝试将其更改为 1200。我们遇到了同样的问题,将 Apache httpd.conf 文件中的超时从 300 更改为 1200 后问题就解决了。