Nginx可在后端全宕机时返回本地维护页而非502/503错误,需三步:开启proxy_intercept_errors、配置error_page映射至/maintenance.html并设置root/alias、通过proxy_next_upstream等参数强化upstream容错。

当所有后端服务不可用时,Nginx 可以主动接管请求,返回一个本地静态维护页,而不是直接抛出 502/503 错误。这依赖三个核心配合:开启错误拦截、精准映射错误码、设置合理的重试策略,确保只在“最终失败”时才触发降级。
启用错误拦截开关
默认情况下,Nginx 不会拦截后端返回的 4xx/5xx 响应,必须显式开启:
- 在具体 location 块内(如
location /api/)添加proxy_intercept_errors on; - 不要放在
http或server级,避免影响静态资源等非代理路径 - 它只对后端返回的 4xx/5xx 响应生效,也包括 Nginx 自身生成的 502/503/504,但不处理 200 状态下的业务错误体
定义错误码映射与维护页入口
仅开启拦截还不够,必须告诉 Nginx 遇到哪些错误时跳转到哪:
- 写法示例:
error_page 500 502 503 504 = /maintenance.html; - 注意末尾的
=:表示将原始状态码替换为 200,用户看到的是正常响应,利于前端友好展示 -
/maintenance.html是 URI 路径,不是文件系统路径,需配套定义对应location = /maintenance.html - 该 location 中需指定
root或alias,指向真实 HTML 文件所在目录,并确保mime.types已加载(或显式声明types { text/html html; })
配置 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才会生效
验证是否生效
最直接的方式是模拟全宕机场景:
- 临时停掉全部 upstream 后端服务
- 执行
curl -v http://your-domain/some-path - 确认返回状态码为 200,响应体是维护页内容,且响应头中无 5xx 状态痕迹
- 可额外加
add_header X-Maintenance "true";到维护页 location 中,便于监控识别


















