体积不是小事,它直接占用抓取时间
很多人盯状态码、盯 robots、盯 sitemap,却很少看每次响应到底传了多少字节。蜘蛛抓取页面时,一次连接从发起到读完响应体结束才算完成。响应体越大,这条连接被占用的时间就越长。在并发数和超时时间固定的前提下,单页传输体积翻倍,单位时间内能抓完的页面数量就会明显下降。
用户侧的感受更直接:同样的内容,多传几百 KB 就是多等一段时间。所以体积自查属于站点运营里成本很低、回报很直观的一项工作。
先把现状量出来
不要凭感觉判断是否已经压缩。用带 Accept-Encoding 的请求和普通请求各看一遍,差异一眼就能看出来。
- 用 curl -I -H "Accept-Encoding: gzip, br" 请求首页,看返回头里有没有 Content-Encoding。
- 对比 Content-Length 与 curl -w '%{size_download}' 输出的实际接收字节数,两者差距过大说明压缩链路有问题。
- 服务器日志里的 body_bytes_sent 字段,可以按 URL 排序,找出体积最大的那一批页面。
- CDN 或反向代理后台的流量报表,能看出压缩命中比例和回源流量。
如果首页 HTML 本身只有几十 KB,实际却传了两百多 KB,基本可以确定压缩没生效,或者压了不该压的东西。
常见问题清单
该压的没压
- HTML、CSS、JS、JSON、XML、SVG、纯文本,这几类体积弹性最大,压缩收益也最明显。
- 动态输出的页面如果没被纳入压缩规则,往往是最容易被忽略的一块。
不该压的重复压
- JPEG、PNG、WebP、MP4、woff2 本身就是压缩格式,再压一遍几乎不减小,只是白耗 CPU。
- 源站已经压过,CDN 又压一次,或者反过来,属于重复劳动,还可能让 Content-Length 与实际不符。
配置层面的细节
- 压缩级别不是越高越好。等级开到最高,CPU 时间上去,TTFB 反而变长,多数场景用中间档就够。
- 过小的响应用不着压缩,设置最小长度阈值可以减少无效开销。
- 带压缩的响应要正确输出 Vary: Accept-Encoding,否则缓存可能把压缩版发给不支持的客户端。
- 已经做了静态预压缩的文件,注意别让服务器再对 .gz、.br 结果压一次。
一个可用的调整顺序
- 先确认压缩到底在哪一层生效,源站、网关、CDN 只保留一处作为主力。
- 按 MIME 类型收窄压缩范围,文本类开,媒体和字体类关。
- 设置最小长度阈值,避免为小响应付出压缩开销。
- 补上 Vary 头,核对缓存规则是否按编码区分版本。
- 把静态资源的预压缩文件挂上,让高频文件直接输出。
改完不要只测首页,挑几个典型模板各测一次:栏目列表页、内容详情页、站内搜索页、接口返回。它们的内联数据量差异很大,压缩效果也不一样。
顺带看两个容易被忽略的点
页面自带的重量
有的页面把整份导航结构、全量分类、推荐数据都内联在 HTML 里,压缩率再高,基数也有几百 KB。这类问题靠压缩治不好,得从模板输出量上收一收。
图片与静态资源的输出尺寸
原图直接输出通常是体积的大头。按展示尺寸生成合适的分辨率,再配合现代格式,收益往往比调压缩参数更大。
压缩解决的是传输效率,不是页面该不该传这么多东西。两件事分开看,改动方向才不会跑偏。
把它变成常规动作
不需要天天盯着。每次模板改版、上线新静态资源、调整 CDN 配置之后,抽几个 URL 复测一遍;每月看一次日志里体积最大的页面列表和 TTFB 趋势。把这些数字记录下来,改动前后有对照,就不容易凭感觉下判断。
体积自查不会让蜘蛛立刻多抓多少页面,但它能减少无谓的传输消耗,让抓取预算花在真正需要抓的内容上,也让访问体验少一点等待。