Nginx學習4 - Nginx反向代理與負載均衡

概念

什么是反向代理其與正向代理有什么區(qū)別?

正向代理是指客戶端與目標服務器之間增加一個代理服務器,客戶端直接訪問代理服務器,在由代理服務器訪問目標服務器并返回客戶端并返回。
這個過程當中客戶端需要知道代理服務器地址,并配置連接。
如圖:

反向代理是指客戶端訪問目標服務器,在目標服務內(nèi)部有一個統(tǒng)一接入網(wǎng)關將請求轉(zhuǎn)發(fā)至后端真正處理的服務器并返回結果。
這個過程當中客戶端不需要知道代理服務器地址,代理對客戶端而言是透明的。
如圖:

正向代理與反向代理的區(qū)別:

Nginx的反向代理

Nginx正向代理只需要配置 location 中配置proxy_pass 屬性即可,其指向代理的服務器地址。
正如我們上一篇文章配置的百度的代理:

這是一個經(jīng)典的正向代理的例子。

下面配置一個反向代理的例子,首先啟動兩個應用,端口分別是8010和8020,訪問/hello:

然后我們在nginx中,首先反向代理一個地址:

可以看到,監(jiān)聽80端口,代理的是8010的端口地址,路徑是/hello。
然后在配置一下本地host:

然后訪問可以看到反向代理成功:

可以看到正向代理和反向代理在配置上區(qū)別不大,主要區(qū)別是被代理的服務的位置,一個是遠程(百度),一個是局域網(wǎng)內(nèi)部(本機8010)。

來看代理相關參數(shù):

proxy_pass # 代理服務

proxy_redirect off; # 是否允許重定向

proxy_set_header Host $host; # 傳 header 參數(shù)至后端服務

proxy_set_header X-Forwarded-For $remote_addr; # 設置request header 即客戶端IP 地址

proxy_connect_timeout 90; # 連接代理服務超時時間

proxy_send_timeout 90; # 請求發(fā)送最大時間

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,可以看到,一級域名一樣,二級域名不同,代表了不同的系統(tǒng)。
這種方式利用nginx的反向代理也可以實現(xiàn):

可以看到,兩個不同的二級域名分別訪問兩個不同的端口地址,訪問效果如下:

這樣可以做到在一個服務器上部署多個項目,分別使用有意義的二級域名。

負載均衡

通過proxy_pass 可以把請求代理至后端服務,但是為了實現(xiàn)更高的負載及性能, 我們的后端服務通常是多個, 這個是時候可以通過upstream 模塊實現(xiàn)負載均衡。
下面來配置一個upstream:

可以看到把兩個服務地址都定義到了一個upstream中,并起名為wwwdemocom,下面設置反向代理:

image

反向代理的配置中,只配置upstream的名字即可,刷新頁面,可以看到同一個地址,不停的分別訪問兩個項目:

這樣如果我們部署多個相同的系統(tǒng),可以把所有的并發(fā)流量分到多個上面,從而達到提高并發(fā)的目的。

這時候兩個系統(tǒng)切換著訪問,策略默認是輪訓的,也就是無論幾個系統(tǒng)都輪著循環(huán)訪問。
如果想讓兩臺機器的訪問數(shù)量按照1比2分配,那么可以設置權重:

刷新頁面可以看到,8010訪問一次,緊接著8020訪問兩次,這種是按照權重分流,改變了原來默認的輪訓策略,這種適合機器性能有區(qū)別的情況。

下面看一下upstream 相關參數(shù):

service反向服務地址加端口

weight 權重

max_fails 失敗多少次認為主機已掛掉則,踢出

fail_timeout 踢出后重新探測時間

backup 備用服務

max_conns 允許最大連接數(shù)

再來看一個使用backup參數(shù)演示備份服務的例子,在服務器上再啟動一個8030的服務:

將此服務作為一個備份服務,有服務意外停止的時候,這個頂上去!來看nginx配置:

重啟nginx,先刷新頁面查看效果,發(fā)現(xiàn)還是配置的8010和8020兩個在做負載均衡,現(xiàn)在停止8010和8020,可以看到8030頂上來了:

注意:關閉一個服務不會觸發(fā)備用服務,只有8010和8020全都意外停止,8030才會頂上來!

如果再把8010重新啟動,那么備份服務就不會起作用了,訪問的還是8010:

再來說一下max_failsfail_timeout兩個參數(shù),nginx在原來的8010服務器重新啟動以后,能很快檢測到原來的8010恢復了,并投入使用,是因為nginx和8010之間有類似心跳檢測的機制,實時監(jiān)控8010是否能用。
上面的max_fails參數(shù)就是設置失敗多少次后,認為已經(jīng)掛了,就剔除,fail_timeout參數(shù)就是剔除后重新檢測這個屬性也就是設置恢復時檢測的時長間隔,比如設置一分鐘,那么服務恢復后得隔一分鐘才能檢測到并投入使用。
可以想象,如果實時去檢查的話,會很消耗性能,所以這兩個參數(shù)非常有用。
下面我們把失敗最大重試次數(shù)設置成10次,恢復檢測時長設置成30秒:

重新加載,然后停止8010和8020,訪問頁面,可以看到加載了一會才會出現(xiàn)8030的結果,如果重試次數(shù)設置成100次,加載時間會更明顯。
我們把8010啟動起來,可以看到前面三十秒左右還是8030,后面又開始訪問8010:

這兩個參數(shù)也是很重要的參數(shù),在實際生成環(huán)境中會用到,要合理設置重試次數(shù)和等待時間。

max_conns是項目服務允許的最大連接數(shù),這個很好理解。

負載均衡算法

上面介紹了簡單的負載均衡,也涉及到了簡單的輪訓的負載均衡和加權重的負載均衡算法,下面專門介紹一下upstream 負載均衡算法:

ll+weight: 輪詢加權重 (默認) 缺點是,其中一個連接滿了,nginx還是會加連接過去導致連接越來越多,速度越來越慢,不夠自動化和智能化

ip_hash : 基于Hash 計算 ,用于保持session 一至性,解決分布式session同步問題,缺點是現(xiàn)在很多小區(qū)或者學校都是用的一根光纖,大部分人的ip是一樣的,容易導致某個服務連接數(shù)量過多,出現(xiàn)負載不均衡的情況,而且機器掛掉,會話隨著會丟失

url_hash: 靜態(tài)資源緩存,節(jié)約存儲,加快速度(第三方),和ip_hash的計算方法一樣,應用場景不同,通過這種算法可以把一些靜態(tài)資源平均分布到各個服務中,節(jié)省空間

least_conn :最少鏈接(第三方),可以優(yōu)先把請求分給和nginx連接最少的服務,最大化的利用資源

least_time :最小的3響應時間,計算節(jié)點平均響應時間,然后取響應最快的那個,分配更高權重(第三方),可以充分利用性能好的機器

上面演示的都是輪詢加權重的,下面看下ip_hash算法

注意,除了把權重去掉,還有把backup的服務注釋掉,兩個不能同時用,現(xiàn)在重新加載看一下效果:

效果就是,在一個地方訪問,只會出現(xiàn)一個服務的結果,不再訪問其它的服務,這是ip_hash算法的效果。使用其它機器訪問,也會出現(xiàn)只訪問其中一個的效果:

其它算法不再演示。

文章轉(zhuǎn)載自鏈接:http://www.itdecent.cn/p/d0afeedf1a58

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容