在Nginx负载均衡中,我们很难保证说每一台应用服务器都能一直正常的运行下去。但是我们可以通过设置Nginx来检测这些应用服务器,检测这些服务器当中不能访问的。

Nginx的检测方式分为两种,一种是被动监测,另一种是主动监测。下面我们分别看一下这两种方式。

被动监测

当Nginx认为一台应用服务器不能被访问的时候,它会暂时停止向这台应用上面分发请求。直到Nginx认为该应用服务器可以再次被访问的时候才会再向这台应用服务器上面分发请求。
要实现对应用服务器的监测,需要通过两个参数来帮助。

fail_timeout——该参数表示停止分发请求至该应用服务器的时间。也就是说,如果Nginx认为一台应用服务器不能被访问了,则Nginx就会停止向这台应用服务器上分发请求。那需要多长时间Nginx才会认为该服务器可以被访问从而向其分发请求呢。这就需要通过该参数来设置这个时间了。

max_fails——设置访问失败的最大次数。当Nginx向一台服务器分发请求,如果失败的次数达到该参数设置的数量,则Nginx认为该应用服务器不能访问。在接下来的请求就不会再发给该应用服务器。直到达到fail_timeout设置的时间才会再次向这台应用分发请求。

例一

http {
    upstream onmpw {
        server 192.168.144.128;
        server 192.168.144.132 max_fails=3 fail_timeout=30s;
        server 192.168.144.131 max_fails=2;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://onmpw;
        }
    }
}

对于fail_timeout和max_fails的默认值分别为10s和1次。也就是说,当Nginx向一台应用服务器发送请求,如果失败则认为该应用服务器不可访问。接下来的10s中请求不再分发给该应用服务器。直到10s以后会再次将请求分发给该应用服务器。

对于例一,我们看到对于132应用,当请求失败次数达到3次。Nginx会在30s内不再向该应用分发请求。直到30s以后会再次分发新的请求到该应用服务器上。对于131应用,当请求次数达到2次,Nginx就会在10s内(因为没有设置fail_timeout,所以默认为10s)不再向这台应用发送请求。

这种方式需要我们在每台应用服务器对应的信息后面设置,所以称其为被动监测。

主动监测

由Nginx定期的向每台应用服务器发送特殊的请求,来监测应用服务器是否可以正常访问。这种方式称为主动监测。

为了实现主动监测这种方式,我们需要在Nginx负载均衡的配置文件中加入health_check指令。除此之外,我们还需要在设置应用服务器信息的组里加入zone指令。

例二

http {
upstream onmpw {
           zone onmpw 64k;
        server 192.168.144.128;
        server 192.168.144.132;
        server 192.168.144.131;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://onmpw;
                           health_check;
        }
    }
}

在这里我们设置了一组应用服务器。通过一个单一的location,将所有的请求都分发到这组应用服务器上。在这种情况下,每隔5s Nginx Plus就会向每一台应用服务器发送’/’请求。任何一台应用服务器连接错误或者响应超时亦或者是被代理的服务器响应了一个状态码2xx或者是3xx,health_check机制就会认为是失败的。对于任何一台应用服务器,如果health_check失败,则就会被认为是不稳定的。那么Nginx Plus就不再向这台应用服务器分发访问请求。

zone指令定义了一块儿内存空间。这块儿空间存储在各个工作进程中共享的运行环境的状态和应用服务器组的配置信息。这块儿空间应该根据实际情况尽量申请的大一些,要保证能存下这些信息。

下面我们再看这样的一个例子

例三

location / {
    proxy_pass http://onmpw;
    health_check interval=10 fails=3 passes=2;
}

在上面的例三中,interval=10表示两次进行health_check的间隔为10s,如果不设置默认两次的间隔是5s。fails=3表示一台应用服务器如果请求失败次数达到3次,则该应用服务器被认为不能访问。最后是passes=2表示,被认定为不能访问的服务器需要再次进行两次health_check 以后才会再次被认为是可以正常访问的。

在health_check中,我们可以指定请求的url。

例四

location / {
    proxy_pass http://onmpw;
    health_check uri=/some/path;
}

