在现代 Web 服务架构中,Nginx 虚拟主机被广泛用于托管多个网站或应用。为了确保服务高可用性,对后端服务器进行健康检查至关重要。本文将从零开始,教小白如何为 Nginx 虚拟主机配置健康检查,即使你从未接触过 Nginx,也能轻松上手!
什么是 Nginx 虚拟主机?
Nginx 虚拟主机(Virtual Host)是指在同一台服务器上通过不同域名或端口运行多个独立网站的能力。例如,你可以用一台服务器同时托管 site1.com 和 site2.com。
为什么需要健康检查?
当你的网站后端由多个服务器(如多台 PHP-FPM 或 Node.js 实例)组成时,某台服务器可能因崩溃、网络问题或资源耗尽而无法响应。如果不做服务器监控,Nginx 可能会继续将请求转发给已宕机的服务器,导致用户看到错误页面。
通过健康检查,Nginx 可以自动探测后端服务器状态,并在发现异常时将其从负载均衡池中移除,从而提升系统稳定性。
Nginx 健康检查的两种方式
官方 Nginx 开源版本不支持主动健康检查(需商业版 Nginx Plus),但我们可以通过以下两种方法实现类似效果:
- 被动健康检查:根据请求失败次数自动标记后端为不可用。
- 结合外部脚本 + reload:使用 shell 或 Python 脚本定期检测后端,动态更新 Nginx 配置并重载。
方法一:使用被动健康检查(推荐新手)
这是最简单的方式,只需在 upstream 块中配置参数即可。Nginx 会在请求失败时自动将服务器标记为“不可用”,并在一段时间后尝试恢复。
# /etc/nginx/conf.d/site.confupstream backend { server 192.168.1.10:8080 max_fails=3 fail_timeout=30s; server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;}server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }} 参数说明:
max_fails=3:允许连续失败 3 次。fail_timeout=30s:30 秒内若失败达到上限,则标记为不可用;30 秒后自动尝试恢复。
方法二:使用外部脚本实现主动健康检查
如果你希望更精确地控制健康检查(比如每 5 秒检测一次),可以编写一个简单的 Bash 脚本:
#!/bin/bash# health_check.shUPSTREAM_FILE="/etc/nginx/conf.d/upstream.conf"TEMP_FILE="/tmp/upstream.tmp"# 清空临时文件echo "upstream backend {" > $TEMP_FILE# 检查每个后端for ip in 192.168.1.10 192.168.1.11; do if curl -s --connect-timeout 2 http://$ip:8080/health &>/dev/null; then echo " server $ip:8080;" >> $TEMP_FILE else echo "[WARN] $ip is DOWN!" fidoneecho "}" >> $TEMP_FILE# 如果配置有变化,更新并重载 Nginxif ! cmp -s $UPSTREAM_FILE $TEMP_FILE; then cp $TEMP_FILE $UPSTREAM_FILE nginx -t && systemctl reload nginx echo "[INFO] Nginx config updated and reloaded."fi 然后用 cron 每 10 秒执行一次:
*/1 * * * * /path/to/health_check.sh >> /var/log/health.log 2>&1 总结
通过本文,你已经学会了如何为 Nginx 虚拟主机配置健康检查。无论是使用简单的被动检查,还是结合脚本实现主动探测,都能显著提升你的服务可靠性。记住,良好的服务器监控是运维工作的基石!
如果你正在搭建高可用 Web 架构,别忘了将 Nginx 配置和健康检查策略纳入整体方案。这样,即使某台后端服务器宕机,你的网站依然能稳定运行!

