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上已經有緩存了,將不會把請求轉發給後臺的服務器,直接把將緩存返回給客戶端,就不會有調度的執行,可能同一訪問的得到的結果是相同的。

.1upstream 

upstream  name { ... }

定義後端服務器組,會引入一個新的上下文,默認調度算法是wrr

Context: http

upstream httpdsrvs{
server ...
server...
...
}

.2server

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端口,用其他的虛擬主機來充當sorry server,如再開一個端口8000

down標記爲不可用,配合ip_hash使用,實現灰度發佈,灰度發佈,指分批進行發佈上線。

.3ip_hash

源地址hash調度方法

根據源地址進行調度,同一個源的客戶端調度到同一臺主機

.4least_conn

最少連接調度算法,當server擁有不同的權重時其爲wlc,當所有後端主機連接數相同時,則使用wrr,適用於長連接

.5hash 

hash   key [consistent]基於指定的keyhash表來實現對請求的調度,此處的key可以直接文本、變量或二者組合

作用:將請求分類,同一類請求將發往同一個upstream server,使用consistent參數,將使用ketama一致性hash算法,適用於後端是Cache服務器(如varnish)時使用

hash $request_uri  consistent; #其中,consistent一致性的hash

hash $remote_addr;

.6keepalive 連接數N;

keepalive n;

爲每個worker進程保留的空閒的長連接數量,可節約nginx端口,並減少連接管理的消耗

.7health_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模塊

 實現代理基於TCPUDP (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.1stream{ ... }

定義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.2listen

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章