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;
        }
}