Tengine 2.0.3 + Tomcat 7.0.55 開啓健康檢查的注意事項

一個立刻要上線的無線項目須要使用軟負載,和開發同窗討論下來肯定用Tengine+Lua Module來作,前端Tengine 2.0.3,後端服務Tomcat 7.0.55。Tengine相關配置以下:前端

在開發機上搭環境時發現開啓健康檢查功能老是報錯:git


剛開始懷疑是否是當Tengine和後端服務部署在同一個機器上時,健康檢查不能正常工做,就在Tengine的github上建了一個issue詢問。詳見:https://github.com/alibaba/tengine/issues/518#issuecomment-57655581。不到2個小時就有一名開發同窗給了回覆,在節假日也響應的這麼快,真心贊 : )雖然響應速度很是給力,明確在同一臺機器上是能夠進行健康檢查的,可是並無給出在上述環境健康檢查失敗的緣由。還得繼續找問題。github

由於之前曾經使用Tengine 1.5搭建過相似的環境,並無出現這個問題,因此去Tengine官網上查看changelog,發現Tengine 2.0的確在健康檢查的處理上進行了修改,在健康檢查中使用了KeepAlive來下降系統的開銷。問題會不會出在這兒?後端

爲了能準確地排查這個問題,打算先繞開Tengine,直接使用curl向提供後端服務的Tomcat按四種形式發送HEAD請求:HTTP/1.0 不帶KeepAlive標籤、HTTP/1.0帶KeepAlive標籤、HTTP/1.1不帶KeepAlive標籤和HTTP/1.1帶KeepAlive標籤。執行的結果以下:服務器

1. HTTP/1.0 不帶KeepAlive標籤:curl

從上圖能夠看出,命令執行後,鏈接就會被當即切斷。url

2. HTTP/1.0帶KeepAlive標籤:
開發

從上圖能夠看出,服務器正常識別了KeepAlive標籤,並無切斷鏈接。部署

3. HTTP/1.1不帶KeepAlive標籤:get

4. HTTP1.1帶KeepAlive標籤:

因爲HTTP/1.1協議默認是認爲客戶端支持KeepAlive的,因此不管帶不帶KeepAlive標籤,服務器都會按照KeepAlive來處理。若是想在HTPP/1.1協議下關閉KeepAlive,須要在Header上加上「Connection: close」。

5. HTTP1.1帶close標籤:

能夠從上圖中看出,服務在發送完response後當即關閉了鏈接,而這時,客戶端還處於正在讀數據的狀態。

會不會是Tengine 2.0.3在處理KeepAlive的方式上和Tomcat7.0.55不兼容呢?因而將check_http_send的參數改成:

check_http_send "HEAD / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n";

一次經過!

下次有空了,須要查看一下Tengine的代碼,看看到底是什麼緣由致使HTTP/1.1下沒法正常工做的。

相關文章
相關標籤/搜索