宝塔默认Nginx不支持健康检查,因未编译nginx_upstream_check_module模块;需通过nginx -V验证,若无upstream_check则须手动编译添加,或改用max_fails+proxy_next_upstream被动探测方案。

宝塔默认Nginx不支持健康检查,别白忙活
宝塔面板自带的 Nginx(无论免费版还是专业版)默认**不编译** nginx_upstream_check_module 模块。你直接在 upstream 块里写 check interval=3,保存后点重载——Nginx 会报错:unknown directive "check",配置根本加载不了。
这不是你配置错了,是模块压根不存在。官方没集成,宝塔也没打包进去。想用主动探测,必须自己动手补模块或换内核。
验证当前Nginx是否支持 check 指令
别猜,先确认。SSH 登录宝塔服务器,执行:
nginx -V 2>&1 | grep -o 'upstream_check'
如果返回空,说明不支持;若输出 upstream_check,恭喜,可以直接跳到下一步写配置。
常见错误现象:
- 配置里加了
check却没报错 → 实际是被忽略,探测根本没跑 -
nginx -t通过,但日志里反复出现no live upstreams→ 后端全被静默标记为 down,因为探测失败却无反馈
手动启用健康检查的三步实操
前提是你的 Nginx 版本 ≥1.10(宝塔常用 1.20+ 没问题),且你有编译权限。步骤不能跳:
- 下载对应 Nginx 源码包(版本号必须和
nginx -v完全一致) - 下载
nginx_upstream_check_module补丁(GitHub 官方 repo,注意分支匹配) - 重新 configure + make + make install,保留原 conf 目录和证书路径,否则宝塔会丢配置
编译完成后,在 upstream 块中加入探测参数:
upstream backend_cluster {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
check interval=3 rise=2 fall=5 timeout=1 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}注意:check_http_send 必须是合法 HTTP 请求行,结尾两个 \r\n 缺一不可;check_http_expect_alive 决定什么状态码算“活着”,别只写 http_2xx ——有些服务健康接口返回 302 也算正常。
没模块时的替代方案:被动剔除 + 轮询兜底
如果你不想编译,或生产环境不允许停机重装 Nginx,就靠 Nginx 原生机制保底:
- 在
server行后面加max_fails=2 fail_timeout=10s:连续 2 次超时(默认 60s)就踢出 10 秒 - 务必设
proxy_next_upstream error timeout http_500 http_502 http_503 http_504:遇到这些响应才转发给下一台 - 所有后端必须提供真实可访问的
/health接口,哪怕只是返回 200 ——你得自己用脚本定期 curl 它,发现异常就手动下线节点
这个方案不会自动“恢复”节点,fail_timeout 时间一到,它就自动回归流量池。但没人告诉你它什么时候恢复,也没法看到状态。最容易被忽略的是:proxy_next_upstream 默认**不包含** http_500,意味着后端崩了返回 500,Nginx 还是把错误甩给用户,而不是切走。


















