Apache全宕机时需用mod_rewrite检测%{ENV:balancer_worker_route}为空并跳转/maintenance.html,配合ProxyPass /maintenance.html !排除代理、ProxyErrorOverride+ErrorDocument 503双保险,维护页≥256字节。

当后端服务器全部宕机时,Apache 默认会返回原始的 503 错误页(或空白/报错),用户体验差且缺乏品牌一致性。要实现“自动检测全宕机 + 返回本地维护页”,不能只靠 ProxyErrorOverride 或简单配 ErrorDocument,而需结合负载均衡状态感知与重写规则主动接管。
确保使用 mod_proxy_balancer 并启用健康检查
只有在 balancer:// 集群模式下,Apache 才能准确判断“所有节点都不可用”。单后端直连无法触发全宕机逻辑:
- 配置集群而非直连:
<Proxy balancer://myapp><br> BalancerMember http://10.0.1.10:8080 route=node1 healthz=/health retry=5<br> BalancerMember http://10.0.1.11:8080 route=node2 healthz=/health retry=5<br></Proxy>
- 必须启用健康检查路径(如
/health),并设retry=5让故障节点快速冷却、便于状态收敛 - 确认已加载
mod_proxy_balancer和mod_slotmem_shm(默认启用)
用 mod_rewrite 检测无可用路由并跳转
当所有成员都被标记为 down 后,%{ENV:balancer_worker_route} 会为空字符串,这是最可靠的全宕机信号:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 在虚拟主机或
<Location />中添加以下规则:RewriteCond %{ENV:balancer_worker_route} ^$<br>RewriteRule ^(.*)$ /maintenance.html [R=503,L] - 务必把这条规则放在所有
ProxyPass之后、但仍在主请求处理流程中(不要放在<Location /errors>内) - 响应码设为
R=503,既符合语义,也避免被 CDN 或浏览器缓存误判为成功
维护页本身要可直接访问、不走代理
如果 /maintenance.html 被 ProxyPass / http://backend/ 捕获,请求仍会发往后端,导致 502 或无限循环:
- 在主
ProxyPass规则前立即排除该路径:ProxyPass /maintenance.html ! - 确保文件真实存在且路径正确,例如放在
/var/www/html/maintenance.html(即DocumentRoot下) - 维护页 HTML 大小建议 ≥256 字节,防止旧版 IE 强制显示内置错误页
- 若需动态内容(如显示时间),可用 PHP,开头加
<?php http_response_code(503); ?>维持状态码
补充:兜底用 ErrorDocument 防止 rewrite 失效
作为第二道防线,即使 rewrite 规则未命中,也能确保用户看到统一提示:
- 启用接管开关:
ProxyErrorOverride On - 显式指定:
ErrorDocument 503 /maintenance.html - 同样要排除路径:
ProxyPass /maintenance.html !(位置同上) - 注意:仅当 Apache 自身生成 503(如健康检查全失败)时才触发此条;rewrite 触发的是主动跳转,优先级更高

















