网站加载慢,很多原因是传输的数据体积太大:HTML、CSS、JS 这些文本类资源动辄几十上百 KB,一个个传到浏览器,带宽和等待时间都上去了。Gzip 是服务器端最经典的压缩方案:把要发送的文本压缩后再传给浏览器,浏览器自动解压。配置得当,页面体积通常能减小 50%-70%,首屏明显变快。这篇文章手把手教你在 Nginx 里开启并调好 Gzip。
一、Gzip 为什么能提速
网上传的 HTML/CSS/JS/JSON/字体(woff)里大量是重复的标签、括号、空白,压缩率极高。服务器用 gzip 压缩后,传输的字节数大幅下降:
- 带宽占用大幅降低:尤其对海外 VPS 和移动网络,省流量=省成本
- 首屏更快:下载体积变小,渲染更快
- 对后端几乎无压力:CPU 微乎其微,换来的提速非常划算
注意:图片、视频等本身已压缩的二进制文件,gzip 意义不大,一般建议只压缩文本类。
二、开启前先确认模块
绝大多数 Nginx 发行版默认都编译了 ngx_http_gzip_module,先确认:
nginx -V 2>&1 | grep -o gzip
能输出 gzip 就说明模块可用,直接用。
确认当前是否已开启:
gzip -r /etc/nginx 或 nginx -T | grep -E 'gzip|gzip_types'
三、基础配置(复制即可用)
在 Nginx 的 http 块(一般是 /etc/nginx/nginx.conf 里)添加:
gzip on; # 开启 gzip 压缩
gzip_min_length 1k; # 小于 1K 的不压缩,避免浪费 CPU
gzip_comp_level 6; # 压缩级别 1-9,6 是速度/体积的平衡点
gzip_buffers 16 8k; # 压缩缓冲
gzip_http_version 1.1; # 支持 http 1.1
gzip_types text/plain text/css
application/json application/javascript
text/xml application/xml
image/svg+xml; # 重点压缩的文本类型
gzip_vary on; # 让代理/浏览器知道内容经压缩,开启缓存
gzip_types 是精华,列出你要压缩的 MIME 类型,静态网站很关键。如果没写 gzip_types,默认只压缩 text/html,CSS/JS 都不压,提速就打折扣。
检查语法并重载:
nginx -t # 无报错再继续
nginx -s reload # 平滑重载,不中断服务(或 systemctl reload nginx)
四、实战:给核心类型都加上压缩
一个更完善的配置,把站点常用文本类型都覆盖:
http {
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_vary on;
gzip_types
text/plain
text/css
application/json
application/javascript
text/xml
application/xml
application/xml+rss
text/javascript
image/svg+xml
application/x-font-ttf
font/opentype
application/vnd.ms-fontobject
application/x-font-woff;
gzip_disable "msie6"; # 老 IE 不支持,禁用压缩
}
gzip_comp_level 建议 5-6:再高压缩率提升有限,CPU 却明显上升,低配 VPS 尤其别开 9。
五、怎么验证 gzip 是否生效
1. 用 curl 看响应头:
curl -H "Accept-Encoding: gzip" -IL http://你的域名/styles.css
看返回头里有没有这一行(有就是压缩成功):
content-encoding: gzip
2. 浏览器验证: F12 → Network → 点某资源 → 看 Headers 里 Content-Encoding: gzip。
3. 对比体积: 压缩前后 curl -s http://域名/xxx.js | wc -c,速度立判高下。
六、常见问题
Q1:开启后页面没变化 / 没压缩?
多半是 gzip_types 没加全,或改的是虚拟主机而没重载。确认你的 CSS/JS 类型列进 gzip_types,并 nginx -s reload。也可以用 Accept-Encoding 头验证。
Q2:CSS 压缩了,但 JS 没压缩?
JS 的 MIME 在有些环境是 application/javascript,有的是 text/javascript,把两种都写进 gzip_types 最稳。
Q3:低配 VPS 开了会更卡?
gzip_comp_level 不要开太高(>6)。压缩是 CPU 操作,但文本压缩对现代 CPU 压力很小,一般加速远大于开销。若担心,限制 gzip_min_length,让大文件走压缩、小文件跳过。
Q4:图片也要压缩吗?
不需要。gzip_types 里不要加 jpg/png 这类已压缩格式,加了反而白费 CPU。SVG 是文本,可压。
Q5:反向代理 / CDN 会不会影响?
开了 gzip_vary on 后,代理层能正确缓存预压缩版本。配合本站 Nginx 反向代理、缓存教程使用更佳。
Q6:浏览器不支持怎么办?
几乎所有现代浏览器和移动端都支持 gzip,gzip_disable "msie6" 已排除老 IE。
七、进阶:预压缩静态资源
对变化很少的静态文件,可预先用 gzip_static 直接提供 .gz 文件,省去每次实时压缩:
gzip_static on; # 需在 http 或 server 块开启
然后预先生成 .gz:
gzip -k /www/wwwroot/site/static/app.css
访问 app.css 时,Nginx 直接返回预压缩的 app.css.gz,性能最佳(需模块支持,-V 里看有无 --with-http_gzip_static_module)。
总结
Nginx Gzip 是最便宜、最见效的提速手段:开启 gzip on → 配好 gzip_types(文本全上)→ 压缩级别 5-6 → nginx -t && reload,再用 curl 验证 Content-Encoding: gzip。通常转文本资源体积立减一半以上。配合本站的缓存、CDN、反向代理教程,网站速度还能再上一个台阶。
