Apache负载均衡下统一错误页需分三步:一是用failonstatus隔离异常后端,二是用ProxyErrorOverride+ErrorDocument接管502/503/504等网关错误,三是通过重定向或响应头拦截处理后端业务错误。

要让 Apache 在负载均衡场景下对后端异常返回统一、友好的错误页,关键不是“拦截所有错误”,而是分清两类信号:一类是代理层失败(如连不上后端、超时),另一类是后端主动返回的业务错误(如 500、404)。Apache 默认只接管前者,后者需额外配合。配置核心围绕三件事:隔离坏节点、接管网关错误、兜底全部失效。
用 failonstatus 主动标记并隔离异常后端
后端持续返回 503(服务不可用)、429(限流)或 500–599 范围错误,说明它已不可靠。Apache 需立刻将其移出流量池,避免拖垮整个集群:
- 在 ProxyPass 指令后紧跟 failonstatus=503,429 或更宽泛的 failonstatus=500-599
- 该设置仅对
balancer://集群生效,例如:ProxyPass / balancer://mycluster/ failonstatus=503,429 - 触发后,对应 BalancerMember 被标记为 down,进入 retry 冷却期(默认 60 秒),期间不参与调度
- 注意:它不处理网络层断连(如 RST、DNS 失败),这些需靠
timeout和ping探测补充
用 ProxyErrorOverride + ErrorDocument 接管网关错误页
502、503、504 这类“代理失败”错误,Apache 可用本地页面替换原始难看的提示。但 ProxyErrorOverride On 只是开关,必须搭配以下三要素才真正生效:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 显式声明每个状态码对应的本地路径:
ErrorDocument 502 /errors/gateway.html、ErrorDocument 503 /errors/unavailable.html等 - 路径必须以
/开头,且文件真实存在于 DocumentRoot 下(如/var/www/html/errors/50x.html) - 在所有 ProxyPass 规则前加排除项:
ProxyPass /errors/ !,否则请求会被再次代理到后端,导致 404 或循环 - 静态 HTML 页面自动继承原始状态码;若用 PHP 动态生成,开头必须写
<?php http_response_code(503); ?>
当全部后端宕机时跳转至维护页
所有 BalancerMember 都处于 down 状态时,mod_proxy_balancer 默认返回 503。可进一步引导用户到定制维护页,提升体验:
- 最简方式:配
ErrorDocument 503 /maintenance.html,并确保ProxyPass /maintenance.html ! - 更精准方式:启用 mod_rewrite,检查环境变量:
RewriteCond %{ENV:balancer_worker_route} ^$,再重写到维护页 - 维护页应放在 DocumentRoot 下,资源(CSS/JS/图片)也需用根路径引用,并同样排除代理
- 测试时可临时停掉所有后端服务,确认访问主路径是否直接返回维护页且状态码仍是 503
区分并处理后端返回的业务错误
ProxyErrorOverride 不接管后端主动返回的 404、500 等业务错误——它们属于应用逻辑,Apache 默认透传。若需统一呈现,不能依赖 ProxyErrorOverride,而应:
- 要求后端在出错时返回 302 跳转到预设路径(如
/error/500?path=/api/order),再由 Apache 的 ErrorDocument 或 Location 匹配该路径 - 用 mod_rewrite + mod_headers 拦截响应头中的自定义标记(如
X-Backend-Error: true),触发内部重写 - 将 ErrorDocument 指向 PHP 脚本(如
ErrorDocument 500 /err.php),在脚本中读取原始请求并输出内容,同时保持状态码

















