1.3Nginx反向代理與負載均衡
Nginx反向代理與負載均衡
什麼是反向代理其與正向代理有什麼區別?
正向代理案例
Nginx的反向代理
小例子
代理相關引數
負載均衡
upstream 相關引數
權重
備份服務
max_fails和fail_timeout
負載均衡演算法
ip_hash
Nginx反向代理與負載均衡
參考:
什麼是反向代理其與正向代理有什麼區別?
參考:
正向代理:正向代理是指客戶端與目標伺服器之間增加一個代理伺服器,客戶端直接訪問代理伺服器,在由代理伺服器訪問目標伺服器並返回客戶端並返回。這個過程當中客戶端需要知道代理伺服器地址,並配置連線。如圖:
反向代理是指客戶端訪問目標伺服器,在目標服務內部有一個統一接入閘道器將請求轉發至後端真正處理的伺服器並返回結果。這個過程當中客戶端不需要知道代理伺服器地址,代理對客戶端而言是透明的。如圖:
正向代理與反向代理的區別:
正向代理 | 反向代理 |
---|---|
代理伺服器位置 | 客戶端與服務都能連線的們位置 |
主要作用 | 遮蔽客戶端IP、集中式快取、解決客戶端不能直連服務端的問題。 |
應用場景 | 爬蟲、翻牆、maven的nexus服務 |
正向代理案例
Nginx正向代理只需要配置 location 中配置proxy_pass 屬性即可。其指向代理的伺服器地址。正如我們上一篇文章配置的百度的代理:
這是一個經典的正向代理的例子。
Nginx的反向代理
小例子
首先啟動兩個應用,埠分別是8010和8020,訪問/hello:
然後我們在nginx中,首先反向代理一個地址:
server {
listen 80;
server_name www.demo.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
可以看到,監聽80埠,代理的是8010的埠地址,路徑是/hello。然後在配置一下本地
host:
192.168.168.129 www.demo.com
然後訪問可以看到反向代理成功:
可以看到正向代理和反向代理在配置上區別不大,主要區別是被代理的服務的位置,一個是遠端(百度),一個是區域網內部(本機8010)。
代理相關引數
proxy_pass # 代理服務
proxy_redirect off; # 是否允許重定向
proxy_set_header Host $host; # 傳 header 引數至後端服務
proxy_set_header X-Forwarded-For $remote_addr; # 設定request header 即客戶端IP 地址
proxy_connect_timeout 90; # 連線代理服務超時時間
proxy_send_timeout 90; # 請求傳送最大時間
proxy_read_timeout 90; # 讀取最大時間
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
反向代理還有一個用途就是在多個站點配置多個二級域名,比如百度的搜尋引擎是 www.baidu.com,百度圖片是 image.baidu.com,百度翻譯是 fanyi.baidu.com,可以看到,一級域名一樣,二級域名不同,代表了不同的系統。這種方式利用nginx的反向代理也可以實現,
server {
listen 80;
server_name test1.demo.com;
location / {
proxy_pass http://127.0.0.1:8010;
}
}
server {
listen 80;
server_name test2.demo.com;
location / {
proxy_pass http://127.0.0.1:8020;
}
}
host
192.168.168.129 test1.demo.com
192.168.168.129 test2.demo.com
可以看到,兩個不同的二級域名分別訪問兩個不同的埠地址,訪問效果如下:
這樣可以做到在一個伺服器上部署多個專案,分別使用有意義的二級域名。
負載均衡
通過proxy_pass
可以把請求代理至後端服務,但是為了實現更高的負載及效能, 我們的後端服務通常是多個, 這個是時候可以通過upstream
模組實現負載均衡。下面來配置一個upstream:
upstream wwwdemocom{
server 127.0.0.1:8010;
server 127.0.0.1:8020;
}
可以看到把兩個服務地址都定義到了一個upstream中,並起名為wwwdemocom,下面設定反向代理:
server {
listen 80;
server_name www.demo.com;
location / {
proxy_pass http://wwwdemocom;
}
}
反向代理的配置中,只配置upstream的名字即可,重新整理頁面,可以看到同一個地址,不停的分別訪問兩個專案:
這樣如果我們部署多個相同的系統,可以把所有的併發流量分到多個上面,從而達到提高併發的目的。
upstream 相關引數
service反向服務地址加埠
weight 權重
max_fails 失敗多少次認為主機已掛掉則,踢出
fail_timeout 踢出後重新探測時間
backup 備用服務
max_conns 允許最大連線數
權重
預設兩個系統切換著訪問,策略預設是輪訓的,也就是無論幾個系統都輪著迴圈訪問。如果想讓兩臺機器的訪問數量按照1比2分配,那麼可以設定權重:
upstream wwwdemocom{
server 127.0.0.1:8010 weight=1;
server 127.0.0.1:8020 weight=2;
}
重新整理頁面可以看到,8010訪問一次,緊接著8020訪問兩次,這種是按照權重分流,改變了原來預設的輪訓策略。這種適合機器效能有區別的情況。
備份服務
在伺服器上再啟動一個8030的服務
將此服務作為一個備份服務,有服務意外停止的時候,這個頂上去!
upstream wwwdemocom{
server 127.0.0.1:8010 weight=1;
server 127.0.0.1:8020 weight=2;
server 127.0.0.1:8030 backup;
}
重啟nginx,先重新整理頁面檢視效果,發現還是配置的8010和8020兩個在做負載均衡,現在停止8010和8020,可以看到8030頂上來了:
注意:關閉一個服務不會觸發備用服務,只有8010和8020全都意外停止,8030才會頂上來!
如果再把8010重新啟動,那麼備份服務就不會起作用了
max_fails和fail_timeout
nginx在原來的8010伺服器重新啟動以後,能很快檢測到原來的8010恢復了,並投入使用,是因為nginx和8010之間有類似心跳檢測的機制,實時監控8010是否能用。
- max_fails引數就是設定失敗多少次後,認為已經掛了,就剔除
- fail_timeout引數就是剔除後從新檢測這個屬性也是設定恢復時檢測的時長間隔,比如設定一分鐘,那麼服務恢復後得隔一分鐘才能檢測到並投入使用。
可以想象,如果實時去檢查的話,會很消耗效能,所以這兩個引數非常有用。
下面我們把失敗最大重試次數設定成10次,恢復檢測時長設定成30秒:
upstream wwwdemocom{
server 127.0.0.1:8010 weight=1 fail_timeout=30s max_fails=10;
server 127.0.0.1:8020 weight=2 fail_timeout=30s max_fails=10;
server 127.0.0.1:8030 backup;
}
重新載入,然後停止8010和8020,訪問頁面,可以看到載入了一會才會出現8030的結果,如果重試次數設定成100次,載入時間會更明顯。我們把8010啟動起來,可以看到前面三十秒左右還是8030,後面又開始訪問8010:
這兩個引數也是很重要的引數,在實際生成環境中會用到。要合理設定重試次數和等待時間
負載均衡演算法
上面介紹了簡單的負載均衡,也涉及到了簡單的輪訓的負載均衡和加權重的負載均衡演算法,下面專門介紹一下upstream 負載均衡演算法:
演算法 | |
---|---|
ll+weight | 輪詢加權重 (預設)缺點是,其中一個連線滿了,nginx還是會加連線過去導致連線越來越多,速度越來越慢,不夠自動化和智慧化 |
ip_hash | 基於Hash 計算 ,用於保持session 一至性,解決分散式session同步問題,缺點是現在很多小區或者學校都是用的一根光纖,大部分人的ip是一樣的,容易導致某個服務連線數量過多,出現負載不均衡的情況,而且機器掛掉,會話隨著會丟失 |
url_hash | 靜態資源快取,節約儲存,加快速度(第三方),和ip_hash的計算方法一樣,應用場景不同,通過這種演算法可以把一些靜態資源平均分佈到各個服務中,節省空間 |
least_conn | 最少連結(第三方),可以優先把請求分給和nginx連線最少的服務,最大化的利用資源 |
least_time | 最小的3響應時間,計算節點平均響應時間,然後取響應最快的那個,分配更高權重(第三方),可以充分利用效能好的機器 |
ip_hash
upstream wwwdemocom{
ip_hash;
server 127.0.0.1:8010 fail_timeout=30s max_fails=10;
server 127.0.0.1:8020 fail_timeout=30s max_fails=10;
}
注意,除了把權重去掉,還有把backup的服務註釋掉,兩個不能同時用.
效果就是,在一個地方訪問,只會出現一個服務的結果,不再訪問其它的服務,這是ip_hash演算法的效果。使用其它機器訪問,也會出現只訪問其中一個的效果.
來自為知筆記(Wiz)