我有兩臺Tomcat服務器需要維護持久連接以減少SSL握手。一臺服務器(代理服務器)位於DMZ中,另一臺服務器安全地位於另一臺防火牆之後。代理基本上只運行一個簡單的servlet,在將請求轉發到安全機器之前進行一些理智的檢查。在進行真正的工作之前,首先要求機器交換證書。因此,我想用幾分鐘的超時時間保持持續連接。Tomcat,HTTP Keep-Alive和Java的HttpsUrlConnection
要與安全服務器交談,代理上的servlet使用HttpsUrlConnection
。我已經設置了WireShark,並且我注意到無論在安全機器上爲連接器設置了什麼值keepAliveTimeout
,TCP連接在大約5或10秒後都會關閉。這個數字似乎與我讀的是缺省超時以及Java如何處理HTTP Keep-Alive相匹配。這個link解釋說,如果服務器發送它,則Java將承認Keep-Alive
超時,否則它在關閉連接之前使用5秒(直接連接)或10秒(代理連接)。
我想弄清楚的是我該如何強制Tomcat發送Keep-Alive頭文件。不是,Connection: Keep-Alive
,但Keep-Alive: timeout=x
。
我已經嘗試過使用Apache HTTP服務器,並修改httpd.conf中的keepAliveTimeout
的確會導致Keep-Alive標頭更改其超時值。此外Java確實遵守這個超時。
UPDATE(11年12月23日):運行了幾個實驗我嘗試使用Apache的HttpClient的(3.1)煽動一些快速和骯髒的代碼,而不是HttpsUrlConnection
後。看起來,HttpClient在設置爲使用Keep-Alive時,只是等待服務器關閉連接。我不知道會等多久。我正在拍攝,以保持HTTP連接3到5分鐘。
「約5秒或10秒後TCP連接關閉」。爲此目的?客戶端還是服務器? – EJP 2011-12-23 03:21:27
它被客戶關閉。 – 2011-12-23 16:56:41
你知道,你描述的場景; DMZ中的WebServer向某些防火牆後面的AppServers轉發請求,通常使用DMZ中的Apache HTTPD處理https內容並使用AJP連接器將請求轉發到Tomcat AppServers(http://tomcat.apache.org/tomcat-4.0 -doc /配置/ ajp.html)。這是避免SSL開銷的另一種方法。 – 2011-12-29 23:16:49