一、为什么要给负载均衡增加健康检查¶
原笔记把这个案例放在负载均衡算法之后,核心目标很明确:
- 希望知道后端节点是否健康
- 希望有一个页面可以直观看到后端状态
在真实集群里,如果某台 Web 已经不可用,但前端负载均衡还继续把请求发过去,就会导致用户直接访问失败。
所以健康检查的意义,就是让 LB 更早发现后端异常。
二、为什么这里没有直接用默认 Nginx¶
原笔记明确提到:
- 默认 Nginx 没有这个上游状态检查能力
- 这里使用的是第三方模块
- 需要重新编译生成新的
nginx命令
本次选择的是 Tengine,并额外加入:
ngx_http_upstream_check_modulengx_http_upstream_session_sticky_module
也就是说,这一节不只是写配置文件,还涉及到重新准备带模块的二进制文件。
三、如何编译带健康检查模块的 Tengine¶
原笔记先在一台没有现成 Nginx 的主机上操作,例如 db01:
先下载源码:
wget https://tengine.taobao.org/download/tengine-2.3.3.tar.gz
tar xf tengine-2.3.3.tar.gz
安装依赖:
yum install -y pcre-devel openssl-devel
然后执行一长串 ./configure,其中最关键的部分是:
--add-module=modules/ngx_http_upstream_check_module
--add-module=modules/ngx_http_upstream_session_sticky_module/
最后编译:
make -j 1
原笔记随后用:
./objs/nginx -V
来确认编译出的新命令确实已经带上相关模块。
四、如何把新的 Nginx 命令替换到 LB 主机¶
原笔记的做法是先把新编译出来的可执行文件传到 LB 主机:
scp ./objs/nginx 192.168.1.21:~
然后在 LB 上查看版本信息,确认命令可用。
再把原有二进制备份,替换为新版本:
mv /sbin/nginx /sbin/nginx_1.24.0
mv nginx /sbin/
nginx -V
确认无误后,再重启服务:
pkill nginx
systemctl start nginx
这个过程的重点在于:
- 不是直接在线编译替换业务机
- 而是先在其他主机上生成可用二进制,再替换到 LB
五、健康检查配置文件怎么写¶
原笔记给出的配置如下:
upstream admin_pools {
server 192.168.1.20:80;
server 192.168.1.22:80;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
server_name admin.oldboylinux.cn;
error_log /var/log/nginx/admin-error.log notice;
access_log /var/log/nginx/admin-access.log main;
location / {
proxy_pass http://admin_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /admin_status {
check_status;
access_log off;
allow 192.168.1.0/24;
allow 172.16.1.0/24;
deny all;
}
}
从这份配置里,可以把几个关键指令理解成:
check:定义多久检查一次、失败几次算下线、成功几次算恢复check_http_send:定义发给后端的探测请求报文check_http_expect_alive:定义哪些状态码算健康check_status:在 Web 页面中展示检查结果
六、为什么 check_http_send 里有时还要手动加 Host¶
原笔记特别提醒了一个很容易忽略的问题:
- 健康检查默认可能按 IP 方式访问后端
- 如果后端上有多个虚拟主机
- 不加正确的
Host,健康检查请求就可能命中错误站点
因此在多虚拟主机场景里,更稳妥的写法通常是:
check_http_send "HEAD / HTTP/1.0\r\nHost: lb.oldboylinux.cn\r\n\r\n";
这和普通反向代理里要保留 Host 头,本质上是同一个思路。
七、如何验证状态检查页已经可用¶
原笔记在修改完配置后,先执行:
nginx -t
systemctl reload nginx
然后在浏览器里访问:
http://admin.oldboylinux.cn/admin_status
如果页面能正常展示后端节点状态,就说明:
- 模块已经编译进新版本 Tengine
check_status页面可用- LB 已经具备基本的健康检查展示能力
八、小结¶
这套方案的关键不只是“写一个 /admin_status 页面”,而是先要理解:
- 默认 Nginx 并不自带这类健康检查能力
- 需要借助 Tengine 或第三方模块
- 配置时还要注意虚拟主机下的
Host头问题
对多节点负载均衡来说,能看到后端健康状态,往往比单纯“会转发请求”更重要。