Apache代理不自动美化502/503/504错误页,需组合failonstatus隔离故障节点、ProxyErrorOverride+ErrorDocument统一错误页、mod_rewrite检测全宕机跳转维护页,并通过balancer-manager和自定义日志提升可观测性。

Apache 代理本身不自动美化或接管后端返回的 502/503/504 等错误页,但可通过组合配置实现“自动隔离故障节点 + 统一展示友好错误页 + 兜底降级”,关键不是重试或隐藏错误,而是让问题可感知、可响应、可恢复。
用 failonstatus 主动下线异常后端
当后端返回特定业务错误码(如 503 表示服务不可用、429 表示限流),应立刻停止向它转发请求,避免雪崩:
- 必须搭配 balancer:// 集群使用,写在 ProxyPass 后面,例如:
ProxyPass / balancer://mycluster/ failonstatus=503,429 - 支持范围写法:
failonstatus=500-599,适合兜底拦截全部服务端错误 - 触发后该节点被标记为 down,并进入 retry 冷却期(默认 60 秒),期间不参与负载
- 注意:它只对完整 HTTP 响应生效;连接超时、RST、DNS 失败等需靠 timeout、ping、keepalive 单独调优
用 ProxyErrorOverride + ErrorDocument 统一错误页
用户不该看到原始 502 页面,而应看到品牌一致的提示——这需要显式接管,而非仅开启开关:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 先启用接管开关:
ProxyErrorOverride On - 再为每个状态码指定本地路径:
ErrorDocument 502 /errors/50x.htmlErrorDocument 503 /errors/50x.htmlErrorDocument 504 /errors/50x.html - 路径必须以 / 开头,且文件真实存在于 DocumentRoot 下(如
/var/www/html/errors/50x.html) - 立即排除该路径,防止被二次代理:
ProxyPass /errors/ !(这条必须写在主 ProxyPass 规则之前) - 静态 HTML 默认保持原始状态码;若用 PHP 动态生成,开头加
<?php http_response_code(502); ?>
全后端宕机时跳转维护页
当所有节点都被标记为 down(健康检查全失败),需触发最终降级策略,避免用户卡在空白或报错页:
- 最简方式:配
ErrorDocument 503 /maintenance.html,并确保ProxyPass /maintenance.html ! - 更精准方式:用 mod_rewrite 检测无可用路由:
RewriteCond %{ENV:balancer_worker_route} ^$RewriteRule ^(.*)$ /maintenance.html [R=503,L] - 维护页建议 ≥256 字节,避免旧浏览器强制显示默认错误页
通过日志和管理页快速定位问题
错误处理的价值不仅在于用户侧体验,更在于运维可观测性:
- 启用 balancer-manager:添加
<location>Require ip 10.0.0.0/8</location>,内网访问即可查看各节点实时状态(Ok/Err/Dis)、失败次数、上次检查时间 - 结构化记录故障信息:自定义日志格式加入
%{BALANCER_WORKER_ROUTE}e和%{BALANCER_NAME}e,便于对接 ELK 或 Prometheus - 调试时临时启用
LogLevel proxy:debug(生产环境建议设为 warn)

















