2011-12-22 54 views
14

我有兩臺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分鐘。

+0

「約5秒或10秒後TCP連接關閉」。爲此目的?客戶端還是服務器? – EJP 2011-12-23 03:21:27

+0

它被客戶關閉。 – 2011-12-23 16:56:41

+0

你知道,你描述的場景; 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

回答

6

我能夠使用HttpClient 3.1通過將Tomcat連接器中的keepAliveTimeout設置爲300000來使HTTP連接保持打開狀態5分鐘。我使用WireShark驗證了服務器將終止連接,而HttpClient只會等待。通過HttpClient的後續請求重用現有的TCP連接(避免進一步的SSL握手)。那裏的關鍵是有一個HttpClient實例(即不是每次都創建一個)。這可能對大多數人來說顯而易見,但我不確定HTTPClient的API機制是什麼。簡而言之,創建一個HttpClient實例併爲每個請求(POST,GET等)創建一個新的PostMethod,GetMethod等。這將導致TCP連接被重用。

1

Java API Http(s)UrlConnection根據following detailed explanation(仔細閱讀 - 每個細節都很重要)無縫地遵守Keep-Alive信息並管理每個服務器主機的連接池。

在這種情況下,您的代碼必須完全讀取緩衝區,關閉流並在IOException的情況下讀取錯誤。

當然HttpClient約束較少,但處理您的情況的最佳方式是使用其MultiThreadedHttpConnectionManager感謝following guidelines

4

在Tomcat中,我設法設置的標頭在我的HttpServelet使用HttpServletResponse.addHeader()這樣的:

response.addHeader("Connection", "Keep-Alive"); 
    response.addHeader("Keep-Alive", "timeout=60000"); 

我使用Wireshark確認這確實與HttpURLConnection類在客戶端工作。如果您沒有設置「連接」標題,則不起作用,因此您需要設置兩者。

+0

如果添加了Keep-Alive配置,則連接標頭應由tomcat自動設置。您正在複製tomcat的server.xml中的Keep-Alive以及您正在返回自定義Keep-Alive標頭的代碼。如果應用程序超時比tomcat長,或者tomcat本身決定關閉,則最壞的情況是非常有可能出現同步,最壞的情況是客戶端將會失敗。 – kisna 2015-07-24 19:31:14