我們有一個Tomcat前端服務器,代理我們的Apache 2.2.11應用服務器,運行在64位Fedora 2.6.21.7 EC2 2xlarge實例(AKI aki-b51cf9dc)上。 Apache正在運行mod_perl並且沒有線程化。apache2忽略MaxKeepAliveRequests,任意關閉連接
我們試圖讓連接在另一個EC2實例上運行的Tomcat與Apache服務器之間持續很長一段時間,而不會持久來自外部客戶端的連接直接進入Apache服務器。我們的配置是這樣的:
Listen 80
NameVirtualHost *:80
# used for external clients
<VirtualHost *:80>
ServerName xxx.yyy.com
ServerAlias *.yyy.com
DocumentRoot "/var/www/html"
KeepAlive Off
</VirtualHost>
# used from tomcat server on local network
<VirtualHost *:80>
ServerName ip-<Apache-server-local-IP>.ec2.internal
KeepAlive On
KeepAliveTimeout 3600
MaxKeepAliveRequests 0
DocumentRoot "/var/www/html"
</VirtualHost>
TimeOut 60
MinSpareServers 20
MaxSpareServers 30
StartServers 20
MaxClients 60
GracefulShutdownTimeout 90
我們已經試過各種值的MaxKeepAliveRequests和KeepAliveTimeout的,而服務器絕對保持與Tomcat上同時連接,但它總是關閉它幾秒鐘之內,當只有幾十個請求被處理時。可能很重要,我從來沒有看到一個進程在使用mod_status進行觀察時在套接字上保持100個或更多的連接。
從來沒有任何與非Tomcat客戶端的持久連接,所以我們知道這裏存在一些差異,VirtualHost配置肯定在兩種情況下都被應用。
我應該提到來自Tomcat的請求都是POST,而其他請求是POST和GET的混合。
當我用tcpdump查看給定端口上的流量時,我可以清楚地看到許多正在處理的POST,然後在返回正確答覆(200,數據看起來很好)後的某個點,Apache服務器立即關閉連接,發送FIN到Tomcat。在最後一個和倒數第二個請求或回覆之間絕對沒有區別的情況下,如真實客戶端的IP等小數據,所以在處理請求時沒有指示服務器出現故障。當然,在錯誤日誌中沒有任何可疑的東西,httpd進程本身也不會死亡。
從netstat中我們可以看到與Tomcat服務器的連接保持打開狀態幾秒鐘,但在遠程端口範圍內快速循環,驗證我們在別處看到的內容。這幾乎就像Apache正在試圖公平分配連接以防止持續的人捱餓其他人 - 但它不會這麼做,是吧?!
我只希望被告知我們在這裏做了一些愚蠢的事情!請告訴我,我是一個白癡,或至少近視...
我建議你張貼此對serverfault.com以及一個更好的響應。 – JoseK 2010-07-31 06:04:38
是的,我做到了。它有8個視圖,甚至沒有評論,去圖。 – 2010-08-03 16:27:03