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