站点运营

站点运营:服務器時間與时区自查,別让日誌和任務在错位的時間里執行

日誌時間對不上、定时任務跑偏、Sitemap 的 lastmod 比目前時間還晚,很多排查困难的根源其實是服務器时区不统一。本文梳理時間错位的常见来源,並给出一份從系統、應用、資料库到任務調度與證书有效期的自查顺序,帮助站点把時間基准统一起来。

站点运营

站点运营:服務器時間與时区自查,別让日誌和任務在错位的時間里執行

排查蜘蛛来訪、比對内容更新時間、回看定时任務有没有跑成功,這些事情都依赖同一個前提:各處的時間是一致的。但實际运维里,系統时区、應用时区、資料库时区、日誌时区、容器时区经常各说各话。结果就是日誌里蜘蛛半夜三点来抓,你本地看却是上午十一点;定时任務设了凌晨两点,實际在下午执行;Sitemap 里的 lastmod 比服務器目前時間還晚。時間一旦错位,後面所有判断都會跟着偏。

時間错位最常见的几個来源

  • 操作系統时区:服務器預設 UTC,而运营、編輯习惯看東八区,两者相差 8 小时。
  • 應用與資料库时区:PHP、Java、Node 各有自己的时区配置,MySQL 還分全局和會话級时区,寫入和讀取可能不是同一個時間。
  • 日誌记錄時間:Nginx 的 $time_local 跟随系統时区,反向代理、CDN、容器日誌又可能是另一套時間。
  • 定时任務:cron 用的是系統时区,容器镜像里常常還是 UTC,任務實际执行時間與预期不符。
  • 對外輸出的時間:Last-Modified 响應头、Sitemap 的 lastmod、RSS 的 pubDate、證书生效與到期時間,通常按 UTC 表達。

自查时按這几步走

1. 先确定一個基准

要么全站统一 UTC,要么全站统一東八区,關键是顯式寫出来,不要依赖“預設就是這样”。選定之後,把系統、應用、資料库、任務調度都對齐到同一個基准,再在展示层做本地化。混用两套時間,問题迟早會出現。

2. 逐层核對目前實际值

  • 系統時間與时区:查看目前時間、时区設定,以及是否啟用了時間同步服務。
  • 應用时区:查看執行时配置里的时区項,確認與基准一致。
  • 資料库时区:分別查看全局时区、會话时区和寫入後的實际值,三者经常不一致。
  • 日誌時間:挑一條刚产生的日誌,與目前時間對比,確認偏移量。

3. 關注與蜘蛛相關的輸出

HTTP 的 Last-Modified 和 If-Modified-Since 是按時間做條件請求的。如果服務器回的時間比實际修改時間晚,或者每次請求都返回目前時間,蜘蛛會反复抓取已经看過的内容。Sitemap 的 lastmod 同理,寫一個“刚刚”的時間看似能催更新,實际會让抓取预算被無效消耗。

不要為了让頁面看起来“更新”而随意調整 lastmod 或文件修改時間。時間字段的作用是帮助判断内容有没有變化,長期注水只會让抓取策略失去參考價值。

4. 任務與證书的時間点

备份、清理、推送、生成静態頁這類任務,寫在 cron 里只填了小时和分钟。切換时区後,原本凌晨执行的任務可能跑到业務高峰。證书的生效和到期時間以 UTC 為准,續期检查任務若按本地時間判断,容易出現“看着還有三天,其實已经不到一天”的情况。

一份可以照做的顺序

  1. 確認服務器時間是否與标准時間同步,偏差是否控制在秒級以内。
  2. 選定基准时区,並寫進配置和文档,而不是留在某個人的印象里。
  3. 把應用、資料库、任務調度的时区配置改為與基准一致。
  4. 抽查一條日誌、一條資料库记錄、一次任務执行记錄,核對三者時間是否自洽。
  5. 检查 Sitemap 的 lastmod 是否為真實修改時間,格式是否带时区且不晚于目前時間。
  6. 把證书、域名、备份等與時間相關的检查項集中放在同一處提醒,避免各自為政。

時間對齐不會直接带来流量,但它能让日誌分析、蜘蛛识別、内容更新判断和故障排查都落在同一個坐标系里。花半小时把這件事理清楚,後面每次复盘都能少绕几圈。