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 内单独覆盖。
各指令速查
| 指令 | 默认值 | 说明 |
|---|---|---|
| gzip | off | 总开关 |
| gzip_types | text/html | 参与压缩的类型(text/html 恒被压缩,无需列入) |
| gzip_min_length | 20 | 触发压缩的最小响应长度(字节) |
| gzip_comp_level | 1 | 1~9,级别越高压缩率越高、CPU 越费,5 左右较常用 |
| gzip_vary | off | 开启后输出 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 头。文本资源压缩收益最大,图片视频应明确排除。