Nginx 之 实现调度功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
        }
}


本文出自 “阳光运维” 博客,请务必保留此出处http://ghbsunny.blog.51cto.com/7759574/1977244

以上是关于Nginx 之 实现调度功能的主要内容,如果未能解决你的问题,请参考以下文章

Nginx调度器 Nginx常见问题

java nginx监控服务程序调度算法实现的代码

nignx的TCP和UDP调度(nginx反向代理)

15_Nginx反向代理Nginx的TCP/UDP调度器Nginx常见问题处理

tomcat之nginx调度

玩转Linux系统之轻松搭建Nginx服务