站点运营

站点运营:响應体积與压缩自查,別让無效字节拖慢抓取

蜘蛛抓取頁面时,连接從發起到讀完响應体結束才算完成。响應体越大,同样並發和超时條件下,單位時間内能抓完的頁面越少。這篇文章讲怎么量出目前体积、哪些類型该压缩、哪些内容不该重复压,以及調整之後该复测哪些典型頁面。

站点运营

站点运营:响應体积與压缩自查,別让無效字节拖慢抓取

体积不是小事,它直接占用抓取時間

很多人盯狀態碼、盯 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 结果压一次。

一個可用的調整顺序

  1. 先確認压缩到底在哪一层生效,源站、網關、CDN 只保留一處作為主力。
  2. 按 MIME 類型收窄压缩范围,文本類開,媒体和字体類關。
  3. 設定最小長度阈值,避免為小响應付出压缩開销。
  4. 补上 Vary 头,核對缓存規則是否按编碼区分版本。
  5. 把静態资源的预压缩文件挂上,让高频文件直接輸出。

改完不要只测首頁,挑几個典型模板各测一次:栏目列表頁、内容詳情頁、站内搜尋頁、接口返回。它們的内联資料量差异很大,压缩效果也不一样。

顺带看两個容易被忽略的点

頁面自带的重量

有的頁面把整份導航结构、全量分類、推荐資料都内联在 HTML 里,压缩率再高,基數也有几百 KB。這類問题靠压缩治不好,得從模板輸出量上收一收。

图片與静態资源的輸出尺寸

原图直接輸出通常是体积的大头。按展示尺寸生成合适的分辨率,再配合現代格式,收益往往比調压缩參數更大。

压缩解决的是传輸效率,不是頁面该不该传這么多東西。两件事分開看,改動方向才不會跑偏。

把它變成常規動作

不需要天天盯着。每次模板改版、上线新静態资源、調整 CDN 配置之後,抽几個 URL 复测一遍;每月看一次日誌里体积最大的頁面列表和 TTFB 趋势。把這些數字记錄下来,改動前後有對照,就不容易凭感觉下判断。

体积自查不會让蜘蛛立刻多抓多少頁面,但它能减少無谓的传輸消耗,让抓取预算花在真正需要抓的内容上,也让訪問体驗少一点等待。