做站点运营时,大家更關心内容、结构和抓取,服務器時間往往被当成装好系統就自動正确的東西。但時間一旦不准,或者几台机器各用各的时区,很多看起来「莫名其妙」的問题就有了来源:日誌對不上、缓存该過期不過期、304 判断異常、定时任務跑偏、HTTPS 握手报错。它不會直接决定收錄,却會让你的排查判断一直建立在错誤的前提上。
一、時間不准會波及哪些环节
- 抓取日誌:多台服務器時間不一致时,合並後的日誌顺序是乱的,你看到的蜘蛛訪問路径可能是错的。
- 缓存過期判断:Expires、Age、max-age 的換算依赖服務器時間,時間超前或落後會让缓存提前失效或長期不更新。
- Last-Modified 與 304 协商:If-Modified-Since 的比較结果會失真,可能出現内容變了却返回 304,或者内容没變却反复回源。
- TLS 證书校驗:證书的生效與到期時間靠系統时钟判断,時間错到一定幅度,握手會直接失敗,蜘蛛自然拿不到頁面。
- 定时任務:备份、日誌轮轉、缓存预热、資料同步的触發時間依赖 cron 时区,容易和预期差几個小时。
- 資料與統計:資料库寫入時間戳、頁面發布時間、评论時間线,都會跟着一起偏。
二、先确定一個時間基准
团队内部最好先约定:服務器统一使用 UTC 存储和记錄,展示层再按訪客时区轉換。這样做的好處是跨机房、跨云厂商的机器放在一起比較时不會有歧义。如果因為业務原因必须用本地时区,也要做到全站一致,並且在日誌格式里明确寫出时区偏移,而不是让後来的人靠猜。
检查时重点看三件事:系統时区設定、系統目前時間、以及硬件或宿主机時間。虚拟机和容器要特別注意,容器通常繼承宿主机時間,宿主机没同步,容器里怎么改都没用。
三、把校时做成常態机制
- 接入可靠的時間源,配置 chrony 或 NTP 客戶端,而不是依赖手工改時間。
- 配置多個上游時間源,避免單一来源異常时整体跑偏。
- 開啟漂移监控,记錄系統時間與上游的偏移量,超過阈值就告警。
- 虚拟机確認宿主机已同步,容器確認挂载了宿主机的时钟。
- 多机房服務器尽量對齐同一個基准,避免跨机房日誌前後颠倒。
- 把校时纳入例行巡检,而不是等到出問题才想起来。
手工改時間看起来很省事,但會造成時間跳變。跳變會让日誌出現重复或倒序,也會让定时任務漏跑或重复跑,排查成本遠高于配置一次校时服務。
四、日誌里的時間该怎么讀
巡检抓取日誌时,先確認日誌格式里的時間到底是本地時間還是 UTC,再確認每台机器的时区設定。多机日誌合並前,最好统一轉換到同一时区再排序,否則你分析出来的抓取高峰时段可能是假的。
另外注意日誌轮轉的時間点。轮轉如果發生在抓取高峰,容易出現單個文件被截断、跨文件拼接的情况,看訪問路径时要把相邻文件接起来看。日誌文件命名里带上完整的日期和时区,也能省掉很多事後確認。
五、缓存與响應头里的時間
- 响應头 Date 由服務器生成,時間明顯偏离真實時間,會让人誤判响應来自缓存還是回源。
- Expires 是绝對時間,服務器时钟偏差會直接改變缓存有效期。
- Age 表示副本已存在多久,計算依赖時間差,時間不准时這個數值没有參考價值。
- Last-Modified 與 304 的判断需要两端時間接近,否則协商结果不可信。
六、上线前的检查清單
- 確認系統时区設定符合团队约定,並寫進部署文档。
- 確認校时服務正常執行,查看最近一次同步结果和偏移量。
- 確認應用、資料库、缓存、反向代理各层的時間基本一致,差值在可接受范围内。
- 確認日誌時間戳带时区信息,多机日誌能正确合並排序。
- 检查證书到期時間,同时確認系統時間不會让證书被判為未生效或已過期。
- 检查定时任務的时区配置,確認备份、轮轉、预热等任務按预期時間触發。
時間這件事不出問题时几乎没有存在感,出問题时又會以各種不相關的形式表現出来。把它当成服務器维護里的一個固定检查項,每季度過一遍,比事後從一堆错乱日誌里反推要轻松得多。