nginx 返回友好降级页需三步:设 proxy_read_timeout 3s 和 proxy_next_upstream error timeout 限制超时;启用 proxy_intercept_errors on 并用 error_page 504 = @degrade 接管错误;在 internal 的 @degrade location 中通过 try_files 提供静态降级页。

当后端响应超时(如返回 504 Gateway Timeout),Nginx 默认透传原始错误页,体验生硬。要返回友好降级页,核心是三步:主动限制超时、捕获 504 状态、用静态页面安全兜底。
设置合理的 proxy_read_timeout 和重试策略
超时不是“等多久”,而是“最多忍几秒”。默认 60 秒太长,用户早已放弃:
- proxy_read_timeout 3s:从后端读取响应头的上限,匹配多数接口预期耗时
- proxy_next_upstream error timeout:明确将连接失败和读超时视作可重试事件
- 避免加 http_504 到重试列表——504 是 Nginx 自己生成的,重试无意义,反而延长等待
启用 proxy_intercept_errors 并绑定 error_page
仅设超时还不够,必须让 Nginx “接管”这个 504,而不是直接扔给浏览器:
- 在 proxy_pass 所在的 location 块中写:proxy_intercept_errors on;
- 紧跟着写:error_page 504 = @degrade;(等号表示内部跳转,不改状态码)
- 不要写 error_page 504 /degrade.html —— 路径依赖 root,易因作用域错乱导致 404
用 internal 命名 location 安全提供降级页
降级页必须防直连、路径准、内容稳:
- 定义:location @degrade { internal; root /usr/share/nginx/html; try_files /degrade.html =404; }
- internal 阻止用户访问 /@degrade 或构造恶意请求绕过业务逻辑
- try_files 确保文件真实存在,否则 fallback 到 404,避免空响应或二次错误
- 降级页建议内联 CSS,不引用外部 JS 或图片,防止资源加载失败导致页面空白
补充:若需隐藏 504 状态码(如 SEO 或前端统一处理)
某些场景要求返回 200 状态码+降级内容(例如单页应用兜底):
- 把 error_page 504 = @degrade; 改为 error_page 504 =200 @degrade;
- 在 @degrade 中用 return 200 " 或配合 alias /path/to/degrade.html; 输出内容
- 注意:搜索引擎通常需要真实 504 表示临时不可用,非必要不改状态码











