1. 程式人生 > >nginx配置負載均衡詳解

nginx配置負載均衡詳解

情況 pass hit 名稱 負責 說明 英文 weight 性能

nginx配置負載均衡詳解

一、負載均衡簡介

1、什麽是負載均衡

負載均衡 建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。

負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。

簡單的來說。負載均衡可以減少服務器的壓力,將原本一臺服務器所要承受的訪問量分給了多臺,並提高了項目的可用性,當一臺服務器掛掉的時候也不會導致整個項目癱瘓。

2、負載均衡的目的

負載均衡的目的是為了解決單個節點壓力過大,造成

Web服務響應過慢,嚴重的情況下導致服務癱瘓,無法正常提供服務,由於一個Web服務同時能處理的用戶並發請求的數量有限,同時還有機器故障的情況,所以一個Web站點通常會在N臺機器上各部署一套同樣的程序。當某一個服務掛掉的時候,還有第二個、第三個、第N個服務。。。繼續為用戶提供服務,給用戶的感覺,你的服務還在正常的運行!在這些提供同樣服務的機器當中,在硬件配置方面也各不一樣,這樣就會存在部份機器性能非常好,能快速計算並響應用戶的請求,另外一部份機器可能配置差點,響應用戶的請求的時間會長一些。

這就需要我們思考一個問題?如果有一個服務正在同時處理1000個用戶的請求,這個服務的上限可能最多能同時處理1000個用戶的請求,這時它已經很忙了,如果此時又有一個新請求過來,我們仍然把這個請求分配給這臺機器,這時候這個請求就只能在幹等著,等這個服務處理完那些請求後,再繼續處理它。這樣在瀏覽器中的反應就像

12306我們在春節買票一樣,卡在那不動了,讓用戶眼巴巴的幹著急。而能提供同樣服務的其它機器,這時確很空閑。這樣不僅是對服務器資源的浪費,也充分發揮不出弄多臺服務器裝同一個服務的最高價值。我們通常稱對某一臺機器的訪問量稱為負載量,如何將一個用戶的請求,合理的分配到一臺能快速響應用戶請求的服務器上,我們就需要用到一些負載策略。也就體現出了文章主題的用意了:負載均衡,將用戶的所有HTTP請求均衡的分配到每一臺機器上,充分發揮所有機器的性能,提高服務的質量和用戶體驗。負載均衡可以通過負載均衡網絡硬件設備和Web服務器軟件來實現,前者設備成本較高,小公司通常負擔不起,所以後者一般是我們的首選。實現負載均衡常用的
Web服務器軟件有NginxHAProxyLVS等,本文主要介紹Nginx的負載均衡策略。

3、負載均衡的常用功能

客戶端的請求轉發功能:按照一定的算法【權重、輪詢】,將客戶端請求轉發到不同應用服務器上,減輕單個服務器壓力,提高系統並發量。

服務器的故障轉移功能:通過心跳檢測的方式,判斷應用服務器當前是否可以正常工作,如果服務器宕掉,自動將請求發送到其他應用服務器。

服務器故障恢復自動添加功能:如檢測到發生故障的應用服務器恢復工作,自動將其添加到處理用戶請求隊伍中。

二、Nginx內置三種負載策略

Nginx負載均衡是通過upstream模塊來實現的,內置實現了三種負載策略,配置還是比較簡單的。官網負載均衡配置說明:http://nginx.org/en/docs/http/load_balancing.html

1、輪循(默認weight=1

Nginx根據請求次數,將每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除

upstream bakend {

server 192.168.1.10;

server 192.168.1.11;

}

2、權重輪詢(weight

通過配置權重,指定輪詢幾率,權重和訪問比率成正比,用於應用服務器性能不均的情況。如果後端服務器down掉,能自動剔除。比如以下配置,則1.11服務器的訪問量為1.10服務器的兩倍。

upstream bakend {

server 192.168.1.10 weight=1;

server 192.168.1.11 weight=2;

}

3ip_hash

每個請求按訪問iphash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session不能跨服務器的問題。如果後端服務器down掉,要手工down掉。

upstream resinserver{

ip_hash;

server 192.168.1.10:8080;

server 192.168.1.11:8080;

}

4nginx相關參數說明

詳細的可以參考官方文檔:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

http {

resolver 10.0.0.1;

upstream tomcats {

server 192.168.0.100:8080;

server 192.168.0.101:8080 weight=3;

server 192.168.0.102:8080 backup;

server 192.168.0.103:8080 down;

server 192.168.0.104:8080 max_conns=1000;

server 192.168.0.105:8080 weight=2 max_fails=3 fail_timeout=15;

}

server {

listen 80;

location / {

proxy_pass http://tomcats;

}

}

}

resolveserver指令配置的域名,指定域名解析服務器。

upstream模塊:配置反向代理服務器組,Nginx會根據配置,將請求分發給組裏的某一臺服務器。tomcats是服務器組的名稱。

weight 默認為1,將請求平均分配給每臺server

backup備份機,所有服務器掛了之後才會生效

down標識某一臺server不可用。可能能通過某些參數動態的激活它吧,要不真沒啥用。

max_conns限制分配給某臺Server處理的最大連接數量,超過這個數量,將不會分配新的連接給它。默認為0,表示不限制。

max_fails默認為1。某臺Server允許請求失敗的次數,超過最大次數後,在fail_timeout時間內,新的請求將不會分配給這臺機器。

fail_timeout默認為10秒。某臺Server達到max_fails次失敗請求後,在fail_timeout期間內,nginx會認為這臺Server暫時不可用,不會將請求分配給它

proxy_pass http://tomcats表示將所有請求轉發到tomcats服務器組中配置的某一臺服務器上。

三、nginx第三方負載策略

1fair(第三方插件)

根據服務器的響應時間來分配請求,響應時間短的優先分配,即負載壓力小的優先會分配。由於fair模塊是第三方提供的,所以在編譯nginx源碼的時候,需要將fair添加到nginx模塊中。我的nginx是通過源碼安裝的,安裝在/usr/local/nginx-1.12.1/目錄下,而且安裝時沒有添加fair模塊,重新編譯添加fair模塊方法如下:

1)下載fair模塊源碼並解壓

下載地址:https://github.com/gnosek/nginx-upstream-fair/tree/master

[root@localhost ~]# unzip master.zip

nginx-1.12.1 nginx-upstream-fair-master master.zip

這個是剛剛解壓的

解壓後的目錄名為:nginx-upstream-fair-master

2)重新編譯nginx

