Apache自身不支持主备自动故障切换,需依赖Keepalived(VIP漂移)、HAProxy(健康检查)等上层组件实现高可用,配合多层级监控告警与严格切换验证。

Apache 本身不提供主备服务器自动故障切换(failover)能力,它只是一个 Web 服务器,不具备负载均衡或高可用集群的内置调度逻辑。真正实现主备切换、健康检查、自动故障转移和告警,需要在 Apache 上层引入专用组件,如 HAProxy、Keepalived 或 nginx,并配合监控系统(如 Zabbix、Prometheus + Alertmanager)完成闭环。
主备架构中 Apache 的角色定位要清晰
在典型的主备高可用方案中,Apache 通常只负责静态内容服务或反向代理后端应用,其自身不参与“谁是主、谁是备”的决策。真正的主备控制由以下方式实现:
- Keepalived + VIP:通过虚拟 IP(VIP)漂移实现主备切换,Keepalived 定期检查本地 Apache 是否响应(如 curl http://127.0.0.1/health),失败则降权并释放 VIP;备机升权接管 VIP
-
HAProxy 作为前端负载均衡器:配置两个后端 Apache 节点,启用
option httpchk健康检查(如 GET /status 或自定义健康接口),自动屏蔽不可用节点,无需人工干预 - 不要依赖 Apache 自身模块做 failover:mod_proxy_balancer 支持简单轮询和权重,但缺乏主动健康探测与秒级故障摘除能力,不适用于严格主备场景
健康检查接口必须由 Apache 主动暴露
为支持外部组件判断 Apache 状态,需在 Apache 配置中开放轻量、可靠的健康检查端点:
- 启用
mod_status并限制访问:
SetHandler server-status
Require local
然后在 Keepalived 或 HAProxy 中用curl -f http://127.0.0.1/server-status?auto判断返回码是否为 200 - 更推荐自定义轻量接口:新建
/health别名,指向一个极简 HTML 文件(如echo "OK" > /var/www/html/health),避免依赖模块状态,降低误判风险 - 确保该路径不被防火墙或 SELinux 拦截,且 Apache 进程能稳定响应(测试命令:
systemctl is-active httpd && curl -sI http://127.0.0.1/health | head -1)
告警需覆盖多层级异常,不能只盯 Apache 进程
单一进程存活 ≠ 服务可用。有效告警应分层设置:
-
基础设施层:CPU、内存、磁盘使用率超阈值(如 Zabbix 监控
proc.num[httpd]和vfs.fs.size[/,pfree]) -
服务连通层:VIP 是否可达、端口 80/443 是否监听(
netstat -tlnp | grep :80)、健康接口 HTTP 状态码非 200 -
业务逻辑层:模拟真实请求(如
curl -f https://yourdomain.com/login),验证页面关键元素是否存在(配合脚本提取<title></title>或 JSON 字段) - 所有告警建议接入统一通道(邮件、企业微信、钉钉),并设置静默期与升级机制(如 5 分钟未恢复,通知负责人)
切换验证与日志审计不可省略
配置完成后必须实测,且保留可追溯记录:
- 手动停掉主 Apache:
systemctl stop httpd,观察 VIP 是否在 3–5 秒内漂移到备机(ip a | grep inet查看)、HAProxy 后端状态是否变红、业务请求是否持续成功 - 检查 Keepalived 日志:
journalctl -u keepalived -n 50 --no-pager,确认出现Entering MASTER STATE或Transition to MASTER - 开启 Apache 的
LogLevel info和ErrorLog,同时在CustomLog中加入 %{X-Forwarded-For}i 记录真实客户端 IP,便于故障回溯 - 建议将切换事件写入 syslog 并同步到中央日志平台(如 ELK),关键词过滤 “VRRP_Transition”、“backend down” 可快速定位故障窗口

















