Nginx源站不可用时返回自定义维护页需三步:启用proxy_intercept_errors on(限location级)、用error_page 500 502 503 504 = /maintenance.html映射并配internal alias定位文件、强化upstream重试策略确保兜底。

在 Nginx 的 server 块中配置源站不可用时的自定义维护页面,关键不是“跳转”,而是让 Nginx 在确认后端彻底失败后,主动返回一个本地静态页,并保持语义正确(如 503 状态码)、路径隐藏、用户体验友好。核心靠三部分协同:错误拦截开关、错误码映射、以及可靠的 upstream 容错策略。
启用 proxy_intercept_errors 并限定作用范围
默认情况下,Nginx 不会接管后端返回的 502/503/504,必须显式开启拦截:
- 在具体代理 location 中添加
proxy_intercept_errors on;,不要放在http或server级,避免影响静态资源等非代理路径 - 它只对后端返回的 4xx/5xx 响应生效,也包括 Nginx 自身生成的 502/503/504,但不处理 200 状态下的业务错误体
用 error_page 映射错误码到本地维护页
仅开启拦截还不够,必须告诉 Nginx 遇到哪些错误时返回什么内容:
- 写法示例:
error_page 500 502 503 504 = /maintenance.html;,注意末尾的=表示将原始状态码替换为 200,用户看到的是正常响应,利于前端展示 -
/maintenance.html是 URI 路径,不是文件系统路径,需配套定义location = /maintenance.html - 该 location 中必须指定
root或alias,指向真实 HTML 文件所在目录;推荐用alias避免路径拼接歧义,例如:alias /usr/share/nginx/html/maintenance.html; - 加上
internal;指令,禁止用户直接访问该路径,防止维护页被暴露
强化 upstream 容错,确保维护页是最终兜底
如果重试机制没配好,可能单个后端短暂超时就触发维护页,失去容错意义:
- 在
upstream或对应location中启用重试:proxy_next_upstream error timeout http_502 http_503 http_504; - 限制最大重试次数:
proxy_next_upstream_tries 2;,避免无限轮询 - 收紧超时时间:
proxy_connect_timeout 1s;、proxy_read_timeout 3s;,加快失败判定 - 只有所有后端节点都按策略重试失败后,Nginx 才生成最终错误响应,此时
error_page才会生效
验证与补充细节
配置完成后,务必检查并测试:
- 运行
nginx -t确认语法无误,再nginx -s reload生效 - 临时停掉所有后端服务,用
curl -I查看响应头是否为 200(若用了=)或 503(若未替换),同时检查 body 是否为维护页内容 - 确保维护页文件存在、Nginx 工作进程有读取权限(如
chmod 644)、MIME 类型已加载(include mime.types;) - 可选添加响应头:
add_header Retry-After "60";,告知客户端或爬虫稍后重试


















