nginx需启用proxy_intercept_errors on并配合error_page与internal命名location实现定制降级页;必须显式捕获502/503/504,用=重定向至@degrade,且root和try_files需正确配置;后端须真实返回对应错误码。

要让 Nginx 在后端出问题时返回定制降级页,而不是透传 502/503/504 给用户,核心是 error_page 和 命名 location 配合使用,同时必须启用 proxy_intercept_errors on。单独配置任一环节都会失效。
必须开启拦截并显式绑定状态码
proxy_intercept_errors 默认关闭,它只是“开关”,不主动做任何事。只有设为 on,并在同一 location 块中用 error_page 明确列出要捕获的状态码,Nginx 才会中断默认错误流程:
- 在 proxy_pass 所在的 location 中添加:
proxy_intercept_errors on; - 紧接着写:
error_page 502 503 504 = @degrade;(等号表示内部重定向,保留原始状态码) - 不要写成
error_page 502 /degrade.html—— 这种写法依赖 root 配置,容易因路径不一致返回 404
用 internal 命名 location 安全提供降级页
命名 location 是真正返回页面的地方,必须设为 internal,防止被外部直接访问,也避免循环或越权调用:
- 定义:
location @degrade { internal; root /usr/share/nginx/html; try_files /degrade.html =404; } - root 要和静态文件实际存放路径一致;try_files 确保文件存在才返回,否则报 404 而非空响应
- 不能省略 internal —— 否则攻击者可能直接请求
/@degrade触发未授权响应
支持按路径或上游服务差异化降级
不同模块对可用性要求不同,可分层配置,避免“一刀切”:
- 关键路径单独声明:例如
location /api/pay { ... error_page 502 504 = @pay_fallback; } - CDN 类资源轻量降级:
location /static/ { ... error_page 502 = @cdn_fallback; } - 按上游服务动态选页:配合 map 提取 $upstream_http_x_service_name,再在 @dynamic_fallback 中根据变量值选择不同页面路径
注意后端必须真实返回错误状态码
proxy_intercept_errors 只识别响应头中的 HTTP 状态码,不会解析响应体内容:
- 如果后端出错但仍返回 200 + 错误 HTML,Nginx 不会触发降级
- 需确认后端在超时、宕机、熔断时明确返回 502/503/504,可用
curl -I验证 - 常见有效场景:上游连接拒绝(502)、主动返回 503、代理超时(504)











