負載均衡系列之(二)nginx
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=1fail_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