Ssl

如何將 HAproxy 與 SSL 一起使用並獲取 X-Forwarded-For 標頭並告訴 PHP SSL 正在使用中?

  • September 30, 2014

我有以下設置:

(internet) ---> [  pfSense Box  ]    /-> [ Apache / PHP server ]
               [running HAproxy] --+--> [ Apache / PHP server ]
                                   +--> [ Apache / PHP server ]
                                    \-> [ Apache / PHP server ]

對於 HTTP 請求,這很好用,請求可以很好地分發到我的 Apache 伺服器。對於 SSL 請求,我讓 HAproxy 使用 TCP 負載平衡分發請求,但是它可以工作,因為 HAproxy 沒有充當代理,它沒有添加X-Forwarded-ForHTTP 標頭,並且 Apache / PHP 伺服器不知道客戶端的真實IP地址。

所以,我stunnel在HAproxy前面加了,讀到stunnel可以加X-Forwarded-ForHTTP頭。但是,我可以安裝到 pfSense 中的包沒有添加這個標題……而且,這顯然會扼殺我使用 KeepAlive requests 的能力,我真的很想保留它。但扼殺這個想法的最大問題是 stunnel 將 HTTPS 請求轉換為純 HTTP 請求,因此 PHP 不知道 SSL 已啟用並試圖重定向到 SSL 站點。

如何使用 HAproxy 在多個 SSL 伺服器之間進行負載平衡,讓這些伺服器既知道客戶端的 IP 地址知道 SSL 正在使用中?如果可能的話,我怎樣才能在我的 pfSense 伺服器上做到這一點?

還是我應該放棄所有這些而只使用 nginx?

你不需要全部放棄,你可以在 haproxy 前面使用 nginx 來支持 SSL,保留你所有的負載平衡配置。如果你不想的話,你甚至不需要為 HTTP 使用 nginx。Nginx 可以傳遞 X-Forwarded-For 和指示 SSL 正在使用的自定義標頭(如果需要,還可以傳遞客戶端證書資訊)。發送所需資訊的 Nginx 配置片段:

proxy_set_header SCHEME $scheme;      # http/https
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header CLIENT_CERT $ssl_client_raw_cert;

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