Nginx除了實現基本的Web Server功能以外還能夠做爲正向代理與反向代理。正向代理與反向代理的區別在於代理的對象不同。正向代理的對象是客戶端,反向代理的對象是服務端。作正向代理時,當客戶端發起請求其訪問目標應該是後端真實服務器;作反向代理時,客戶端發起請求其目標應該是代理服務器自己,但由代理服務器把後端真實服務器上的數據發給了客戶端。反向代理一般是做爲負載均衡來分發流量給後端的應用程序服務器,以此來提升性能。好比前端是一臺Nginx做爲負載均衡的分發器,後端是多臺Apache搭建的Web Server,當訪問流量很大時,就讓Nginx分發請求給後端多臺服務器,讓它們分工響應。Nginx實現負載均衡用到的模塊是proxy_pass代理模塊,經過該模塊將客戶端請求轉發到一組upstream服務池,因此還須要用到ngx_http_upstream_module模塊,該模塊只能配置於http字段中,支持的代理方式有proxy_pass,fastcgi_pass,memcached_pass。html
1、Nginx經常使用負載均衡算法:前端
一、輪詢(默認算法):每一個請求會依次分配給後端不一樣的應用程序服務器,不理會後端服務器的實際壓力linux
二、加權輪詢:權重越大的服務器,被分配到的次數就會越多,一般用於後端服務器性能不一致的狀況nginx
三、IP HASH:當同IP進行重複訪問時會被指定到上次訪問到的服務器,能夠解決動態網站SESSION共享問題web
2、upstream模塊中的經常使用參數說明:算法
server:負載均衡後端服務器的IP或域名,不寫端口的話默認是80。高併發場景用域名,再經過DNS進行負載均衡 後端
weight:後端服務器權重,默認爲1,權重越大接收的請求越多。例:weight=5服務器
max_fails:檢查節點的健康狀態並容許請求失敗的次數,達到該次數就將節點下線。默認爲1,0表示禁止失敗嘗試。例:max_fails=2併發
fail_timeout:max_fails失敗次數達到限制後暫停該節點服務的時間,默認是10秒。例:fail_timeout=10s負載均衡
backup:熱備配置,當服務池中全部服務器均出現問題後會自動上線backup服務器
down:標誌服務器不可用,不參與負載均衡。這個參數一般配合IP_HASH使用
max_conns:限制最大鏈接數,一般對後端服務器硬件不一致的狀況進行配置
1 |
upstream linuxe_backend { |
2 |
server 192.168.1.110 down; #該節點不可用 |
3 |
server 192.168.1.120 backup; #其餘節點掛了後該節點自動上線 |
4 |
server 192.168.1.130 max_failes=1 fail_timeout=10s weight-5; |
5 |
server backend1.linuxe.cn 8080 weight=3 |
6 |
} |
3、Nginx負載均衡調度算法介紹(若是調度策略使用不當會對後端節點形成壓力過大)
這些調度算法做用域都是upstream中
一、輪詢負載,也是默認的負載均衡配置
01 |
http { #upstream模塊包含在http模塊下 |
02 |
upstream myserver{ #定義upstream名字,下面會引用 |
03 |
server 192.168.1.100; #指定後端服務器地址 |
04 |
server 192.168.1.110; #指定後端服務器地址 |
05 |
server 192.168.1.120; #指定後端服務器地址 |
06 |
} |
07 |
08 |
server { |
09 |
listen 80; |
10 |
server name www.myserver.com; |
11 |
location / { |
12 |
proxy_pass http://myserver; #引用upstream |
13 |
} |
14 |
} |
15 |
} |
在上面的例子中,當用戶訪問www.myserver.com站點時,Nginx會負載平衡分配給後端的三個服務器。使用ab作壓力測試能夠看到在加了負載均衡後Time per request(每一個請求平均消耗時間)下降、Request per second(每秒請求數)提高。若是沒有配置upstream模塊而只使用proxy_pass模塊,能夠實現反向代理的做用。
二、加權負載均衡
01 |
http { |
02 |
upstream myserver{ |
03 |
server 192.168.1.100 weight=3; #指定後端服務器地址,權重爲3 |
04 |
server 192.168.1.110; |
05 |
} |
06 |
07 |
server { |
08 |
listen 80; |
09 |
server name www.myserver.com; |
10 |
location / { |
11 |
proxy_pass http://myserver; |
12 |
} |
13 |
} |
14 |
} |
在上面配置中,每3個請求都分配給192.168.1.100,而後第4個請求會分配給192.168.1.110,如此循環下去。
三、IP HASH負載均衡
1 |
upstream myserver { |
2 |
ip_hash; #採用IP HASH算法 |
3 |
server 192.168.1.100; |
4 |
server 192.168.1.110; |
5 |
server 192.168.1.120; |
6 |
} |
若是須要將客戶與後端一臺服務器「綁定」起來,可使用ip-hash負載平衡。這樣能夠確保來自相同客戶機的請求老是指向相同的服務器除非該服務器不可用。
四、基於URL的HASH,當客戶端屢次訪問同一個地址時分配到固定的節點
1 |
upstream myserver { |
2 |
hash $request_uri; |
3 |
server 192.168.1.100; |
4 |
server 192.168.1.110; |
5 |
server 192.168.1.120; |
6 |
} |
五、最少鏈接數輪詢,哪一個節點當前的鏈接數少就分配給哪一個節點處理
1 |
least_conn; |
4、如何獲取客戶端真實IP
因爲Nginx做爲了反向代理,幫客戶取到數據並反饋給客戶,因此在後端的服務器訪問日誌中記錄的將會是Nginx這臺負載均衡服務器的IP而不是客戶端真實IP,要解決這個問題的話就須要使用proxy_set_header模塊。
proxy_set_header:讓後端服務器能獲取到前端用戶真實IP,而不僅是代理服務器的IP。配置示例以下(還需將後端Apache日誌格式中的%h替換爲%{X-Real-IP}i):
1 |
location /{ |
2 |
proxy_pass http://localhost:8080/web/; |
3 |
#如下三個proxy_set_header配置項是重點 |
4 |
proxy_set_header Host $host; |
5 |
proxy_set_header X-Real-IP $remote_addr; |
6 |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
client_body_buffer_size:客戶端請求主體緩衝區大小
proxy_connect_timeout:代理服務器和後端真實服務器握手鍊接超時時間
proxy_send_timeout:後端服務器回傳數據給Nginx的時間,須要在設置的時間範圍內發送完全部數據,不然Nginx將斷開鏈接
proxy_read_timeout:代理服務器和後端服務器鏈接成功後,等待後端服務器響應時間
5、Nginx高可用的實現:
利用backup標籤能夠實現高可用,當全部節點掛掉後backup服務器會自動接管服務,當有任意一臺節點恢復後backup也會自動放棄服務
01 |
http { |
02 |
upstream myserver{ |
03 |
server 192.168.1.100 |
04 |
server 192.168.1.110 backup; |
05 |
} |
06 |
server { |
07 |
listen 80; |
08 |
server name www.myserver.com; |
09 |
location / { |
10 |
proxy_pass http://myserver; |
11 |
} |
12 |
} |
13 |
} |
從上面多個配置示例來看Nginx的upstream模塊至關因而創建一個服務池,把後端的服務器都放在池子裏,而proxy模塊則是從這個池子裏調用這些服務器。
6、線上配置示例:
01 |
#先在nginx.conf中定義一組upstream |
02 |
upstream pre-cloud_Backend { |
03 |
server pre-cloud.website.com:8080; |
04 |
ip_hash; |
05 |
check interval=5000 rise=1 fall=3 timeout=30000; |
06 |
check_http_expect_alive http_2xx http_3xx; #tengine的健康檢查模塊 |
07 |
} |
08 |
09 |
#conf.d/下定義一個文件 |
10 |
server{ |
11 |
listen 80; |
12 |
server_name cloud.website.com; |
13 |
limit_conn perserver 10000; |
14 |
15 |
location / { |
16 |
proxy_next_upstream error timeout http_503 http_504 http_502; |
17 |
proxy_connect_timeout 500s; |
18 |
proxy_read_timeout 500s; |
19 |
proxy_send_timeout 500s; |
20 |
proxy_set_header Host $http_host; |
21 |
proxy_set_header X-Real-IP $remote_addr; |
22 |
proxy_set_header X-Forwarded-For $remote_addr; |
23 |
proxy_pass http://pre-cloud_Backend; |
24 |
} |
25 |
} |