严格来讲,nginx是没有针对负载均衡后端节点的健康检查的,可是能够经过proxy_next_upstream来间接实现,但这个仍是会把请求转发给故障服务器的,而后再转发给别的服务器,这样就浪费了一次转发。mysql
nginx_upstream_check_module为淘宝技术团队开发的nginx模快,用来检测后方server的健康状态,若是后端服务器不可用,则因此的请求不转发到这台服务器。nginx
进入nginx源码目录,进行打该模块的补丁(这一步千万不能遗漏)git
patch -p1 < ../nginx_upstream_check_module-master/check_1.5.12+.patch
而后经过./configure --add-module来增长模块github
./configure –add-module=../ nginx_upstream_check_module-master/ 注意:若是以前安装过nginx,须要将以前的configure参数保留
makesql
make以后的操做须要注意后端
若是nginx第一次安装,直接执行make install便可服务器
make install
若是单纯添加模块,不须要install,而是执行如下操做,将打过补丁的nginx二进制文件覆盖/usr/local/nginx/sbin/目录中的文件便可负载均衡
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak cp /nginx源码目录/objs/nginx /usr/local/nginx/sbin/
增长建议配置,后端有8181两个节点tcp
location /{ proxy_pass http://cluster; } upstream cluster { server 127.0.0.1:8181; server 127.0.0.1:8182; #http健康检查相关配置 check interval=3000 rise=2 fall=3 timeout=3000 type=http; #/health/status为后端健康检查接口 check_http_send "HEAD /health/status HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; }
interval: 向后端发送的健康检查包的间隔,单位为毫秒
rsie: 若是连续成功次数达到rise_count,服务器就被认为是up
fall: 若是连续失败次数达到fall_count,服务器就被认为是down
timeout: 后端健康请求的超时时间,单位为毫秒
type: 健康检查包的类型,支持tcp、ssl_hello、http、mysql、ajpui
若是想查看后端服务器实时的健康状态,能够在对应server中增长如下location配置
location /nstatus { check_status; access_log off; #allow SOME.IP.ADD.RESS; #deny all; }
经过http://localhost:8080/nstatus 查看,以下图所示,刚开始后端两个节点都处于中止状态,status为down
server number为后端服务器数量,generation为nginx reload的次数
此时,启动其中一台8181,查看nginx的error.log日志,出现以下日志,说明8181这台应用已经处于可检查状态
2018/09/07 14:07:48 [error] 85860#0: enable check peer: 127.0.0.1:8181
刷新nstatus页面,以下图所示,发现8181这台状态变为了up,表示已链接成功
启动8182,与8181过程相同,最终页面状态变为以下,此时两台状态均为up: