1. 程式人生 > >負載均衡系列之(二)nginx

負載均衡系列之(二)nginx

永遠 實例 表示 特性 反向代理服務器 依據 forward 訪問 子郵件

Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行

其特點是占有內存少,並發能力強,事實上nginx的並發能力確實在同類型的網頁服務器中表現較好
Nginx 是一個很強大的高性能Web和反向代理服務器,它具有很多非常優越的特性:
在連接高並發的情況下,Nginx是Apache服務器不錯的替代品:Nginx在美國是做虛擬主機生意的老板們經常選擇的軟件平臺之一。能夠支持高達 50,000 個並發連接數的響應,感謝Nginx為我們選擇了 epoll and kqueue作為開發模型。
實現Nginx負載均衡的組件主要有兩個:

ngx_http_proxy_module proxy     代理模塊,用於把請求後拋給服務器節點或upstream服務器池
ngx_http_upstream_module        負載均衡模塊,可以實現網站的負載均衡功能及節點的健康檢查

upstream模塊

upstream模塊允許Nginx定義一組或多組節點服務器組,使用時可以通過proxy_pass代理方式把網站的請求發送到事先定義好的對應upstream組的名字上,

具體寫法為:proxy_pass http://syaving;
其中syaving就是一個upstream節點服務器組名字,例如

upstream syaving {
          server 172.16.7.1:8080 weight=1  max_fails=1 fail_timeout=10s;
          server 172.16.7.2:8080 weight=2  max_fails=1
fail_timeout=10s; server 172.16.7.3:8080 weight=5 max_fails=1 fail_timeout=10s; } server { listen 80; server_name www.syaving.com; access_log /data/logs/nginx/xtapi_accese.log combined; location / { proxy_pass http://syaving; include proxy.conf; } }

配置說明:

  • upstream模塊的內容應放於nginx.conf配置的http標簽內,默認調度節點算法是wrr(權重輪詢,weighted round-robin)
  • server:負載均衡後面的rs配置,可以是ip或域名
  • weight:服務器的權重,默認值為1,越大表示接受的請求比例越大
  • max_fails:nginx嘗試連接後端主機失敗的次數,這個數值是配合proxy_net_upstream,fastcgi_next_upstream和memcached_next_upstream這三個參數來使用的,當nginx接收後端服務器返回這三個參數定義的狀態碼時,會將這個請求轉發給正常工作的後端服務器,例如404,502,503 backup:熱備配置(rs節點的高可用),當前面激活的rs都失敗後會自動啟動用熱備rs,這標誌著這個服務器作為備份服務器,若主服務器全部宕機了,就會向它轉發請求;當負載調度算法為ip_hash時,後端服務器在負載均衡調度中的狀態不能是weight和backup
  • fail_timeout:在max_fails定義的失敗次數後,距離下次檢查的時間間隔,默認10s
  • down:表示服務器永遠不可用,可配合ip_hash使用

upstream模塊調度算法
調度算法一般分為兩類:
第一類為靜態調度算法,即負載均衡器根據自身設定的規則進行分配,不需要考慮後端節點服務器的情況,例如rr,wrr,ip_hash等

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

常見的調度算法
rr輪詢:round-robin,默認調度算法,靜態調度算法,按照客戶端請求順序逐一分配到不同的後端節點服務器,宕機的服務器會被自動從節點服務器池中剔除。

rr權重輪詢:靜態調度算法,在rr輪詢算法的基礎上加上權重,權重和用戶訪問成正比,權重值越大,被轉發的請求也就越多

ip_hash:靜態調度算法,每個請求按客戶端IP的Hash值分配,當新的請求到達時,先將其客戶端IP通過哈希算法計算出一個值,在隨後的客戶端請求中,客戶端IP的哈希值只要相同,就會被分配到同一臺服務器,可以解決動態網頁的session共享問題,但也會引起分配不均的弊端

fair:動態調度算法,此算法會根據後端節點服務器的響應時間來分配請求,響應時間短的優先分配,可以依據頁面大小和加載時間艙段智能地進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。需要下載Nginx的相關模塊upstream_fair

least_conn:根據後端節點的連接數來決定分配情況,哪個機器連接數少就分發

url_hash:根據訪問URL的hash結果來分配請求的,讓每個URL定向到同一個後端服務器,後端服務器為緩存服務器時效果顯著,如果需要使用這種調度算法,必須安裝Nginx的hash模塊軟件包

一致性hash:一般用於代理後端業務為緩存服務(squid,memcached)的場景,通過將用戶請求的uri或者指定字符串進行計算,然後調度到後端的服務器上,此後任何用戶查找同一個uri或者指定字符串都會被調度到這一臺服務器上,因此後端的每個節點緩存的內容都是不同的,一致性hash算法可以解決後端某個或者幾個節點宕機後,緩存的數據動蕩最小

http_proxy_module模塊

proxy_pass指令屬於ngx_http_proxy_module模塊,此模塊可以將請求轉發到另一臺服務器,在實際的反向代理工作中,會通過location功能匹配指定的uri,然後把接收到的符合匹配URI的請求通過proxy_pass拋給定義好的upstream節點池
簡單配置實例

   location / {
            proxy_pass http://10.0.0.1:8080;
            include    proxy.conf; #這裏我把所有的proxy放到一個文件裏面進行include調用,下面有介紹
            }

模塊參數
proxy_set_header:設置http請求header項傳給後端服務器節點,例如,可以實現讓代理後端的服務器節點獲取訪問客戶端用戶真實的IP地址
client_body_buffer_size:用於指定客戶端請求主題緩沖區大小
proxy_connect_timeout:表示反向代理與後端節點服務器連接的超時時間,即發起握手等候響應的超時時間
proxy_send_timeout:表示代理後端服務器的數據回傳時間,即在規定時間之內,後端服務器必須傳完所有的數據,否則,nginx將斷開這個連接
proxy_read_timeout:設置nginx從代理的後端服務器獲取信息的時間,表示連接建立成功後,Nginx等待後端服務器的響應時間,其實是nginx已經後端的排隊之中等候處理的時間
proxy_buffer_size:設置緩沖區大小,默認該緩沖區大小等於指令proxy_buffers設置的大小
proxy_buffers:設置緩沖區的數量和大小,nginx從代理的後端服務器獲取的響應信息,會放置在緩沖區
proxy_busy_buffers_size:用於設置系統很忙時可以使用的proxy_buffers大小,官方推薦的大小為proxy_bufer*2
proxy_temp_file_write_size:指定proxy緩存臨時文件的大小

proxy.conf文件如下

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;    #後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;                  #允許客戶端請求的最大單文件字節數
client_body_buffer_size 128k;                 #緩沖區代理緩沖用戶端請求的最大字節數,
proxy_connect_timeout   300;                  #nginx跟後端服務器連接超時時間(代理連接超時)
proxy_send_timeout      30;                   #後端服務器數據回傳時間(代理發送超時)
proxy_read_timeout      30;                   #連接成功後,後端服務器響應時間(代理接收超時)
proxy_next_upstream    http_502 http_504 http_404 error timeout invalid_header;
proxy_buffer_size       4k;            #設置代理服務器(nginx)保存用戶頭信息的緩沖區大小
proxy_buffers           4 32k;         #proxy_buffers緩沖區,網頁平均在32k以下的設置
proxy_busy_buffers_size 64k;           #高負荷下緩沖大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;        #設定緩存文件夾大小,大於這個值,將從upstream服務器傳

#proxy_cache cache;
#proxy_cache_valid 200 304 1h;
#proxy_cache_valid 404 1m;
#proxy_cache_key $uri$is_args$args;
#add_header  Nginx-Cache "$upstream_cache_status";


#proxy_http_version 1.1;
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "Upgrade";

負載均衡系列之(二)nginx