要让Nginx在后端不可用时展示定制页面并具备故障转移能力,需四步:开启proxy_intercept_errors、用error_page绑定错误码与内部路径、配置internal location提供静态资源、启用proxy_next_upstream自动重试。

要让 Nginx 在后端不可用(如返回 502/504)时展示定制化页面,同时具备基本故障转移能力,不能只改一个 HTML 文件。核心是把「拦截错误 → 替换响应 → 防止直访 → 自动重试」四步串起来,缺一不可。
必须开启 proxy_intercept_errors
这是整个机制的开关。Nginx 默认把后端返回的 502、504 当作“正常响应”直接透传,不拦截就不会触发 error_page。
- 必须写在包含
proxy_pass的location块内 - 加上:
proxy_intercept_errors on; - 它只对后端返回的 4xx/5xx 状态码起作用;如果后端返回 200 但内容是错误信息,Nginx 不管
用 error_page 绑定错误码与内部路径
指定哪些状态码跳转到哪个内部 URI,注意写法决定是否保留原始状态码:
- 想保留 502 状态码(便于前端识别重试),写成:
error_page 502 =502 /error-502.html; - 想统一返回 503(语义更准确),可写:
error_page 502 504 =503 /maintenance.html; - 多个错误码可以合并配置,避免重复
定义 internal location 并提供静态资源
这个 location 是真正返回定制页面的地方,必须加 internal 防止被用户直接请求:
- 示例配置:
location = /maintenance.html {<br> internal;<br> root /usr/share/nginx/html;<br>} -
root指向的是文件系统绝对路径,比如页面实际存放在/usr/share/nginx/html/maintenance.html - 确保该 HTML 文件大小 ≥ 512 字节(否则旧浏览器会显示兜底页)
- CSS/JS/图片等资源要用相对路径或额外配置
location提供服务
加一层自动重试提升可用性
对网络抖动、瞬时超时这类临时故障,可启用上游重试机制:
- 在
upstream或location中添加:proxy_next_upstream error timeout http_502 http_504; - 控制重试次数和总耗时:
proxy_next_upstream_tries 3;和proxy_next_upstream_timeout 3s; - 注意:重试不适用于所有场景(比如上游已处理并返回明确失败),仅适合可安全重放的请求


















