最稳妥方式是在nginx的http块中全局启用gzip,覆盖所有站点;需正确配置gzip on、gzip_min_length 1024、gzip_comp_level 6、gzip_types指定文本类mime类型、gzip_vary on等核心参数,避免压缩图片等已压缩文件,并通过curl或浏览器开发者工具验证content-encoding: gzip生效。

直接在 Nginx 的 http 块中启用 gzip 是最稳妥的方式,能覆盖所有站点,避免遗漏;关键不是“开不开”,而是“压缩谁、多大才压、压到什么程度”——配错参数反而可能拖慢服务或白费功夫。
确认位置再修改:必须写在 http 块内
gzip 指令支持出现在 http、server、location 三个层级,但生产环境推荐统一放在 http { } 块开头附近:
- 确保它不在任何
server或location内部,否则只对局部生效,容易漏掉静态资源 - 路径通常是
/etc/nginx/nginx.conf,少数编译安装的在/usr/local/nginx/conf/nginx.conf - 改完务必执行
sudo nginx -t验证语法,再用sudo nginx -s reload生效
核心参数要设对:不是越高压缩越好
以下是最常用且平衡性好的配置组合,兼顾压缩率与 CPU 开销:
- gzip on; —— 必须显式开启,Nginx 默认是关闭的
- gzip_min_length 1024; —— 小于 1KB 的响应不压缩,避免小文件加压缩头后反而变大
- gzip_comp_level 6; —— 级别 1~9,6 是实测压缩率(HTML/CSS/JS 通常减半)和 CPU 占用的合理交点
-
gzip_types text/plain text/css application/javascript application/json text/xml application/xml application/xml+rss text/javascript image/svg+xml; —— 明确列出可压缩的 MIME 类型;
text/html总是默认压缩,不用重复写;图片类如jpg、png不建议加入,本身已压缩,再压可能膨胀 -
gzip_vary on; —— 让响应头带上
Vary: Accept-Encoding,避免 CDN 或代理缓存把压缩版和未压缩版混存
按需微调场景:个别站点或特殊需求
如果多个站点共用一台 Nginx,但只想给某几个启用压缩,或需差异化策略:
- 在对应站点的
server { }块顶部(location外)单独加gzip on;和精简版gzip_types,比如只压text/css application/javascript - 若后端是反向代理(如 PHP-FPM 或 Node.js),加
gzip_proxied any;确保代理返回的内容也能被压缩 - 兼容老旧 IE6?可加
gzip_disable "MSIE [1-6]\.";,不过现在基本可忽略
验证是否真正生效
别只看配置有没有保存,要确认浏览器实际收到的是压缩内容:
- 用
curl -H "Accept-Encoding: gzip" -I https://yoursite.com/style.css,检查响应头是否含Content-Encoding: gzip - 浏览器打开开发者工具 → Network 标签页 → 刷新页面 → 点击任意 JS/CSS 文件 → 查看 Headers → Response Headers 区域
- 对比压缩前后大小:Response 标签下 Size 列显示的 “transferred” 值应明显小于 “resource” 值











