我使用兩台伺服器來設定反向代理。
伺服器A透過以下設定將全部請求轉送到 test 伺服器群組(雖然群組只有1個)
listen 80;
root /home/www;
......
upstream test {
server 123.45.567.89:80 weight=1; // 服务器B
}
location / {
proxy_pass http://test;
}
透過瀏覽器存取伺服器A ,傳回了伺服器B裡的內容。
問題來了:
1.伺服器B(被反向代理的伺服器)看起來不需要任何設定?
2.只要被代理的伺服器沒有做一些屏蔽設置,是不是我就可以加入到 upstream 裡來做我的反向代理伺服器?
3.用反向代理來做負載平衡,那麼是不是伺服器B上的項目要跟伺服器A上的項目一致?
第1點:簡單來說被代理的物件是不需要什麼配置的,但是要注意的是如果你要在B上處理請求的來源IP,那麼需要對A上的nginx做一些配置,把源IP放到請求頭裡例如X-Real-IP:xxx.xxx.xx.xx 然後B那裡透過這個請求頭獲得真正的請求來源IP,否則你只能得到A的IP
第2點:upstream 沒用過,通常我用 proxy_pass
第3點:通常來說是的。
1 被代理伺服器B不需要什麼設定
2 在upstream 中加入多組伺服器也就是所謂的負載平衡配置。然後配置 proxy_pass
3 負載被均衡的伺服器理論上是資料共享,業務相同,只是分散式部署在不同的機器,以減輕伺服器壓力。 (樓主可以在同一台伺服器中將同一個業務以不同連接埠啟動多個服務,並配置負載平衡,驗證一下 do yourself!)
負載平衡策略目前有幾種方式
輪詢(預設): 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
weight: 指定輪詢幾率,weight和存取比率成正比,用於後端伺服器效能不均的情況。
ip_hash: 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
fair(第三方):按後端伺服器的回應時間來分配請求,回應時間短的優先分配。
url_hash(第三方):按存取url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。