apache可通过mod_proxy+failonstatus实现软故障转移,并用errordocument返回降级页;结合mod_rewrite预判性切换及响应头控制缓存,保障服务可用性与用户体验。
apache 本身不内置故障转移逻辑,但可以通过反向代理 + 健康检查 + 自定义错误页组合实现“软故障转移”,并在后端全部不可用时自动展示降级页面,保障用户看到友好提示而非空白或超时错误。
用 mod_proxy + ProxyPass 和 failonstatus 实现基础故障感知
Apache 的 mod_proxy 支持对后端做简单健康探测。关键不是实时心跳,而是通过 HTTP 状态码判断服务是否“活着”:
- 在
ProxyPass后添加failonstatus=500,502,503,504,让 Apache 在收到这些错误响应时,将该后端标记为临时失效(默认 60 秒) - 配合
balancer://定义多个后端,并启用lbmethod=byrequests或bytraffic - 示例配置片段:
ProxyPass / balancer://myapp/ lbmethod=byrequests <proxy balancer:> BalancerMember http://192.168.1.10:8080 retry=30 failonstatus=500,502,503,504 BalancerMember http://192.168.1.11:8080 retry=30 failonstatus=500,502,503,504 </proxy>
用 ErrorDocument 指向本地降级页,覆盖所有失败场景
当所有后端都不可用、连接超时、或代理自身出错时,Apache 会返回标准错误码(如 503 Service Unavailable)。这时靠 ErrorDocument 拦截并返回静态 HTML 页面:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 把降级页(如
/var/www/html/maintenance.html)设为只读、无依赖的纯 HTML+CSS,不加载 JS 或外部资源 - 在虚拟主机或目录配置中加入:
ErrorDocument 503 /maintenance.htmlErrorDocument 502 /maintenance.htmlErrorDocument 504 /maintenance.html - 确保该路径被
Alias或 DocumentRoot 覆盖,且 Apache 有读取权限
增强可用性:用 mod_rewrite 预判性降级
仅靠后端返回 5xx 不够及时。可在 Apache 层加一层轻量探测,比如用 mod_rewrite 检查一个本地健康探针文件是否存在:
- 部署一个脚本(如
/var/run/app-up),由监控系统或部署流程写入/删除 - 配置重写规则:
RewriteCond /var/run/app-up !-f RewriteRule ^(.*)$ /maintenance.html [L]
- 这样即使后端还没彻底挂,只要运维主动触发“维护模式”,流量立刻切到降级页
注意缓存与客户端体验
降级页本身要避免被 CDN 或浏览器缓存太久,影响恢复后及时刷新:
- 在降级页响应头中设置:
Header set Cache-Control "no-cache, no-store, must-revalidate"Header set Pragma "no-cache"Header set Expires "0" - 页面内建议加一句“我们正在紧急修复,预计 X 分钟内恢复”,提升用户信任感









