1? 概述
本文將介紹ngx_http_upstream_module模塊和ngx_stream_core_module模塊這兩個模塊實現(xiàn)nginx的調(diào)度功能蛾魄。nginx可以通過proxy功能,實現(xiàn)將不同內(nèi)容的訪問調(diào)度到對應(yīng)的機器上。實現(xiàn)了應(yīng)用級的調(diào)度油啤,相關(guān)內(nèi)容見博客《Nginx? 之? 實現(xiàn)代理功能》?
2? ngx_http_upstream_module模塊
該模塊用于將多個服務(wù)器定義成服務(wù)器組,而由proxy_pass,fastcgi_pass等指令進行引用.注意元践,如果nginx上有設(shè)置了proxy_cache.那么訪問的資源如果在nginx上已經(jīng)有緩存了讯蒲,將不會把請求轉(zhuǎn)發(fā)給后臺的服務(wù)器,直接把將緩存返回給客戶端把篓,就不會有調(diào)度的執(zhí)行纫溃,可能同一訪問的得到的結(jié)果是相同的。
.1韧掩、upstream
upstream? name { ... }
定義后端服務(wù)器組紊浩,會引入一個新的上下文,默認(rèn)調(diào)度算法是wrr
Context: http
upstream httpdsrvs{
server ...
server...
...
}
.2疗锐、server
server? address [parameters];
在upstream上下文中server成員坊谁,以及相關(guān)的參數(shù);Context:upstream
address的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE
IP[:PORT]
HOSTNAME[:PORT]
parameters:
weight=number權(quán)重滑臊,默認(rèn)為1
max_conns連接后端報務(wù)器最大并發(fā)活動連接數(shù)口芍,1.11.5后支持
max_fails=number失敗嘗試最大次數(shù);超出此處指定的次數(shù)時雇卷,server將被標(biāo)記為不可用,默認(rèn)為1
fail_timeout=time后端服務(wù)器標(biāo)記為不可用狀態(tài)的連接超時時長鬓椭,默認(rèn)10s
backup將服務(wù)器標(biāo)記為“備用”颠猴,即所有服務(wù)器均不可用時才啟用,相當(dāng)于是sorry server小染,提示用戶翘瓮,注意,這里backup不要用80端口氧映,用其他的虛擬主機來充當(dāng)sorry server,如再開一個端口8000
down標(biāo)記為“不可用”春畔,配合ip_hash使用,實現(xiàn)灰度發(fā)布岛都,灰度發(fā)布律姨,指分批進行發(fā)布上線。
.3臼疫、ip_hash
源地址hash調(diào)度方法
根據(jù)源地址進行調(diào)度择份,同一個源的客戶端調(diào)度到同一臺主機
.4、least_conn
最少連接調(diào)度算法烫堤,當(dāng)server擁有不同的權(quán)重時其為wlc荣赶,當(dāng)所有后端主機連接數(shù)相同時,則使用wrr鸽斟,適用于長連接
.5拔创、hash
hashkey [consistent]基于指定的key的hash表來實現(xiàn)對請求的調(diào)度,此處的key可以直接文本富蓄、變量或二者組合
作用:將請求分類剩燥,同一類請求將發(fā)往同一個upstream server,使用consistent參數(shù)立倍,將使用ketama一致性hash算法灭红,適用于后端是Cache服務(wù)器(如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檢測的頻率娇斑,默認(rèn)為5秒
fails=number:判定服務(wù)器不可用的失敗檢測次數(shù);默認(rèn)為1次
passes=number:判定服務(wù)器可用的失敗檢測次數(shù)材部;默認(rèn)為1次
uri=uri:做健康狀態(tài)檢測測試的目標(biāo)uri悠菜;默認(rèn)為/
match=NAME:健康狀態(tài)檢測的結(jié)果評估調(diào)用此處指定的match配置塊
注意:僅對nginxplus有效,nginxplus為商業(yè)版败富,需要付費
.8match
match name { ... }
對backendserver做健康狀態(tài)檢測時,定義其結(jié)果判斷機制摩窃;只能用于http上下文
.常用的參數(shù):
status ?code[ code ...]:期望的響應(yīng)狀態(tài)碼
headerHEADER[operator value]:期望存在響應(yīng)首部兽叮,也可對期望的響應(yīng)首部的值基于比較操作符和值進行比較
body:期望響應(yīng)報文的主體部分應(yīng)該有的內(nèi)容
注意:僅對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ù)流。工作于傳輸層的反向代理或調(diào)度器鹦聪,這個是和http配置段平行的配置账阻。
.1proxy_pass
proxy_pass? address;指定后端服務(wù)器地址
.2proxy_timeout
proxy_timeout? timeout;無數(shù)據(jù)傳輸時,保持連接狀態(tài)的超時時長泽本,默認(rèn)為10m
.3proxy_connect_timeout
proxy_connect_timeout? time;設(shè)置nginx與被代理的服務(wù)器嘗試建立連接的超時時長淘太,默認(rèn)為60s
4? 語法格式
.4.1、stream{ ... }
定義stream相關(guān)的服務(wù)规丽;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; #注意,這里的端口不能是代理服務(wù)器上已經(jīng)使用的端口赌莺,如23冰抢,否則將不會調(diào)度
proxy_pass telnetsrvs;
proxy_timeout?60s;
proxy_connect_timeout10s;
}
}