重新編譯nginxfair模塊添加到編譯參數,我的nginx源碼目錄在/root/nginx-1.12.1

[root@localhost ~]# cd /root/nginx-1.12.1

[root@localhost nginx-1.12.1]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx-1.12.1 --with-http_stub_status_module --with-http_ssl_module --add-module=/root/nginx-upstream-fair-master 把之前編譯nginx的參數都加上,然後再加上添加的模塊

[root@localhost nginx-1.12.1]# make

/root/nginx-upstream-fair-master/ngx_http_upstream_fair_module.c: 在函數‘ngx_http_upstream_init_fair_rr’中:

/root/nginx-upstream-fair-master/ngx_http_upstream_fair_module.c:543:28: 錯誤:‘ngx_http_upstream_srv_conf_t’沒有名為‘default_port’的成員

if (us->port == 0 && us->default_port == 0) {

^

/root/nginx-upstream-fair-master/ngx_http_upstream_fair_module.c:553:51: 錯誤:‘ngx_http_upstream_srv_conf_t’沒有名為‘default_port’的成員

u.port = (in_port_t) (us->port ? us->port : us->default_port);

^

make[1]: *** [objs/addon/nginx-upstream-fair-master/ngx_http_upstream_fair_module.o] 錯誤 1

make[1]: 離開目錄“/root/nginx-1.12.1

make: *** [build] 錯誤 2

這裏報錯一堆,可能是nginx版本太高導致,換低版本的就沒問題。

註意:不要執行make install,這樣會覆蓋之前nginx的配置

3)復制編譯好的nginx執行文件到nginxsbin目錄覆蓋之前的

將新編譯的nginx可執行程序拷貝到/opt/nginx/sbin/目錄下,覆蓋之前安裝的nginx

編譯後的nginx執行程序,放在nginx源碼的objs目錄下

[root@localhost ~]# cp /root/ nginx-1.12.1/objs/nginx /usr/local/ nginx-1.12.1/sbin/

4)配置使用fair負載策略模塊

upstream tomcats {

fair;

server 192.168.0.100:8080;

server 192.168.0.101:8080;

server 192.168.0.102:8080;

}

由於采用fair負載策略,配置weigth參數改變負載權重將無效。

2url_hash(第三方插件)

按請求urlhash結果來分配請求,使每個url定向到同一個後端服務器,服務器做緩存時比較有效。1.7.2版本以後,url_hash模塊已經集成到了nginx源碼當中,不需要單獨安裝。之前的版本仍需要單獨安裝,下載地址:https://github.com/evanmiller/nginx_upstream_hash

安裝方法和fair模塊一樣,先下載url_hash源碼,然後重新編譯nginx源碼,將url_hash模塊添加到編譯配置參數當中,最後將編譯後生成的nginx二進制文件替換之前安裝的nginx二進制文件即可。

upstream tomcats {

server 192.168.0.100:8080;

server 192.168.0.101:8080;

server 192.168.0.102:8080;

hash $request_uri;

}

四、使用Nginx的高可用

除了要實現網站的高可用,也就是提供n多臺服務器用於發布相同的服務,添加負載均衡服務器分發請求以保證在高並發下各臺服務器能相對飽和的處理請求。同樣,負載均衡服務器也需要高可用,以防如果負載均衡服務器掛掉了,後面的應用服務器也紊亂無法工作。

實現高可用的方案:添加冗余。添加nnginx服務器以避免發生上述單點故障。具體方案詳見以後的文章:keepalive+nginx實現負載均衡高可用

五、總結

總結一點,負載均衡不論是各種軟件或硬件上的解決方案,主要還是將大量的並發請求按照一定的規律分發給不同的服務器處理,從而減少某臺服務器的瞬時壓力,提高網站的抗並發能力。nginx在負載均衡的應用之所以廣泛,這歸功於它的靈活配置,一個nginx.conf文件解決大部分問題,不論是nignx創建虛擬服務器、nginx的反向代理服務器,還是本文介紹的nginx的負載均衡,幾乎都在這個配置文件中進行。服務器上只負責把nginx搭好,跑起來即可。而且它本身輕量級,不需要占用服務器太多資源就可以達到較好的效果。


nginx配置負載均衡詳解