Nginx本身并没有提供一个health check的机制

但在upstream中可以通过配置max_fails和fail_timeout以及proxy_next_upstream这些参数,见之前的这个文章

可以实现,当某个server挂掉后,在多长时间内不再向该server发请求了

但过了那个时间后,nginx仍然后继续给server发请求,如果失败后,则

在error的日志中,我们是能看到类似这样的错误日志的

2011/11/11 16:36:18 [error] 11834#0: *51 connect() failed (111: Connection refused) while connecting to upstream, client: 10.x.x.x

nginx默认是会将该失败的请求再转向另外一个server去处理,所以理论上讲应该不会影响Client端

这样的方式并不是一个真正的健康检测机制,不过可以通过一个第三方的插件healthcheck_nginx_upstreams可以实现这个功能

这个插件貌似现在还有Bug,需要打https://github.com/liseen/healthcheck_nginx_upstreams这么一个patch,然后就能在round robin下实现健康检查了

安装很简单

cd nginx-1.0.9

patch -p1 < cep21-healthcheck_nginx_upstreams-8870d34/healthcheck.patch

./configure --add-module=./cep21-healthcheck_nginx_upstreams-8870d34

配置如下参数即可

healthcheck_enabled;    

healthcheck_delay 1000;    

healthcheck_timeout 2000;    

healthcheck_failcount 3;

healthcheck_send "GET /error.jsp HTTP/1.0" 'Host: xxxx.xxx.com';

当Down掉后台的某台server后,则nginx不会把请求再转发到这台server上,所以error日志中也不会有upstream错误的日志了

可以在nginx里配置一个location,通过web界面去查看health check的状态

location ~ /health {

    healthcheck_status;

    access_log   off;

    allow 10.x.x.x/24;

    deny all;

 }