一、为什么要给负载均衡增加健康检查

原笔记把这个案例放在负载均衡算法之后,核心目标很明确:

  • 希望知道后端节点是否健康
  • 希望有一个页面可以直观看到后端状态

在真实集群里,如果某台 Web 已经不可用,但前端负载均衡还继续把请求发过去,就会导致用户直接访问失败。
所以健康检查的意义,就是让 LB 更早发现后端异常。

二、为什么这里没有直接用默认 Nginx

原笔记明确提到:

  • 默认 Nginx 没有这个上游状态检查能力
  • 这里使用的是第三方模块
  • 需要重新编译生成新的 nginx 命令

本次选择的是 Tengine,并额外加入:

  • ngx_http_upstream_check_module
  • ngx_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 头问题

对多节点负载均衡来说,能看到后端健康状态,往往比单纯“会转发请求”更重要。