負載均衡(Load Balancing)
範例
情境
如果只有一個廚師太慢,你請了三個廚師一起炸雞,Nginx 會幫你分配訂單給不同的廚師,確保每個廚師都能公平工作,客人也能更快拿到餐點。
如果只有一台伺服器,當請求很多時,它可能會「過勞」。 Nginx 可以讓多台伺服器分擔流量,這樣網站不會當掉。
假設你的網站有三台伺服器: server1:http://192.168.1.101:8080 server2:http://192.168.1.102:8080 server3:http://192.168.1.103:8080 你希望 Nginx 自動分配請求到不同的伺服器。
upstream backend_servers {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
server {
listen 80;
server_name mywebsite.com;
location / {
proxy_pass http://backend_servers;
}
}
結果
用戶開啟 http://mywebsite.com Nginx 自動選擇一台伺服器來處理請求 如果 server1 很忙,Nginx 會把下一個請求送到 server2 或 server3。
好處
網站更快、更穩定(請求不會全部擠在一台伺服器) 如果一台伺服器掛掉,Nginx 會自動切換到其他伺服器
請求中斷
情境
廚師 A(Server A)正在炸雞,炸到一半突然累了、不想炸了(請求中斷)。 客人(使用者)還在等雞排。 這時候,能不能換 廚師 B 或 廚師 C 來接手這份雞排?
答案
不能!請求中斷就無法接續,但可以重來! 如果請求執行到一半,伺服器掛掉了,請求會失敗,Nginx 不能讓別的伺服器「接手」,但可以設定自動重試
說明
Nginx 沒辦法讓另一個伺服器「接手」原本執行到一半的請求。 但可以讓客人重新點一次(讓用戶的程式自動重新發送請求)。 通常,這時候後端會搭配 「重試機制」(Retry),當偵測到請求失敗,會自動再發送一次,這次會換給其他健康的伺服器來處理。
這樣如果一台伺服器掛掉,Nginx 會自動重新發送請求到其他伺服器!某台伺服器沒開
情境
早上開店時,發現 廚師 A(Server A)沒來,但 廚師 B、C 都來了。 這時候,客人還會傻傻地排在 廚師 A 的櫃檯前等嗎? 還是會直接去找 廚師 B 或 C?
答案
Nginx 會自動偵測,然後把客人送去其他廚師! 如果某台伺服器開店沒來,Nginx 會自動檢測,然後不再把請求送過去,而是直接分配給其他伺服器
說明
Nginx 內建「健康檢查」機制,會定期測試伺服器是否還活著。 如果發現 Server A 持續沒回應,Nginx 會自動忽略它,把新請求轉給 B 和 C。
upstream backend_servers {
server 192.168.1.101:8080 max_fails=3 fail_timeout=10s;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
這樣 Nginx 會這樣運作:
-
每次請求前,先測試
192.168.1.101:8080是否還活著。 -
如果 連續 3 次失敗(max_fails=3),就當它掛了,10 秒內不再把請求送過去(fail_timeout=10s)。
-
這時候所有請求就會送去
192.168.1.102:8080或192.168.1.103:8080。
加權分配 (Weighted Load Balancing)
情境
依照熟練度分配 廚師 A 是老鳥,速度超快! 廚師 B、C 是新手,動作比較慢。 所以,老闆決定:讓 A 接 5 份單,B、C 各接 2 份。
upstream backend_servers {
server 192.168.1.101 weight=5; # 廚師 A 比較快,接 5 份
server 192.168.1.102 weight=2; # 廚師 B 比較慢,接 2 份
server 192.168.1.103 weight=2; # 廚師 C 也是 2 份
}
最少連線數 (Least Connections)
情境
依照忙碌度分配 廚師 A 目前有 5 份雞排在炸。 廚師 B 目前有 1 份雞排在炸。 廚師 C 目前有 0 份雞排在炸。 如果有新訂單進來,應該交給誰? 當然是廚師 C,因為他現在最空閒!
upstream backend_servers {
least_conn;
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
內容導向負載均衡
情境
分店策略 炸雞店除了賣 炸雞,還有賣 漢堡,老闆發現: 叫炸雞的客人,送去 「炸雞專門廚房」 叫漢堡的客人,送去 「漢堡專門廚房」
Nginx 可以根據「請求內容」來決定送去哪個伺服器,例如:
-
API 請求 (
/api/*) 送去後端 (backend.example.com) -
靜態圖片 (
/images/*) 送去 CDN (cdn.example.com)
location /api/ {
proxy_pass http://backend.example.com;
}
location /images/ {
proxy_pass http://cdn.example.com;
}