用try_files+error_page实现多级兜底是最直接可控的方式,适合静态资源路径明确的场景:先本地磁盘(alias /data/static/; try_files $uri @primary),再主源代理,失败切备用源,最后降级返回204或预置页,全程零感知、无重定向。

用 try_files + error_page 实现多级兜底是最直接、最可控的方式,适合静态资源路径明确(如 /static/、/assets/)的场景。它不依赖外部健康检查,全靠 Nginx 内置指令逐层 fallback,一次请求失败后自动切换,用户无感。
本地磁盘优先,零延迟兜底
把常用静态文件提前同步到 Nginx 本机(如 /data/static/),配置 alias 并放在 try_files 第一位:
location /static/ { alias /data/static/; try_files $uri @primary; }- 注意
alias和root的行为差异:alias 会完全替换匹配路径,root 是拼接路径;用错会导致 404 - 确保 Nginx 进程对目录有读权限,且文件系统使用 SSD 或高效挂载方式
主源失败自动切备用源站
用内部命名 location 分离不同回源逻辑,配合 proxy_intercept_errors on 和 error_page 捕获上游错误:
location @primary { proxy_pass http://origin-primary; proxy_intercept_errors on; error_page 502 503 504 = @backup; }location @backup { proxy_pass http://origin-backup; proxy_intercept_errors on; error_page 502 503 504 = @degrade; }- 必须加
=符号,否则会变成 302 重定向,暴露备用地址或导致循环 - 避免在
proxy_pass后加多余斜杠,比如http://a.com/和http://a.com行为不同,易引发路径错乱
降级响应要轻量且合理
最后一级不是“返回错误”,而是提供可用替代内容,比如空响应或最小化 HTML:
- 对 JS/CSS/图片等资源,推荐
return 204;—— 避免空白页白屏,前端可捕获并降级处理 - 对 HTML 入口文件,可用
alias /data/degrade/; try_files /index.html =404;返回预置降级页 - 不要用
return 503结束流程,这会让 CDN 或浏览器缓存错误状态,影响后续请求
补充建议:配合 upstream 做更细粒度控制
如果主备源站是同一域名不同端口或需负载均衡,可结合 upstream 和 proxy_next_upstream:
- 定义两个独立 upstream(不混用 backup 参数),便于分别设置
max_fails和fail_timeout - 在主 location 中启用
proxy_next_upstream error timeout http_502 http_503 http_504,再用error_page跳转到备用 location,兼顾自动重试与路径隔离 - 所有 upstream server 后加
resolve(若用域名),避免 DNS 缓存导致故障无法及时切换