对于onmpw组中的第一台应用服务器128来说,一次health check请求的url是http://192.168.144.128/some/path。

上面两种监测方式是普遍被使用的,希望本文对大家有所帮助。

Nginx负载均衡health_check分析的更多相关文章

  1. Nginx负载均衡和LVS负载均衡的比较分析(转)

    Nginx负载均衡和LVS负载均衡的比较分析 作者:匿名 来源:ChinaZ源码报导 浏览:1032次 2011-12-6 15:12:27 字号:大 中 小 [摘要]Nginx是一个高性能的 HTT ...

  2. 对比Haproxy和Nginx负载均衡效果

    为了对比Hproxy和Nginx负载均衡的效果,分别在测试机上(以下实验都是在单机上测试的,即负载机器和后端机器都在一台机器上)做了这两个负载均衡环境,并各自抓包分析.下面说下这两种负载均衡环境下抓包 ...

  3. 解析nginx负载均衡

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://baidutech.blog.51cto.com/4114344/1033718 ...

  4. Nginx 负载均衡-加权轮询策略剖析

    本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别(Nginx根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更 ...

  5. 浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

    1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...

  6. Nginx负载均衡中后端节点服务器健康检查的操作梳理

    正常情况下,nginx做反向代理,如果后端节点服务器宕掉的话,nginx默认是不能把这台realserver踢出upstream负载集群的,所以还会有请求转发到后端的这台realserver上面,这样 ...

  7. nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理

    Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案.nginx可以用轮询.IP哈希.URL哈希等方式调度后端服务器,同时也能提供健康检查功能 ...

  8. Haproxy和Nginx负载均衡测试效果对比记录

    为了对比Hproxy和Nginx负载均衡的效果,分别在测试机上(以下实验都是在单机上测试的,即负载机器和后端机器都在一台机器上)做了这两个负载均衡环境,并各自抓包分析.下面说下这两种负载均衡环境下抓包 ...

  9. Nginx负载均衡中后端节点服务器健康检查的一种简单方式

    摘自:https://cloud.tencent.com/developer/article/1027287 一.利用nginx自带模块ngx_http_proxy_module和ngx_http_u ...

随机推荐

  1. 0926mysql中MRR的用法

    转自 http://blog.itpub.net/22664653/viewspace-1673682  [MySQL]MySQL5.6新特性之Multi-Range Read 2015-05-27 ...

  2. 如何实现网卡bond

    https://jingyan.baidu.com/article/375c8e19da666325f2a229f7.html

  3. [jQuery]$.get跨域提交不发送原因

    使用 $.ajax({ url: "http://pastebin.com/embed_js.php?i=sy9gt3FR", dataType: "jsonp" ...

  4. POJ 2008

    这道题,说实话,细节很多.不过,我没想到,光细节就能搞死人了... 参考了http://www.cppblog.com/varg-vikernes/archive/2010/03/12/109559. ...

  5. hadoop1.0.4升级到hadoop2.2 具体流程步骤

     hadoop1.x 升级到hadoop2.2 本文參考了博客:http://blog.csdn.net/ajax_jquery/article/details/27311671,对一些地方做了改动. ...

  6. unity font研究小结

    项目用ngui制作的界面.字体使用了unity默认的Arial,公布后在一些android手机上发现中文不显示,就此作了一些调查. 參考unity的font说明文档:http://docs.unity ...

  7. maven 自建库

    maven repository 标签: mavenjarxmlserver工具磁盘 2009-11-26 10:56 42322人阅读 评论(7) 收藏 举报   目录(?)[+]   什么是Mav ...

  8. Mule ESB-3.Build a webservice proxy

    自从引入ESB后,系统之间不再直接依赖.我负责的这块,主要是解决Webservice的问题.使系统A不再直接依赖系统B的Webservice. 我们选择的产品是Mule ESB.所以自然要使用Mule ...

  9. BZOJ 4517: [Sdoi2016]排列计数 错排+逆元

    4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i, ...

  10. declare-styleable的使用

    declare-styleable:declare-styleable是给自定义控件添加自定义属性用的. 1.首先,先写attrs.xml 在res-vlaues文件夹下创建资源文件attrs.xml ...