nginx 配置小抄:location 匹配顺序与缓存头

nginx 的 location 规则看着简单,实际写起来很容易踩坑。本文整理我在配置静态资源、反代和 SPA 路由时遇到的几个高频问题。

1. location 匹配优先级

nginx 的匹配顺序不是简单的「谁长谁优先」。精确匹配 = 最高,然后是前缀匹配中的 ^~,接着是正则匹配 ~ 和 ~*,最后是普通前缀匹配。如果两个规则看起来都能命中,实际走的可能是正则,而不是更长的前缀。我的做法是:需要精确拦截的路径用 =,静态目录用 ^~,通用反代放最后。

2. expires / Cache-Control 设置静态资源缓存

对于带版本戳的 JS/CSS,我直接给一年缓存:expires 1y 或 add_header Cache-Control 'public, max-age=31536000'。对于不常更新的图片,我给 30 天。首页 HTML 则必须不缓存,防止代码更新后用户还看到旧版。

3. gzip on 的正确姿势

gzip 默认可能不启用,要显式配置 gzip on、gzip_types text/plain text/css application/json application/javascript,并设置 gzip_min_length 1024。太小的响应压缩后体积反而增加,1024 字节以上再压比较合适。

4. try_files 与 SPA 路由回退

前端单页应用路由通常是 /app/something,而服务器上只有 /app/index.html。用 try_files $uri $uri/ /app/index.html 可以让所有子路径都回退到 index.html,由前端路由接管。注意这条规则要放在 location /app 块里,不要影响 API 路径。

5. 配置热加载 nginx -s reload

改完 nginx 配置后,用 nginx -t 先检查语法,再用 nginx -s reload 热加载。reload 不会中断现有连接,对于线上环境非常友好。我一般在改反代配置前都会 cp nginx.conf nginx.conf.bak,方便出错时秒回滚。

← 返回首页