Nginx gzip 压缩

gzip 让 Nginx 在返回文本类资源前先压缩,浏览器自动解压后渲染。传输体积通常能下降 60%~80%,是成本最低的网页提速手段之一(代价是消耗一点 CPU)。

打开 gzip

默认编译的 Nginx 已包含 gzip 模块,只需把开关打开并配置压缩范围:

http {
    gzip on;                              # 开启压缩(默认 off)
    gzip_types text/plain text/css application/json
               application/javascript text/xml application/xml
               image/svg+xml;             # 需要压缩的 MIME 类型
    gzip_min_length 1k;                   # 小于 1KB 不压缩,小文件压了反而不划算
    gzip_comp_level 5;                    # 压缩级别 1~9,越大越费 CPU
    gzip_vary on;                         # 响应头带 Vary: Accept-Encoding
}

写在 http 层对所有站点生效,也可在某个 server/location 内单独覆盖。

各指令速查

指令默认值说明
gzipoff总开关
gzip_typestext/html参与压缩的类型(text/html 恒被压缩,无需列入)
gzip_min_length20触发压缩的最小响应长度(字节)
gzip_comp_level11~9,级别越高压缩率越高、CPU 越费,5 左右较常用
gzip_varyoff开启后输出 Vary: Accept-Encoding,便于缓存正确区分

验证是否生效

用 curl 显式带上 Accept-Encoding: gzip 请求,观察响应头:

curl -H 'Accept-Encoding: gzip' -I http://127.0.0.1/
# 输出:HTTP/1.1 200 OK
#       Content-Type: text/html
#       Content-Encoding: gzip        ← 出现即压缩生效
#       Vary: Accept-Encoding

不带该请求头的浏览器/客户端不会收到压缩内容(服务器按客户端能力决定)。

哪些内容不适合压缩

  • 图片(jpg/png/webp)、视频(mp4/webm)、已压缩格式(zip):本身已压缩,再压几乎无收益还费 CPU;
  • 小于 1KB 的小文件:压缩后体积可能不减反增。

做法是让这些类型不进入 gzip_types,或对相应目录单独关闭:

location ~* \.(jpg|png|gif|mp4|zip)$ {
    gzip off;             # 二进制资源不压缩
}

Brotli 简提

Brotli 是比 gzip 压缩率更高的新算法,但需要第三方 ngx_brotli 模块(官方主线不内置),需自行编译或使用带该模块的发行版镜像,本教程不展开。

小结:gzip 优化 = gzip on + gzip_types 列出文本类型 + 适当调 comp_level 与 min_length,再用 curl 验证 Content-Encoding 头。文本资源压缩收益最大,图片视频应明确排除。

笔记加载中…