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

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

chart.min.js:200KB

index.html:5KB

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

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

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

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

bash 复制代码
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;

改完:

bash 复制代码
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 都要显式加。

三、验证生效

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

期望:

css 复制代码
content-encoding: gzip

对比压缩前后大小:

bash 复制代码
# 不压缩
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

典型输出:

makefile 复制代码
原始: 205000 bytes
压缩: 65000 bytes

压缩到 1/3。

验证效果

文件 原始 gzip 后 压缩比
chart.min.js 205KB 65KB 68%
index.html 5KB 1.5KB 70%
style.css 30KB 8KB 73%
合计 240KB 75KB 69%

页面加载时间:

改造前:2.1s

改造后:0.7s

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

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

验证方法:

bash 复制代码
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 直接发,不要再压。

csharp 复制代码
gzip_static on;

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

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

相关推荐
一条Go29 分钟前
两套权限目录,三重闸门:Alioth 的多租户 RBAC 为什么这么拧
后端·程序员·github
Tokenfree44 分钟前
换模型也要灰度:10% → 50% → 100%,每一档只看三个指标
架构
风影同志783241 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
Tokenfree1 小时前
把多模态 OCR 接进业务系统:四千张运单,三个坑
后端
vivo互联网技术1 小时前
把 Agent 的判断与行动变成可恢复的软件事实|KDC 系列 工程篇
架构·agent·ai编程
用户859313061351 小时前
我给 AI Agent 写了个下载器:293KB 的网页,不再吃掉 7 万 token
后端
写的都是BUG1 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
phil61 小时前
沙箱核心功能系列 06:编排调度与资源管理
后端
小兔子1 小时前
if (system(cmd) != 0) 判不出命令失败:它返回的是等待状态,不是退出码
后端
艾迪的技术之路1 小时前
16k 条慢查询,128 张分表,我这么解决
后端·github