Nginx 反向代理与静态资源托管的排错顺序

Nginx 反向代理与静态资源托管的排错顺序

很多人第一次部署个人站点时,最头疼的不是安装 Nginx,而是“明明配好了,为什么还是不对”。有时候首页能开,图片打不开;有时候域名能访问,静态资源却 403;还有时候后台上传成功,但前台拿到的地址一点击就是报错。

这类问题往往不是“大故障”,而是几层配置叠在一起导致的。我的习惯不是一上来就改配置文件,而是按固定顺序往下查。顺序对了,很多问题几分钟就能定位出来。

第一步:先区分是代理问题,还是资源问题

很多人看到页面不正常,就默认是 Nginx 配错了。其实要先问清楚:

  1. 是整个页面打不开,还是只有图片、JS、CSS 打不开?
  2. 是主站域名不通,还是子域名不通?
  3. 是返回 404、403,还是直接超时?

如果首页 HTML 能正常返回,但图片或样式异常,说明主站链路大概率没问题,应该优先查静态资源路径、资源域名、回源方式和权限。

第二步:直接看浏览器里的真实请求地址

排错最怕“脑补地址”。你以为前端请求的是某个路径,实际浏览器发出去的可能完全不是那回事。

我一般先做两件事:

  1. 打开浏览器开发者工具,看失败请求的完整 URL。
  2. 把这个 URL 复制出来,直接在新标签页访问一次。

这样很快就能知道,到底是:

  • 路径拼错了
  • 域名配错了
  • 回源站点不通
  • 还是对象本身没有公开访问权限

如果直接访问资源地址就报 AccessDenied,那问题通常已经不在 Nginx 本身,而在对象存储权限或 CDN 回源策略。

第三步:再看 Nginx 是怎么接这条请求的

当你确认 URL 没有明显错误后,就该回到 Nginx 配置里看请求到底走了哪段规则。

最容易出错的地方通常有三个:

  1. `server_name` 没匹配到正确域名。
  2. `location` 优先级和预期不一致。
  3. `root` 和 `alias` 混用导致真实路径错位。

尤其是 rootalias,很多新手会在这块掉坑。一个很常见的坏味道是:页面能出来,但静态资源路径总是多一段或少一段。

第四步:权限和缓存要分开看

静态资源打不开时,大家容易把“访问失败”都归到同一个原因上。实际上:

  • `403` 更常见于权限、目录限制、对象 ACL 或防盗链。
  • `404` 更常见于路径、别名映射、回源目录不一致。
  • 内容更新了但前台没变化,往往是浏览器缓存、Nginx 缓存或者 CDN 缓存。

我的经验是,权限和缓存一定要拆开判断。不要一边在改权限,一边又被缓存误导,以为配置没生效。

一个更稳的排错清单

如果你要快速定位静态资源问题,我建议按下面这个顺序:

  1. 浏览器里确认失败请求的完整 URL。
  2. 直接访问该 URL,看返回码和错误内容。
  3. 检查域名 DNS 指向是否正确。
  4. 检查 Nginx 对应该域名的 `server` 配置。
  5. 检查 `location`、`root`、`alias` 是否一致。
  6. 检查资源文件或对象本身是否存在。
  7. 检查对象存储、CDN、OSS 的访问权限。
  8. 最后再清理浏览器和 CDN 缓存做复测。

这个顺序最大的价值在于,你不会在错误层级里反复打转。

我更建议的上线策略

如果你的网站同时用了主站域名、资源域名、对象存储和 CDN,那上线前最好单独做一次链路验证:

  1. 主站首页能否正常返回。
  2. 一张图片能否直链访问。
  3. 一份 CSS 能否直链访问。
  4. 上传后的新资源能否立刻拿到。
  5. 切换 HTTPS 后是否有混合内容问题。

这些动作看起来基础,但只要少做一步,后面就很容易在后台上传、前台显示、缓存刷新之间反复怀疑人生。

结语

Nginx 排错最重要的不是背多少配置,而是知道先看哪一层。把主站、静态资源、对象存储、权限和缓存这几层拆开之后,绝大多数问题其实都不复杂。

对个人站长来说,最省时间的方式不是会写多炫的配置,而是建立一个稳定的排错顺序。只要顺序是对的,站点维护会轻松很多。