Nginx 之 實現調度功能
1 概述
本文將介紹ngx_http_upstream_module模塊和ngx_stream_core_module模塊這兩個模塊實現nginx的調度功能。nginx可以通過proxy功能,實現將不同內容的訪問調度到對應的機器上。實現了應用級的調度,相關內容見博客《Nginx 之 實現代理功能》
2 ngx_http_upstream_module模塊
該模塊用於將多個服務器定義成服務器組,而由proxy_pass,fastcgi_pass等指令進行引用.註意,如果nginx上有設置了proxy_cache.那麽訪問的資源如果在nginx上已經有緩存了,將不會把請求轉發給後臺的服務器,直接把將緩存返回給客戶端,就不會有調度的執行,可能同一訪問的得到的結果是相同的。
.1、upstream
upstream name { ... }
定義後端服務器組,會引入一個新的上下文,默認調度算法是wrr
Context: http
upstream httpdsrvs{ server ... server... ... }
.2、server
server address [parameters];
在upstream上下文中server成員,以及相關的參數;Context:upstream
address的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE
IP[:PORT]
HOSTNAME[:PORT]
parameters:
weight=number
max_conns連接後端報務器最大並發活動連接數,1.11.5後支持
max_fails=number失敗嘗試最大次數;超出此處指定的次數時,server將被標記為不可用,默認為1
fail_timeout=time後端服務器標記為不可用狀態的連接超時時長,默認10s
backup將服務器標記為“備用”,即所有服務器均不可用時才啟用,相當於是sorry server,提示用戶,註意,這裏backup不要用80端口,用其他的虛擬主機來充當sorry server,如再開一個端口8000
down標記為“不可用”,配合ip_hash使用,實現灰度發布,灰度發布,指分批進行發布上線。
.3、ip_hash
源地址hash調度方法
根據源地址進行調度,同一個源的客戶端調度到同一臺主機
.4、least_conn
最少連接調度算法,當server擁有不同的權重時其為wlc,當所有後端主機連接數相同時,則使用wrr,適用於長連接
.5、hash
hash key [consistent]基於指定的key的hash表來實現對請求的調度,此處的key可以直接文本、變量或二者組合
作用:將請求分類,同一類請求將發往同一個upstream server,使用consistent參數,將使用ketama一致性hash算法,適用於後端是Cache服務器(如varnish)時使用
hash $request_uri consistent; #其中,consistent一致性的hash
hash $remote_addr;
.6、keepalive 連接數N;
keepalive n;
為每個worker進程保留的空閑的長連接數量,可節約nginx端口,並減少連接管理的消耗
.7、health_check
health_check [parameters];
健康狀態檢測機制;只能用於location上下文
常用參數:
interval=time檢測的頻率,默認為5秒
fails=number:判定服務器不可用的失敗檢測次數;默認為1次
passes=number:判定服務器可用的失敗檢測次數;默認為1次
uri=uri:做健康狀態檢測測試的目標uri;默認為/
match=NAME:健康狀態檢測的結果評估調用此處指定的match配置塊
註意:僅對nginxplus有效,nginxplus為商業版,需要付費
.8 match
match name { ... }
對backendserver做健康狀態檢測時,定義其結果判斷機制;只能用於http上下文
.常用的參數:
status code[ code ...]: 期望的響應狀態碼
headerHEADER[operator value]:期望存在響應首部,也可對期望的響應首部的值基於比較操作符和值進行比較
body:期望響應報文的主體部分應該有的內容
註意:僅對nginx plus有效
例子
http配置段如下
vim /etc/nginx/nginx.conf http { ...... upstream websrvs { server 172.18.50.61:80 weight=1; #server 172.18.50.61:80 weight=1 down; server 172.18.50.65:80 weight=2; server 127.0.0.1:8000 backup; #ip_hash; #least_conn; #hash $request_uri; } }
server配置段如下
location / { proxy_pass http://websrvs; }
3 ngx_stream_core_module模塊
實現代理基於TCP,UDP (1.9.13),UNIX-domain sockets的數據流。工作於傳輸層的反向代理或調度器,這個是和http配置段平行的配置。
.1 proxy_pass
proxy_pass address;指定後端服務器地址
.2 proxy_timeout
proxy_timeout timeout;無數據傳輸時,保持連接狀態的超時時長,默認為10m
.3 proxy_connect_timeout
proxy_connect_timeout time;設置nginx與被代理的服務器嘗試建立連接的超時時長,默認為60s
4 語法格式
.4.1、stream{ ... }
定義stream相關的服務;Context:main
stream { upstream telnetsrvs{ server 192.168.22.2:23; server 192.168.22.3:23; least_conn; } server { listen 10.1.0.6:23; proxy_pass telnetsrvs; } }
.4.2、listen
listen address:port [ssl] [udp][proxy_protocol] [backlog=number] [bind][ipv6only=on|off] [reuseport] [so_keepalive=on|off [keepidle]:[keepintvl]:[keepcnt]];
5 示例
vim /etc/nginx/nginx.conf stream { upstream telnetsrvs { server 172.18.50.61:23; server 172.18.50.75:23; least_conn; } server { listen 2323; #註意,這裏的端口不能是代理服務器上已經使用的端口,如23,否則將不會調度 proxy_pass telnetsrvs; proxy_timeout 60s; proxy_connect_timeout10s; } }
本文出自 “陽光運維” 博客,請務必保留此出處http://ghbsunny.blog.51cto.com/7759574/1977244
Nginx 之 實現調度功能