apache默认返回503时,可通过errordocument 503 /maintenance.html配合proxypass和健康检查配置,使所有后端宕机时自动返回本地静态维护页,无需hot standby或外部工具。

当所有后端服务器都宕机时,Apache 默认会返回 503 Service Unavailable 错误。要实现“自动 fallback 到本地静态备用页面”,不能依赖 status=+H(Hot Standby 是后端节点,不是本地页面),而是需结合 ProxyPass 的 failonstatus、retry 控制 + ErrorDocument + 本地内容响应逻辑来实现。
核心思路是:
让 Apache 在所有 BalancerMember 均不可用时,不再尝试转发,而是由自身直接返回一个预置的本地 HTML 页面(如 /maintenance.html),且该页面需能被 Apache 直接服务(不经过代理)。
✅ 正确配置步骤(Apache 2.4+)
1. 确保模块已启用
必须加载以下模块(检查 httpd -M | grep -E 'proxy|slotmem'):
mod_proxymod_proxy_balancermod_proxy_http-
mod_slotmem_shm(关键!否则健康状态无法共享) -
mod_rewrite(可选,用于更精细控制) -
mod_alias(确保能映射本地路径)
Debian/Ubuntu:
sudo a2enmod proxy proxy_http proxy_balancer slotmem_shm alias
CentOS/RHEL:确认httpd.conf中对应LoadModule行未被注释。
2. 定义带健康检查的负载均衡组(禁用全部后端后触发 fallback)
<proxy balancer:>
BalancerMember http://node1.example.com:8080 \
loadfactor=1 \
timeout=3 \
retry=10 \
ping=3 \
failonstatus=500,502,503,504
BalancerMember http://node2.example.com:8080 \
loadfactor=1 \
timeout=3 \
retry=10 \
ping=3 \
failonstatus=500,502,503,504
ProxySet lbmethod=byrequests
</proxy>
⚠️ 关键点:
-
failonstatus让 Apache 把 5xx 响应也视为失败,加快摘除判断; -
retry=10表示节点失败后 10 秒内不重试,避免雪崩; - 所有后端失效后,
balancer://backend整体状态变为down,此时ProxyPass将不再转发,转而触发ErrorDocument。
3. 配置主代理规则 + fallback 触发机制
# 关闭正向代理(安全必需)
ProxyRequests Off
# 主路径全部走负载均衡
ProxyPass / balancer://backend/
ProxyPassReverse / balancer://backend/
# 当所有后端不可用时,返回本地维护页
ErrorDocument 503 /maintenance.html
# 确保 /maintenance.html 可被直接访问(不走代理)
Alias /maintenance.html /var/www/html/maintenance.html
<files>
Require all granted
</files>
✅ 效果:
- 正常时:请求走
balancer://backend; - 所有后端挂掉 → Apache 探测失败 →
ProxyPass返回 503 → 自动渲染/maintenance.html; - 页面完全静态,不依赖任何后端,秒级响应。
4. 准备本地备用页面(示例)
创建文件 /var/www/html/maintenance.html:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<title>Maintenance Mode</title><h1>? We're currently performing maintenance</h1>
<p>Please check back shortly.</p>
<small>Time: <span id="time"></span></small>
<script>document.getElementById('time').textContent = new Date().toLocaleString()</script>
✅ 提示:该页面支持 CSS/JS,但不要引用外部资源(CDN、API),保证离线可用。
5. (可选)增强健壮性:加一层 Rewrite 判断
如果希望更早拦截(比如在首次探测就失败时立刻返回维护页),可加:
RewriteEngine On
RewriteCond %{ENV:balancer_worker_route} ^$
RewriteCond %{ENV:balancer_worker_status} ^$
RewriteRule ^ - [R=503,L]
但实际中 ErrorDocument 503 已足够可靠,无需复杂化。
不需要额外脚本、不依赖外部工具、不修改后端代码 —— 这就是 Apache 原生支持的“全后端宕机 → 本地降级页面”方案。










