Apache-2.2

Tomcat over AJP 的 Apache 負載均衡器限制

  • January 23, 2017

我讓 Apache 在 3 個 Tomcat 伺服器前充當負載平衡器。有時,Apache 會返回 503 響應,我想將其完全刪除。就 CPU、記憶體或磁碟而言,所有 4 台伺服器都沒有承受很大的負載,所以我有點不確定是什麼達到了它的限製或為什麼。當所有工作人員都處於錯誤狀態時返回 503 - 不管這意味著什麼。以下是詳細資訊:

阿帕奇配置:

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

阿帕奇錯誤日誌:

[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資訊:

top - 23:44:11 up 210 天,4:32,1 個使用者,平均負載: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 天,3:07,1 個使用者,平均負載: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 個請求/秒的最大值。我相信伺服器可以處理比它們實際更多的負載,因此任何有關低預設限製或此設置將最大化的其他原因的提示將不勝感激。

這個問題的解決方案非常簡單:

添加到代理通行證:

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

添加到 Tomcats Server.xml:

連接器埠=“8009” 協議=“AJP/1.3” redirectPort=“8443 connectionTimeout=“60000”

在這些更改之後,一切都應該正常工作:-)

鑑於 Apache 日誌說明它無法連接到 Tomcat(從您的錯誤日誌中),它似乎是 Tomcat 應用程序無法跟上。

當我作為一個大型 Tomcat 網站的系統管理員工作時,我注意到了嚴重的性能限制,它們不歸結為 CPU,而是執行緒之間的同步問題或查詢後端 Web 服務的延遲。

後者是一個大問題,因為流行的 Java HTTP 介面預設將同時連接到另一個 Web 伺服器的數量限制為 2(當我發現這一點時,我的下巴掉了下來)。見http://hc.apache.org/httpclient-3.x/threading.html

您的網路應用程序是否呼叫任何其他網路服務?

引用自:https://serverfault.com/questions/126800