2010-07-29 48 views
1

我們有一個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正在試圖公平分配連接以防止持續的人捱餓其他人 - 但它不會這麼做,是吧?!

我只希望被告知我們在這裏做了一些愚蠢的事情!請告訴我,我是一個白癡,或至少近視...

+0

我建議你張貼此對serverfault.com以及一個更好的響應。 – JoseK 2010-07-31 06:04:38

+0

是的,我做到了。它有8個視圖,甚至沒有評論,去圖。 – 2010-08-03 16:27:03

回答

0

什麼是cat /proc/sys/net/ipv4/tcp_keepalive_time對Tomcat的價值?

它是否異常低?默認值是7200(即2小時)

+0

在兩臺服務器上都是7200。只是要清楚,它是關閉連接的apache服務器。連接之間的數據包之間的時間很短,所以我不認爲TCP保持活躍會起作用,它會關閉一個連接,它在毫秒之前就發送了一個數據包。 – 2010-07-30 21:18:33

0

MaxKeepAliveRequests 應爲-1不爲零上ec2.internal