Nginx 負載均衡代理混淆
我目前正在嘗試為一堆下載鏡像設置負載均衡器。在閱讀這個主題時,我看到 Nginx 非常適合作為負載均衡器,太棒了!但是當看到不同的配置時,我有點困惑。
可以決定重定向或代理到後端伺服器。重定向很清楚,你告訴客戶端去別的地方,請求被傳遞和處理,負載均衡器不在畫面中。
但是,如果您選擇使用代理,這是否基本上會削弱執行多個下載鏡像的整個想法?鑑於 nginx 會將請求轉發到後端伺服器,下載文件並將其傳遞給客戶端?
因此,視覺化我認為它是如何工作的(數據包流):
重定向:客戶端 => 負載均衡器 => 後端 => 客戶端
代理:客戶端 => 負載均衡器 => 後端 => 負載均衡器 => 客戶端
還是代理會做一些魔術並告訴客戶端實際連接到後端以下載他的文件?
如果代理確實有點違背了擁有多個下載鏡像以獲得更多吞吐量的目的,那麼重定向是唯一的選擇嗎?
編輯:或者我是否將代理的工作與重寫的工作混淆了?代理是否真的像重定向一樣傳遞請求,同時仍然使用相同的 URL?
如果您使用nginx作為負載均衡器,則流將是:
重定向:
Step 1 : Client => LB (HTTP request) Step 2 : LB => Client (HTTP reply) Step 3 : Client => Backend (HTTP request) Step 4 : Backend => Client (HTTP reply)
代理 :
Step 1 : Client => LB (HTTP request) Step 2 : LB => Backend (HTTP request) Step 3 : Backend => LB (HTTP reply) Step 4 : LB => Client (HTTP reply)
所以在第一種情況下,負載均衡器就像你認為的那樣,它是一個簡單的 HTTP 伺服器,後端直接回复客戶端。在第二種情況下,它通過 nginx 一直返回到客戶端。由於 nginx 不一定要等待完整的回復正文可用才能開始向客戶端傳輸數據,它使用緩衝區或臨時文件根據配置將其流回。但是,由於在實際數據傳輸過程中增加了一跳,您會遇到更高的數據包往返時間。
這就是在使用 HTTP 的情況下 OSI 第 7 層負載平衡的總體情況。現在,網路負載平衡不僅限於第 7 層和 HTTP。還有其他方法。
特別是,如果您正在尋找一種方法將流量分散到託管基本上靜態內容的後端伺服器,那麼您可以改為使用
keepalived
直接路由模式作為負載平衡解決方案,這將使後端伺服器直接回复客戶端,同時請求通過負載均衡器(它是 OSI 第 4 層,所以它不知道你在做什麼向上它只是安裝一個虛擬 IP 並將 TCP 流推送到實際伺服器,其中相同的虛擬 IP 安裝在環回介面上)。Keepalived 還使用 VRRP(主/備份模型)來處理 HA。如果您絕對想堅持使用 nginx,則有一些“類似”的東西稱為
stream
模組(出現在 nginx 1.9.0 中,不是“穩定”版本),但您需要自己重新編譯它,這不會阻止跳回即使在 OSI 第 4 層工作也是如此。