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 上已經有 WordPress 加速緩存了,將不會把請求轉發給後台的站羣服務器,直接把將 WordPress 加速緩存返回給客户端,就不會有排程的執行,可能同一訪問的得到的結果是相同的。
.1 、 upstream
upstream name { … }
定義後端站羣服務器組,會引入一個新的上下文,預設排程演算法是 wrr
Context: http
1
2
3
4
5
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 權重,預設為 1
max_conns 連線後端報務器最大併發活動連線數,1.11.5 後支援
max_fails=number 失敗嘗試最大次數;超出此處指定的次數時,server 將被標記為不可用, 預設為 1
fail_timeout=time 後端站羣服務器標記為不可用狀態的連線超時時長,預設 10s
backup 將站羣服務器標記為 “備用”,即所有站羣服務器均不可用時才啓用,相當於是 sorry server,提示使用者,注意,這裏 backup 不要用 80 埠,用其他的虛擬 WordPress 主機來充當 sorry server, 如再開一個埠 8000
down 標記為 “不可用”,配合 ip_hash 使用,實現灰度釋出,灰度釋出,指分批進行釋出上線。
.3 、 ip_hash
源地址 hash 排程方法
根據源地址進行排程,同一個源的客户端排程到同一台 WordPress 主機
.4 、 least_conn
最少連線排程演算法,當 server 擁有不同的權重時其為 wlc,當所有後端 WordPress 主機連線數相同時,則使用 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 配置段如下
1
2
3
4
5
6
7
8
9
10
11
12
13
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 配置段如下
1
2
3
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
1
2
3
4
5
6
7
8
9
10
11
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
1
listen address:port [ssl] [udp][proxy_protocol] [backlog=number] [bind][ipv6only=on|off] [reuseport] [so_keepalive=on|off [keepidle]:[keepintvl]:[keepcnt]];
5 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
}
}