是否有 Linux HA 軟體負載平衡器為多個不相關的域名提供 HTTPS 但平衡到單個 Web 伺服器集群?
我有一個基於雲的(Amazon AWS、Rackspace 等)多租戶 SaaS 應用程序,我需要支持多個不相關租戶域的 HTTPS 通信。
作為一個說明性範例,假設我們的 SaaS 在以下位置可用:
https://foo.com
租戶可以通過以下方式訪問其租戶特定的 UI 和服務端點:
https://tenantA.foo.com https://tenantB.foo.com ...
這在今天很容易通過一個萬用字元 SSL 證書來支持。
但是,對於我們的 SaaS,我們的租戶可能希望直接向他們自己的使用者公開我們的 UI(但為他們打上品牌)。
這會導致一個問題:假設 John Smith 是
tenantA
(並且不知道foo.com
)的現有客戶。如果將 John Smith 定向到https://tenantA.foo.com
,他們很容易感到困惑(例如,“foo.com 到底是誰?我為什麼在這裡?我被黑客入侵了嗎?啊!”)。為了避免這個問題,我們的租戶會設置一個子域,如:
https://foo.tenantA.com
這避免了很多最終使用者的困惑:
tenantA
的使用者可以看到他們認為擁有的 URL,tenantA
並且會更容易地使用該應用程序。但是tenantA
希望我們託管有關應用程序的所有內容,這意味著foo.com
的基礎架構需要為 SSL 連接提供服務。為此,我們希望支持以下內容:
- 一個租戶向我們上傳了一個 SSL 證書+密鑰
foo.tenantA.com
。- 我們採用該 SSL 證書並將其動態安裝到一個高度可用的負載平衡集群(2 個或更多 LB 節點)中,該集群對我們的 SaaS 應用程序 Web 端點的請求進行負載平衡。
- 租戶將其 DNS 更新為具有
foo.tenantA.com
CNAME 重定向到tenantA.foo.com
.這樣,我們的負載均衡器池將服務/終止所有 HTTPS 通信,
foo.tenantA.com
並且所有請求都負載均衡到我們的 SaaS Web 伺服器集群。這意味著 SSL 證書應該能夠在執行時從 LB 池中添加和刪除。更改不會中斷服務現有或新 HTTPS 請求的能力。
此外,由於我們將在 Linux 的虛擬化硬體(例如 EC2)上進行部署,因此我們無法訪問硬體/數據中心。這必須是可以在 Linux 中執行的基於軟體的解決方案。它還必須是高可用的(2 個或更多 LB ‘節點’)。
有誰知道具體的解決方案?例如,可以設置 Nginx、HAProxy 或 Squid(或其他任何東西)來支持這一點嗎?是否有記錄在案且合適的“配方”或現有解決方案?
PS Amazon 的 Elastic Load Balancer(在撰寫本文時)無法切實滿足這一需求 - 它需要為每個租戶域配備一個 Amazon ELB。由於每個 ELB 都需要“ping”Web 伺服器,如果您有 500 個租戶,那麼您將有 500 個 ELB ping SaaS Web 服務端點 - 對性能的負面影響不容忽視。
2017 年 9 月 13 日更新: SNI 現在在主流瀏覽器中已經變得足夠流行,它可能可以用來解決請求,這個答案應該被認為是過時的。
支持這一點的唯一方法是為您的每個客戶提供一個 IP。當您通過 https 連接時,連接會立即加密,瀏覽器沒有機會說“我在這裡是為了 foo.tenantA.com”。因此,伺服器知道應該使用哪個 SSL 證書來加密連接的唯一方法是基於連接進入的 IP。
現在這仍然是可能的,但這意味著您將需要很多 IP。我們實際上在我的工作中做了這個精確的設置。我們有 2 個主動/主動負載均衡器,其中一半 IP 在一個均衡器上,另一半在另一個均衡器上(總共大約 500 個 IP)。然後我們在後端有幾個 Web 伺服器來處理所有連接。任何 Web 伺服器都可能出現故障,負載均衡器將停止向其發送連接。或者負載均衡器本身可能會失敗,而另一個將佔用其所有 IP。
執行此操作的負載平衡軟體是Pacemaker和ldirectord(兩者都是主流項目,您執行的任何發行版都應該在其儲存庫中包含它們)。Linux 核心本身是真正執行負載平衡的核心,軟體只負責處理故障轉移。
注意:對於負載平衡,有很多 ldirectord 的替代品,例如keepalived和Surealived。儘管對於實際的負載平衡器故障轉移軟體,起搏器是您應該使用的。
基本指南: