做站点运营时,大家更关心内容、结构和抓取,服务器时间往往被当成装好系统就自动正确的东西。但时间一旦不准,或者几台机器各用各的时区,很多看起来「莫名其妙」的问题就有了来源:日志对不上、缓存该过期不过期、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 的判断需要两端时间接近,否则协商结果不可信。
六、上线前的检查清单
- 确认系统时区设置符合团队约定,并写进部署文档。
- 确认校时服务正常运行,查看最近一次同步结果和偏移量。
- 确认应用、数据库、缓存、反向代理各层的时间基本一致,差值在可接受范围内。
- 确认日志时间戳带时区信息,多机日志能正确合并排序。
- 检查证书到期时间,同时确认系统时间不会让证书被判为未生效或已过期。
- 检查定时任务的时区配置,确认备份、轮转、预热等任务按预期时间触发。
时间这件事不出问题时几乎没有存在感,出问题时又会以各种不相关的形式表现出来。把它当成服务器维护里的一个固定检查项,每季度过一遍,比事后从一堆错乱日志里反推要轻松得多。