Ssl

haproxy + stunnel + keep-alive?

  • September 16, 2012

我想把 stunnel 放在 haproxy 1.4 前面來處理 HTTPS 流量。我還需要 stunnel 來添加X-Forwarded-For標頭。這可以通過 haproxy 網站上的“stunnel-4.xx-xforwarded-for.diff”更新檔 來實現。

但是,描述中提到:

請注意,此更新檔不適用於 keep-alive,…

我的問題是:這在實踐中對我意味著什麼?我不確定,

  1. 如果這是關於保持活動狀態
  • 客戶和通道
  • stunnel 和 haproxy
  • 還是 haproxy 和後端伺服器?
  1. 這對性能意味著什麼:如果我在網頁上有 100 個圖示,瀏覽器是否必須協商 100 個完整的 SSL 連接,還是可以重新使用 SSL 連接,只創建新的 TCP 連接?

這是關於 HTTP keep-alive,它允許多個資源請求通過單個 TCP 會話(並且,對於 SSL,單個 SSL 會話)。這對 SSL 站點的性能非常重要,因為如果沒有 keep-alive,每個請求的資源都需要 SSL 握手。

所以,這裡的問題是從客戶端一直到後端伺服器的一個大的保持活動會話。這對性能很重要,對於現代 HTTP 伺服器來說是理所當然的事情,但是這個更新檔說它不支持它。讓我們看看為什麼..


一個keep-alive會話只是一個接一個的請求——一旦伺服器完成對一個請求的響應,伺服器就不會發送FIN數據包來結束TCP會話;客戶端可以簡單地發送另一批標頭。

要了解該更新檔在做什麼,這裡有一個保持活動對話的範例:

客戶:

GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...

伺服器:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>

這是非保持活動連接停止的地方。但是,keep-alive 允許客戶端觸發另一個:

GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...

對於代理中的客戶端 ID,一些反向代理可以X-Forwarded-For在每個客戶端請求的標頭中添加。這會告訴上游伺服器請求來自哪裡(而不是從反向代理的 IP 發起的每個請求),以確保日誌記錄和其他應用程序需求的完整性。

需要將X-Forwarded-For標頭注入到通過保活連接發送的每個客戶端資源請求中,因為每次都會發送完整的標頭;處理X-Forwarded-For標頭並將其轉換為“真實”請求 IP 是基於每個請求而不是每個 TCP-keep-alive-session 完成的。嘿,也許有一些很棒的反向代理軟體,它使用單個保持活動會話來服務來自多個客戶端的請求。

這就是這個更新檔失敗的地方。


該站點上的更新檔監視 TCP 會話的緩衝區以查找流中第一組 HTTP 標頭的結尾,並在第一組標頭結束後將新標頭注入流中。完成此操作後,它認為X-Forwarded-For工作已完成,並停止掃描新標題集的末尾。此方法不知道通過後續請求進入的所有未來標頭。

真的不能怪他們;stunnel 並不是真正為處理和翻譯其流的內容而建構的。

這將對您的系統產生的影響是保持活動流的第一個X-Forwarded-For請求將正確注入標頭,並且所有後續請求都可以正常工作 - 但它們不會有標頭。

除非有另一個標頭注入更新檔可以處理每個連接的多個客戶端請求(或者在 Stack Overflow 上的朋友的幫助下對這個更新檔進行調整),否則您可能需要查看 SSL 終止的其他選項。

引用自:https://serverfault.com/questions/301221