Nginx 压缩缓存与静态资源加速

1. 先理解这件事

很多站点看起来“慢”,并不是因为业务逻辑复杂,而是因为:

  • 静态资源太大
  • 浏览器重复下载
  • Nginx 没把自己最擅长的加速能力用起来

对新手来说,最先该掌握的是三件事:

  • 开启压缩,减少传输体积
  • 设置缓存,让浏览器少重复请求
  • 让静态资源尽量直接由 Nginx 处理

对有经验的读者,更值得关注的是:

  • 哪些类型适合压缩,哪些不适合
  • 缓存策略如何和构建产物的 hash 命名配合
  • 如何避免错误缓存导致发布后资源不更新

2. 最小可用配置

http {
    gzip on;
    gzip_types text/plain text/css application/javascript application/json image/svg+xml;
    gzip_min_length 1024;
 
    server {
        listen 80;
        server_name example.com;
 
        location /assets/ {
            root /var/www/app;
            expires 30d;
            add_header Cache-Control "public, max-age=2592000";
        }
    }
}

这段配置可以先这样理解:

  • gzip on; 开启压缩
  • gzip_types 指定要压缩的内容类型
  • expires 30d;Cache-Control 用于让浏览器缓存静态资源

3. 先从最简单的优化做起

新手先记住这条主线:

  1. HTML、CSS、JS、JSON 这些文本类资源通常值得压缩。
  2. 已经高度压缩过的二进制资源,不一定适合再压缩。
  3. 构建产物如果带内容哈希,就更适合长缓存。

这意味着:

  • 不要一上来对所有资源一刀切
  • 要先区分“适合压缩”和“适合缓存”的对象

4. 更稳妥的缓存思路

比较常见的做法是区分两类资源:

  • index.html 这类入口文件,缓存时间短一些
  • 带 hash 的静态资源,缓存时间长一些

原因很简单:

  • 入口文件要尽快感知新版本发布
  • 带 hash 的资源文件名变了就代表内容也变了,适合长期缓存

5. 常见误区

5.1 所有文件都长缓存

这样很容易导致页面发布后,用户仍然拿到旧入口文件或旧资源。

5.2 把图片、视频等都强行开启 gzip

这类资源很多已经是压缩格式,再压缩收益通常有限。

5.3 只开缓存,不看实际命中效果

缓存策略配置了不代表真的生效,还是要结合浏览器响应头和访问日志验证。

6. 实践建议

  1. 静态资源尽量通过 Nginx 直接服务,不要无意义透传到应用层。
  2. 文本类资源优先开启 gzip。
  3. 缓存策略要和前端构建产物命名规则一起设计。
  4. 调整后用浏览器 DevTools 和访问日志验证命中情况。

7. 排查清单

  • 已开启 gzip 且类型配置合理
  • 已为静态资源设置明确缓存策略
  • 已区分入口文件与带 hash 资源的缓存规则
  • 已验证压缩和缓存头是否真正生效

8. 相关笔记