2014-01-07 81 views
4

爲了說明這一點,我一直在試圖找到一個解決方案。以下只是提供了一些信息的最新鏈接,但其中沒有一個似乎有效。Apache Webserver,Tomcat,AJP,「所有工作人員都處於路由錯誤狀態」

https://serverfault.com/questions/19947/apachetomcat-having-problems-communicating-unclear-error-messages-bringing-do

Tomcat stops responding to Apache

儘管我在下面簡要說明我一直沒能防止錯誤,這正是如此在日誌中顯示許多配置變化:

[Tue Jan 07 14:56:12.158345 2014] [proxy_ajp:error] [pid 12094:tid 140002805655296] (70007)The timeout specified has expired: AH01030: ajp_ilink_receive() can't receive header 
[Tue Jan 07 14:56:12.158409 2014] [proxy_ajp:error] [pid 12094:tid 140002805655296] [client 10.4.65.146:58551] AH00992: ajp_read_header: ajp_ilink_receive failed, referer: http://xxxx/yyy/ 
[Tue Jan 07 14:56:12.158430 2014] [proxy_ajp:error] [pid 12094:tid 140002805655296] (70007)The timeout specified has expired: [client 10.4.65.146:58551] AH00878: read response failed from 10.4.3.33:8009 (tomcatworkerX), referer: http://xxxx/yyy/ 
[Tue Jan 07 14:56:12.229559 2014] [proxy_balancer:error] [pid 12094:tid 140002932012800] [client 10.4.230.138:57407] AH01167: balancer://lb: All workers are in error state for route (tomcatworkerX), referer: http://xxxx/yyy/zzz 

說下去的用戶請參閱「服務器不可用」屏幕,但連接在幾分鐘後恢復。然而,有時候相同的服務器連接會多次上/下;這可能是由於用戶行爲相同(我使用粘性會話),但我無法確認這一點。

我的配置是我有一個Apache Webserver實例運行在Windows環境中,通過AJP配置了4個Tomcat工作站。目前,所有Tomcat工作人員都在獨立主機上的Windows下託管。

我的方案中的所有主機都是健壯的生產環境中的VM,每個主機都有多個內核。

阿帕奇版本:

Server version: Apache/2.2.22 (Win32) 

Tomcat是7.0.29版

每個BalancerMember具有這些配置參數:

keepalive=On timeout=600 ttl=600 

目前使用本地連接器的每個Tomcat實例(org.apache .coyote.ajp.AjpAprProtocol)。

連接器的配置:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxThreads="450" connectionTimeout="600000" /> 

通過Oracle ojdbc15_g JDBC驅動程序本身連接到Oracle的應用,v11.2.0.3.0。

的事情,我已經觀察到:

  1. 它不會出現在Tomcat服務器是越來越有來自Apache的請求溢出。這來自對日誌活動的觀察,以及通過Apache Web服務器服務器狀態數據進行驗證,並通過jconsole通過線程活動進行支持。 (我從來沒有看到執行線程的數量增加,接近我設置的上限)。這是一個內部應用程序,服務大約400個用戶,其中大多數用戶不在同一時間;所以負載不應該是問題。
  2. 我似乎沒有任何線程死鎖問題......當使用jconsole遠程監視Tomcat實例時,我查看ajp-apr-8009-exec-#線程來確認這一點,並且大多數都處於等待狀態,而一些我可以看到積極處理。
  3. 我們有一些長時間運行的請求 - 有些時候,有時會超過上面列出的600s超時。這是我目前正在探索的一個領域;請求長度的原因通常是在非常大的數據存儲上進行聯合搜索,這隻需要花費一些時間,但通常會在幾秒鐘內返回。當需要更長的時間時,這通常是由於用戶的關鍵字搜索結構不完善導致Oracle在阻止結果時阻塞了相當長的一段時間。目前我正在重構它,以便它運行在與request/apr exec線程不同的線程中,並且如果執行時間超過280s(4分40秒),它將終止線程並向用戶返回錯誤;這樣我可以排除Tomcat花費太長時間來處理請求。

至於我現在正在嘗試解決的問題,我覺得我已經耗盡了配置能力(其中包括在線搜索每種可能的解決方案,因爲我是一個貿易軟件人員,而不是基礎設施)..所以我通過交換平臺嘗試了不同的方法:我在Linux機器上運行Apache Web服務器,並且使用DNS輪循機制,部分用戶通過Linux而不是Windows進行路由。這似乎沒有幫助,但Tomcat的工作人員仍然在同一個Windows機器上運行。

我目前也在Linux機器上獲得了Tomcat應用程序本身,並且當我擁有該穩定版本(由於假定有關Windows是該應用程序將承載的唯一平臺,所以需要進行少量代碼更改)我會將其作爲工作人員添加以查看該特定實例是否遇到相同的問題。

如果沒有別的,我想確認我對長執行請求的懷疑是正確的。我試過各種配置更改無濟於事。

+0

歡迎來到Stack Overflow。正如你提到的那樣,你的問題可以在服務器故障上收集更多的答案。祝你好運。 –

回答

0

的錯誤是在這裏的apache的error_log ...

我們有一個ELB與600在阿帕奇的面前超時... tomcat的設置爲600

我們的錯誤的超時是TEH網絡服務器超時

如果Apache不顯式地配置其超時是例如60秒

超時600在httpd.conf

apache web服務器和tomcat實例之間的超時可能會在長時間運行的會話中超時......例如長api調用。

相關問題