讨论蜘蛛池的时候,很多人先盯着内容、連結和更新频率,却把一個更靠前的問题放過去了:蜘蛛的請求能不能顺利完成握手。入口頁的内容再合理,如果 TLS 這一层出错,蜘蛛拿到的不是頁面,而是一次连接失敗。日誌里甚至不會有狀態碼,只會留下空白的訪問记錄。
為什么證书問题排在最前面
蜘蛛抓取一個 URL,顺序大致是:DNS 解析、TCP 连接、TLS 握手、發送 HTTP 請求、接收响應。證书属于第三步。這一步没過,後面的狀態碼、响應時間、頁面重量都無從谈起。所以排查入口站問题时,先確認握手是否正常,比翻内容模板更有意义。
證书鏈不完整:最容易被忽略的一項
服務器如果只配置了站点證书、没有带上中間證书,桌面浏览器通常會自動补鏈,看起来一切正常。但爬虫客戶端和不少命令行工具不會做這種补救,握手會直接失敗。這種情况下,人在浏览器里訪問顺畅,蜘蛛那邊却连不上,很容易誤判成別的原因。
- 用 openssl s_client -connect 域名:443 -servername 域名 查看 verify 返回值,確認鏈是否完整。
- 服務器上配置的是 fullchain 文件,而不是單獨的一張站点證书。
- 換過證书或迁移過服務器後,重新跑一遍检查,別預設沿用舊配置。
有效期與自動續期
證书有效期越来越短,忘记續期已经從偶發事故變成常见故障。入口站數量一多,人工盯到期日几乎必然出错。
- 给每個入口域名建到期提醒,提前至少两周。
- 能自動化簽發就自動化,减少手工替換的环节。
- 續期後记得重载服務,否則新證书躺在磁盘上不生效。
證书過期当天的表現不是權重波動,而是整個入口站不可訪問。這類問题没有渐變過程,只有能用和不能用两種狀態。
域名匹配:泛域名並不覆盖所有子域
泛域名證书通常只覆盖一級子域,例如 *.example.com 能覆盖 a.example.com,但覆盖不了 a.b.example.com。入口站用到多級子域时,容易出現部分域名證书不匹配的情况。多域名證书則要留意後續新增域名是否被纳入,否則新加的入口站會自带一個隐患。
HTTP 到 HTTPS 的跳轉:一次 301 就够
把 HTTP 流量引導到 HTTPS 是常規做法,但鏈路要短。一次 301 到位即可,尽量避免 301 跳 302、再跳一层的情况,也不要用 JS 跳轉代替服務器跳轉。跳轉层數越多,蜘蛛在一次抓取中能拿到的有效信息越少。
HSTS 好用,但回退成本高
HSTS 能让浏览器和部分客戶端之後强制走 HTTPS,省掉跳轉,但一旦下發,回退就比較麻烦。開啟 includeSubDomains 之前,要先確認所有子域都准备好了證书,否則會把没配好的子域一起鎖死在 HTTPS 上。
混合内容:頁面是 HTTPS,资源還是 HTTP
入口頁本身走 HTTPS,但里面引用的图片、脚本、样式来自 HTTP,浏览器會拦截或降級處理。蜘蛛不一定执行渲染,但會执行渲染的抓取客戶端可能拿到一個残缺頁面。统一把内部资源地址改成 HTTPS 或协议相對寫法,可以少一類變量。
入口站數量多时,證书怎么管
- 确定统一的證书策略:是每個站獨立證书,還是集中用一張多域名證书。
- 簽發、部署、重载、驗證,尽量做成一條固定流程,减少手動环节。
- 入口站退役或替換时,把證书一並處理,別留下没人管的過期證书。
- 把證书到期纳入日常监控,和域名解析、服務器狀態放在一起看。
上线前的自查清單
- 握手是否正常,verify 是否返回成功。
- 證书鏈是否完整,中間證书有没有带。
- 有效期還剩多久,續期机制是否可靠。
- 證书覆盖的域名和實际使用的域名是否一一對上。
- HTTP 到 HTTPS 是否只有一次 301。
- 頁面内是否還有 HTTP 资源。
- HSTS 是否已開啟,覆盖范围是否合适。
- 到期和握手失敗是否有告警。
證书本身不會给入口站带来額外好處,它只是让蜘蛛能够顺利走到门口。把它当作基础设施来维護,比在上线後從抓取日誌里反推故障原因要省事得多。