Nginx負載均衡簡單配置【詳細】

Nginx負載均衡配置php

如下爲Nginx負載均衡配置的簡單介紹及配置,以做備忘。css

第1章 負載均衡介紹

1.1 負載均衡和反向代理的區別

嚴格的說,Nginx僅僅是做爲Nginx Proxy反向代理使用的。普通的負載均衡軟件,例如LVS,其實現的功能只是對請求數據包的轉發(也可能會改寫數據包)、傳遞,其中DR模式明顯的特徵是從負載均衡下面的節點服務器來看,接收到的請求仍是來自訪問負載均衡的客戶端的真實用戶。而反向代理不同,反向代理接收訪問用戶的請求後,會代理用戶從新發起請求代理下的節點服務器,最後把數據返回給客戶端用,在節點服務器看來,訪問的節點服務器的客戶端就是反向代理服務器了,而非真是的網絡用戶。html

注: LVS等負載均衡是轉發用戶請求的數據包,而Nginx反向代理是接收用戶的請求而後從新發起請求去請求後面的節點。android

1.2 實現Nginx負載均衡的組件

Nginx http功能模塊nginx

模塊說明git

ngx_http_proxy_modulegithub

proxy代理模塊,用於把請求後拋給服務器節點或upstream服務器池。算法

ngx_http_upstream_module後端

負載均衡模塊,能夠實現網站的負載均衡功能及節點的健康檢查。瀏覽器

1.2.1 upstream模塊

Nginx的負載均衡功能依賴於ngx_http_upstream_module模塊,所支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass等。

ngx_http_upstream_module模塊容許Nginx定義一組或多組節點服務器組,使用時能夠經過proxy_pass代理方式把網站的請求發送到事先定義好的對應Upstream組的名字上,具體寫法爲「proxy_pass http://www_server_pools」,其中www_server_pools就是一個Upstream節點服務器組的名字。upstream模塊官方地址:http://nginx.org/en/docs/http/ngx_http_upstream_module.html

Ø  基本upstream配置案例

upstream www_server_pool { server 10.0.0.7 weight=5; server 10.0.0.16 weight=10; }
 

注:一、upstream是關鍵字必需要有,後面的www_server_pool爲一個Upstream集羣組的名字,能夠自定義;

二、server是關鍵字固定,後面能夠接域名或IP。若是不指定端口,默認是80。結尾有分號。

三、weight表明權重,數值越大分配的請求就越多。

Ø  較完整upstream配置案例

