1? 概述
本文將介紹ngx_http_upstream_module模塊和ngx_stream_core_module模塊這兩個模塊實現(xiàn)nginx的調度功能。nginx可以通過proxy功能,實現(xiàn)將不同內容的訪問調度到對應的機器上。實現(xiàn)了應用級的調度,相關內容見博客《Nginx? 之? 實現(xiàn)代理功能》?
2? ngx_http_upstream_module模塊
該模塊用于將多個服務器定義成服務器組,而由proxy_pass,fastcgi_pass等指令進行引用.注意,如果nginx上有設置了proxy_cache.那么訪問的資源如果在nginx上已經有緩存了,將不會把請求轉發(fā)給后臺的服務器,直接把將緩存返回給客戶端,就不會有調度的執(zhí)行,可能同一訪問的得到的結果是相同的。
.1、upstream
upstream? name { ... }
定義后端服務器組,會引入一個新的上下文,默認調度算法是wrr
Context: http
upstream httpdsrvs{
server ...
server...
...
}
.2、server
server? address [parameters];
在upstream上下文中server成員,以及相關的參數(shù);Context:upstream
address的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE
IP[:PORT]
HOSTNAME[:PORT]
parameters:
weight=number權重,默認為1
max_conns連接后端報務器最大并發(fā)活動連接數(shù),1.11.5后支持
max_fails=number失敗嘗試最大次數(shù);超出此處指定的次數(shù)時,server將被標記為不可用,默認為1
fail_timeout=time后端服務器標記為不可用狀態(tài)的連接超時時長,默認10s
backup將服務器標記為“備用”,即所有服務器均不可用時才啟用,相當于是sorry server,提示用戶,注意,這里backup不要用80端口,用其他的虛擬主機來充當sorry server,如再開一個端口8000
down標記為“不可用”,配合ip_hash使用,實現(xiàn)灰度發(fā)布,灰度發(fā)布,指分批進行發(fā)布上線。
.3、ip_hash
源地址hash調度方法
根據(jù)源地址進行調度,同一個源的客戶端調度到同一臺主機
.4、least_conn
最少連接調度算法,當server擁有不同的權重時其為wlc,當所有后端主機連接數(shù)相同時,則使用wrr,適用于長連接
.5、hash
hashkey [consistent]基于指定的key的hash表來實現(xiàn)對請求的調度,此處的key可以直接文本、變量或二者組合
作用:將請求分類,同一類請求將發(fā)往同一個upstream server,使用consistent參數(shù),將使用ketama一致性hash算法,適用于后端是Cache服務器(如varnish)時使用
hash $request_uri? consistent; #其中,consistent一致性的hash
hash $remote_addr;
.6、keepalive連接數(shù)N;
keepalive n;
為每個worker進程保留的空閑的長連接數(shù)量,可節(jié)約nginx端口,并減少連接管理的消耗
.7、health_check
health_check [parameters];
健康狀態(tài)檢測機制;只能用于location上下文
常用參數(shù):
interval=time檢測的頻率,默認為5秒
fails=number:判定服務器不可用的失敗檢測次數(shù);默認為1次
passes=number:判定服務器可用的失敗檢測次數(shù);默認為1次
uri=uri:做健康狀態(tài)檢測測試的目標uri;默認為/
match=NAME:健康狀態(tài)檢測的結果評估調用此處指定的match配置塊
注意:僅對nginxplus有效,nginxplus為商業(yè)版,需要付費
.8match
match name { ... }
對backendserver做健康狀態(tài)檢測時,定義其結果判斷機制;只能用于http上下文
.常用的參數(shù):
status ?code[ code ...]:期望的響應狀態(tài)碼
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模塊
實現(xiàn)代理基于TCP,UDP (1.9.13),UNIX-domain sockets的數(shù)據(jù)流。工作于傳輸層的反向代理或調度器,這個是和http配置段平行的配置。
.1proxy_pass
proxy_pass? address;指定后端服務器地址
.2proxy_timeout
proxy_timeout? timeout;無數(shù)據(jù)傳輸時,保持連接狀態(tài)的超時時長,默認為10m
.3proxy_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;
}
}