Apache代理本身不提供维护模式功能,但可通过Location+ErrorDocument拦截请求并返回503维护页,配合SetEnvIfFileExists开关文件实现即时启停,支持路径粒度控制、运维IP直通及健康检查自动降级。

Apache 代理本身不提供“维护模式”功能,但可以通过配置灵活实现对后端服务的统一维护控制——核心思路是:在请求到达后端前,由 Apache 主动拦截并返回预设的维护页面或状态码,而非转发请求。这比在每个后端单独部署维护页更集中、更可靠。
用 Location + ErrorDocument 实现全局维护开关
这是最轻量、可即时启停的方式。只需修改 Apache 配置(无需重启 httpd),通过一个开关文件或环境变量控制是否启用维护。
- 在虚拟主机或主配置中定义维护路径拦截逻辑:
<Location "/>
SetEnvIfNoCase Request_URI "^/.*" MAINTENANCE_ON
# 检查是否存在维护标记文件(如 /var/run/apache-maint)
SetEnvIfFileExists "/var/run/apache-maint" MAINTENANCE_ON
Require env !MAINTENANCE_ON
</Location>
- 配合自定义错误页:
ErrorDocument 503 /maintenance.html
Alias /maintenance.html /var/www/html/maintenance.html
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用维护时,只需创建空文件:touch /var/run/apache-maint
- 恢复服务时,删除该文件:rm /var/run/apache-maint
- 确保 mod_setenvif 和 mod_alias 已启用
按路径粒度控制维护范围
不是所有接口都需要停,比如管理后台要维护,但健康检查和静态资源仍需可用。这时用多个
- 只对 API 路径启用维护:
<Location "/api/">
SetEnvIfFileExists "/var/run/maint-api" MAINTENANCE_API
Require env !MAINTENANCE_API
</Location>
ErrorDocument 503 /api-maintenance.html
- 同时保留 /health、/favicon.ico、/static/ 等路径直通后端
结合健康检查自动触发维护
当所有后端节点都不可用时,Apache 可自动降级为维护态(避免用户看到 503 或超时):
- 启用 mod_proxy_hcheck 并配置主动探测
- 在
块中设置:ProxySet failonstatus=500,502,503,504 - 用 RewriteCond 判断 balancer 成员全 down(需配合 mod_rewrite 和自定义环境变量)
- 更稳妥的做法是:用外部脚本监控 balancer-manager 输出,检测到无可用成员时自动写入维护标记文件
维护期间保留关键能力
真正的“统一维护”不是全站瘫痪,而是有选择地保活:
- 允许运维 IP 直通(绕过维护):Require ip 10.10.10.0/24 放在
内 - 放行 /healthz 接口供监控系统探测:<Location "/healthz"> Require all granted </Location>
- 返回标准 503 + Retry-After 头,便于上游网关重试:Header always set Retry-After "300"

















