设为首页 收藏本站
查看: 966|回复: 0

[经验分享] Nginx 之 实现调度功能

[复制链接]

尚未签到

发表于 2018-11-8 06:53:30 | 显示全部楼层 |阅读模式
  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上已经有缓存了,将不会把请求转发给后台的服务器,直接把将缓存返回给客户端,就不会有调度的执行,可能同一访问的得到的结果是相同的。
  .1、upstream
  upstream  name { ... }
  定义后端服务器组,会引入一个新的上下文,默认调度算法是wrr
  Context: http
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端口,用其他的虚拟主机来充当sorry server,如再开一个端口8000
  down标记为“不可用”,配合ip_hash使用,实现灰度发布,灰度发布,指分批进行发布上线。
  .3、ip_hash
  源地址hash调度方法
  根据源地址进行调度,同一个源的客户端调度到同一台主机
  .4、least_conn
  最少连接调度算法,当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用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配置段如下
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模块
  实现代理基于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
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
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;
  
        }
  
}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-632073-1-1.html 上篇帖子: nginx优化压力测试 下篇帖子: zabbix应用之nginx统一监控
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表