Nginx gzip 压缩:一个配置让页面加载快 3 倍

44 阅读2分钟

背景 监控大屏首页加载慢,F12 一看:

chart.min.js:200KB

index.html:5KB

加上 CSS、字体,一共 250KB+

服务器带宽不大,每次加载都要等。

想做到:让 Nginx 自动压缩响应,减少传输量。

解决 一、基础配置 在 /etc/nginx/nginx.conf 的 http 块里加:

gzip on;
gzip_vary on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_types
    text/plain
    text/css
    text/xml
    text/javascript
    application/javascript
    application/json
    application/xml
    application/xml+rss
    image/svg+xml;

改完:

sudo nginx -t && sudo systemctl reload nginx

二、每个指令干什么

指令作用
gzip on开启 gzip
gzip_vary on加 Vary: Accept-Encoding,让 CDN/代理正确缓存
gzip_comp_level 5压缩级别 1-9,5 是速度和压缩比的最佳平衡
gzip_min_length 1024小于 1KB 不压缩(压缩后反而更大)
gzip_types哪些 MIME 类型要压缩

关键点:gzip_types 默认只压 text/html,JS / CSS / JSON 都要显式加。

三、验证生效

# 看响应头有没有 Content-Encoding: gzip
curl -s -H "Accept-Encoding: gzip" -D - -o /dev/null https://example.com/static/chart.min.js | grep -i encoding

期望:

content-encoding: gzip

对比压缩前后大小:

# 不压缩
curl -s -o /dev/null -w "原始: %{size_download} bytes\n" https://example.com/static/chart.min.js

# 压缩
curl -s -H "Accept-Encoding: gzip" -o /dev/null -w "压缩: %{size_download} bytes\n" https://example.com/static/chart.min.js

典型输出:

原始: 205000 bytes
压缩: 65000 bytes

压缩到 1/3。

验证效果

文件原始gzip 后压缩比
chart.min.js205KB65KB68%
index.html5KB1.5KB70%
style.css30KB8KB73%
合计240KB75KB69%

页面加载时间:

改造前:2.1s

改造后:0.7s

3 倍提速,一行配置的事。

三个坑 坑 1:gzip_types 忘了加 JS Nginx 默认只压 text/html。application/javascript 不加,chart.min.js 就白压了。

验证方法:

curl -s -H "Accept-Encoding: gzip" -D - -o /dev/null https://example.com/static/chart.min.js | grep -i encoding

没输出 = 没压缩。

坑 2:gzip_comp_level 调到 9 级别越高越耗 CPU。级别 9 比级别 5 只多压 3%,但 CPU 多花 50%。

建议:

静态资源:级别 5~6

动态响应(API):级别 3~4

小学生版解释:

抽真空 90% 就够了,非要抽到 99% 得花大力气,收益很小。

坑 3:已经压缩的文件又压一遍 如果你有 .gz 预压缩文件(比如构建时生成),要用 gzip_static 直接发,不要再压。

gzip_static on;

效果:Nginx 优先找 chart.min.js.gz,直接发送,省 CPU。

适合:静态资源多、构建流程能生成 .gz 的场景。