upstream www_server_pool { server 10.0.0.5; #<==這一行標籤和下一行是等價的 server 10.0.0.6:80 weight=1 max_fails=1 fails_timeout=10s; #<==此行標籤爲默認配置 server 10.0.0.7:80 weight=1 max_fails=2 fails_timeout=10s backup; server 10.0.0.8:80 weight=1 max_fails=3 fails_timeout=20s backup; }
 

Ø  使用域名的配置案例

  upstream www_server_pool {

    server www.test.com:8080;

    server www.example.com weight=10;

}

1.2.2 upstream模塊功能說明

upstream模塊的內容應放於nginx.conf配置的http{}標籤內,其默認調度節點算法是wrr(權重輪詢weighted round-robin)。下表爲內部server標籤部分參數說明:

server標籤

參數說明

server 10.0.0.6:80

負載均衡後面的RS配置,能夠是IP或域名,若是不寫端口,默認是80端口。高併發場景下,IP可換成域名,經過DNS作負載均衡。

weight=1

表明服務器的權重,默認值是1。權重數字越大表示接受的請求比例越大。

max_fails=1

Nginx嘗試鏈接後端主機失敗的次數,這個數值是配置proxy_next_upstream、fastcgi_next_upstream和memcached_next_upstream三個參數來使用的,當Nginx接受後端服務器返回這三個參數定義的狀態碼時,會將這個請求轉發給正常工做的後端服務器,例如40四、50二、503。max_fails的默認值是1;企業場景:建議2-3次。

backup

熱備配置(RS)節點的高可用,當期面激活的RS都失敗後會自動啓用熱備RS。這標誌着這個服務器做爲備份服務器,若主服務器所有宕機了,就會向他轉發請求;注意:當負載調度算法爲ip_hash時,後端服務器在負載均衡調度中的狀態不能是weight和backup。

fail_timeout=10s

在max_fails定義的失敗次數後,距離下次檢查的間隔時間,默認是10s;若是max_fails是5,他就檢測5次。若是5次都是502,那麼他就會根據fail_timeout的值,等待10s再去檢查,仍是隻檢查一次,若是持續502,在不從新加載nginx配置的狀況下,每隔10s都只檢測一次。常規業務:2-3秒比較合理。

down

這標識着服務器永遠不可用,這個參數可配合ip_hash使用。

1.2.3 upstream模塊調度算法

調度算法通常分爲兩類,第一類爲靜態調度算法,即負載均衡器根據自身設定的規則進行分配,不須要考慮後端節點服務器的狀況,例如:rr、wrr、ip_hash等都屬於靜態調度算法。

第二類爲動態調度算法,即負載均衡器會根據後端節點的當前狀態來決定是否分發請求,例如:鏈接數少的優先得到請求,響應時間短的優先得到請求。例如:least_conn、fair等都屬於動態調度算法。

q  rr輪詢(默認調度算法,靜態調度算法)

按客戶請求順序把客戶端的請求逐一分配到不一樣的後端節點服務器,這至關於LVS中的rr算法,若是後端節點服務器宕機(默認狀況下nginx只檢測80端口),宕機的服務器會被自動從節點服務器池中剔除,以使客戶端的用戶訪問不受影響。新的請求會分配給正常的服務器。

q  wrr(權重輪詢,靜態調度算法)

在rr輪詢算法的基礎上加上權重,即爲權重輪詢算法。使用該算法時,權重和用戶訪問成正比,權重值越大,被轉發的請求也就越多。能夠根據服務器的配置和性能指定權重值大小,有效解決新舊服務器性能不均帶來的請求分配問題。

q  ip_hash(靜態調度算法)

每一個請求按客戶端IP的hash結果分配,當新的請求到達時,先將其客戶端IP經過哈希算法哈希出一個值,在隨後的客戶端請求中,客戶IP的哈希值只要相同,就會被分配至同一臺服務器。該調度算法能夠解決動態網頁的session共享問題,但有時會致使請求分配不均,即沒法保證1:1的負載均衡,由於在國內大多數公司都是NAT上網模式,多個客戶端會對應一個外部IP,因此,這些客戶端都會被分配到同一節點服務器,從而致使請求分配不均。LVS負載均衡的-p參數、Keepalived配置裏的persistence_timeout 50參數都是相似這個Nginx裏的ip_hash參數解決動態網頁的session共享問題。

注:當負載調度算法爲ip_hash時,後端服務器在負載均衡調度中的狀態不能有weight和backup,即便有也不會生效。

q  fair(動態調度算法)

此算法會根據後端節點服務器的響應時間來分配請求,這是更加智能的調度算法。此種算法能夠依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的會優先分配。Nginx自己是不支持fair調度算法的,若是須要這種算法,必須下載相關模塊upstream_fair。

q  least_conn(動態調度算法)

least_conn算法會根據後端節點的鏈接數來決定分配狀況,哪一個機器鏈接數少就分發。

q  url_hash

和ip_hash相似,這裏是根據訪問的URL的hash結果來分配請求的,讓每一個URL定向到同一個後端服務器,能夠進一步提升後端緩存服務器的效率命中率,後端服務器爲緩存服務器時效果顯著。在upstream中加入hash語句,server語句中不能寫入weight等其餘參數,hash_method使用的是hash算法。Nginx自己是不支持url_hash的,若是須要使用這種調度算法,必須安裝Nginx的hash模塊軟件包。

url_hash和ip_hash相似,示例配置以下:

upstream test_server { server squid1:3128; server squid2:3181; hash $request_uri; hash_method crc32; }
 

注:若是使用url_hash,那麼在節點宕機或者新加節點的時候,會產生緩存丟失無效的狀況。

q  一致性hash

一致性hash算法通常用於代理後端業務緩存服務(squid,memcache)的場景,經過將用戶請求的URI或者指定字符串進行計算,而後調度到後端的服務器上。此後任何用戶查找同一個URI或者指定字符串都會被調度到這一臺服務器上,所以後端的每一個節點緩存的內容都是不一樣的。一致性hash算法能夠解決後端某個或幾個節點宕機後,緩存的數據動盪最小。

配置示例:

http { upstream test { consistent_hash $request_uri; server 127.0.0.1:9001 id=1001 weight=3; server 127.0.0.1:9002 id=1002 weight=10; server 127.0.0.1:9003 id=1003 weight=20; } }
 

注:Nginx自己不支持一致性HASH算法,須要插件,但Nginx分支tengine支持。

一致性HASH算法實踐:http://lx.wxqrcode.com/index.php/post/92.html

1.2.4 proxy模塊

proxy是實現反向代理的模塊,具體配置相關參數以下:

proxy模塊相關參數

參數說明

proxy_set_header

設置http請求header項傳給後端服務器節點,例如:可實現讓代理後端的服務器節點獲取訪問客戶端用戶的真實IP地址。

client_body_buffer_size

用於指定客戶端請求主體緩衝區大小(http請求報文)

proxy_connect_timeout

表示反向代理與後端節點服務器鏈接的超時時間,即發起握手等候響應的超時時間。

proxy_send_timeout

表示代理後端服務器的數據回傳時間,即在規定時間以內後端服務器必須傳完全部的數據,不然,Nginx將斷開這個鏈接。

proxy_buffer_size

設置緩衝區大小,默認該緩衝區大小等於指令proxy_buffers設置的大小

proxy_buffers

設置緩衝區的數量和大小。nginx從代理的後端服務器獲取的響應信息,會放置到緩衝區。

proxy_busy_buffers_size

用於設置系統很忙時可使用的proxy_buffers大小,官方推薦爲proxy_buffers*2。

proxy_temp_file_write_size

指定proxy緩存臨時文件的大小

 

第2章 負載均衡的配置

2.1 常規配置

upstream www_server_pools { server 172.16.1.16:80 ; server 172.16.1.17:80 ; } server { listen 80; server_name www_server_pools; location / { access_log logs/access.log main; proxy_pass http://www_server_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_redirect default; proxy_buffer_size 512k; proxy_buffers 6 512k; proxy_busy_buffers_size 512k; proxy_temp_file_write_size 512k; client_max_body_size 100m; } }
 

上述配置中相同的配置還能夠寫到同一個文件中,而後用include來包含:

server { listen 80; server_name www_server_pool; location / { proxy_pass http://www_server_pool; include proxy.conf; } }
 

proxy.conf文件內容:

[root@LB01 conf]# cat proxy.conf proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_redirect default; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; client_body_buffer_size 10m;
 

 

2.2 服務動靜分離

upstream static_pools { server 192.168.1.189:80 ; } upstream upload_pools { server 192.168.1.190:80 ; } upstream default_pools { server 192.168.1.188:80 ; } server { listen 80; server_name www_server_pool; location /static/ { proxy_pass http://static_pools; include proxy.conf; } location /upload/ { proxy_pass http://upload_pools; include proxy.conf; } location / { proxy_pass http://default_pools; include proxy.conf; } }
 

2.3 根據客戶端設備(user_agent)轉發

upstream static_pools { server 192.168.1.189:80 ; } upstream upload_pools { server 192.168.1.190:80 ; } upstream default_pools { server 192.168.1.188:80 ; } server { listen 80; server_name www_server_pool; location / { if ($http_user_agent ~* "MSIE") { proxy_pass http://static_pools; } if ($http_user_agent ~* "Chrome") { proxy_pass http://upload_pools; } proxy_pass http://default_pools; include proxy.conf; } }
 

user_agent不只僅識別瀏覽器,還能識別客戶端設備,以下是經常使用的一些配置:

$http_user_agent ~* "MSIE"         #<==IE瀏覽器

$http_user_agent ~* "Chrome"      #<==谷歌瀏覽器

$http_user_agent ~* "android"              #<==安卓設備

$http_user_agent ~* "iphone"        #<==iphone設備

2.4 根據文件拓展名轉發

location方法配置規則:

location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ { proxy_pass http://default_pools; include proxy.conf; if ($request_uri ~* ".*\.(php|php5)$") { proxy_pass http://static_pools; } if ($request_uri ~* ".*\.(jps|jps*|do|do*)$") { proxy_pass http://static_pools; }
 

第3章 負載均衡監測節點狀態

淘寶技術團隊開發了一個Tengine(Nginx的分支)模塊nginx_upstream_check_module,用於提供主動式後端服務器健康檢查。經過它能夠檢測後端realserver的健康狀態,若是後端realserver不可用,則全部的請求就不會轉發到該節點上。

Tengine遠程支持這個模塊,而Nginx須要以打補丁的方式將該模塊添加到Nginx中。補丁下載地址: https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master

3.1 安裝nginx_upstream_check_module模塊

cd /usr/local/src wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master unzip master cd /usr/local/src/nginx-1.12.2 patch -p1 < ../nginx_upstream_check_module-master/check_1.12.1+.patch ./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --prefix=/opt/nginx-1.12.2 --add-module=../nginx_upstream_check_module-master/ make mv /opt/nginx/sbin/nginx{,.ori} cp ./objs/nginx /opt/nginx/sbin/ /opt/nginx/sbin/nginx -V
 

3.2 配置健康檢查

在每一個upstream模塊裏面添加檢測語句,並配置status:

server 192.168.1.189:80 ; check interval=3000 rise=2 fall=5 timeout=1000 type=http; } upstream upload_pools { server 192.168.1.190:80 ; check interval=3000 rise=2 fall=5 timeout=1000 type=http; } upstream default_pools { server 192.168.1.188:80 ; server 192.168.1.189:80 ; check interval=3000 rise=2 fall=5 timeout=1000 type=http; } server { listen 80; server_name www_server_pool; location / { if ($http_user_agent ~* "MSIE") { proxy_pass http://static_pools; } if ($http_user_agent ~* "Chrome") { proxy_pass http://upload_pools; } proxy_pass http://default_pools; include proxy.conf; } location /status { check_status; access_log off; } }
 

瀏覽器訪問:192.168.1.187/status以查看realserver節點狀態。 

相關文章
相關標籤/搜索