给Nginx加上监控检查机制
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;
}