售前咨询400-838-0503

服务器时间不准确怎么办?

发布:2026-10-30 14:02

搜索全部帮助分类的文档

服务器时间看起来不准确,常见原因有两种:一种是时区不同,另一种是系统时钟确实存在偏差。

例如,服务器显示UTC时间,与北京时间相差8小时,并不一定说明校时失败。应先判断问题类型,再进行调整。

本文适用于使用systemd的常见Linux服务器。生产环境时间偏差较大时,启动或调整校时服务可能引起时间跳变,应先评估数据库、定时任务等业务的影响。

1. 查看当前时间、时区和同步状态

登录服务器后执行:

date '+%F %T %z'
date -u '+%F %T %z'
timedatectl status

其中:

  • 第一条显示当前环境下的本地时间及UTC偏移。

  • 第二条显示UTC时间。

  • 第三条查看系统时区、时钟及网络校时状态。

重点关注以下字段:

字段 含义
Local time 系统本地时间
Universal time UTC时间
Time zone 当前系统时区
System clock synchronized 系统是否报告已同步
NTP service 网络校时服务是否处于活动状态
RTC in local TZ 硬件时钟是否按本地时间保存

如果系统时区是 Etc/UTC,时间比北京时间少8小时,应先按第2节检查时区。

如果与可靠时间参考相比,UTC时间本身也相差几分钟甚至几小时,则需要继续检查校时服务。

NTP service: active 不等于已经同步成功。 还需要结合实际校时服务的状态判断。

使用timedatectl查看Linux服务器时间时区和同步状态

2. 按需要设置北京时间显示

如果业务需要使用北京时间,可以执行:

sudo timedatectl set-timezone Asia/Shanghai

然后检查:

timedatectl show -p Timezone
date '+%F %T %z'
date -u '+%F %T %z'

正常情况下,系统时区应显示:

Timezone=Asia/Shanghai

本地时间的UTC偏移应为:

+0800

修改时区主要改变本地时间的显示和解释方式,不会把系统的Unix时间戳直接增加8小时。因此,不要为了补齐时差再手动把时钟向后调整8小时。

如果服务器原本统一使用UTC记录日志,可以继续保持UTC,无需强制改为北京时间。

调整系统时区后,应核对依赖本地时间的定时任务。应用如果单独设置了时区,也需要在应用中检查。

使用timedatectl设置Asia Shanghai时区并核对北京时间

3. 确认服务器使用哪一种校时服务

常见校时服务包括chrony和systemd-timesyncd。先查看现有服务:

systemctl status chrony chronyd systemd-timesyncd --no-pager

部分服务提示不存在属于正常情况,应以实际已安装、已配置的服务为准。如果使用的是ntpd等其他实现,应检查对应服务。

常见对应关系如下:

实际服务名 启动并设置开机启动
chrony sudo systemctl enable --now chrony
chronyd sudo systemctl enable --now chronyd
systemd-timesyncd sudo systemctl enable --now systemd-timesyncd

根据现有配置选择对应的一条,不要把表中的命令全部执行。 同一系统不应同时运行多个互相竞争的校时程序。

如果确认没有安装任何校时服务,Ubuntu或Debian可以安装chrony:

sudo apt update
sudo apt install chrony
sudo systemctl enable --now chrony

已有正常运行的校时服务时,无需为了排查问题再安装另一套。

如果服务处于 failed 状态,应先查看日志,不要只反复重启。

4. 检查是否真正完成同步

使用chrony的服务器

执行:

chronyc tracking
chronyc sources -v

重点查看:

检查项 判断方法
Leap status Not synchronised 表示尚未同步
Ref time (UTC) 最近一次参考测量时间,不应长期停留在旧时间
System time 系统时钟相对chrony内部NTP时钟的剩余偏差
时间源前的 ^* 当前选中的NTP服务器
时间源前的 ^? 当前不可选,可能不可达、未同步或样本不足
Reach 377 表示最近8次请求均收到有效响应

服务刚启动时,需要一定时间获取样本,不应因为短暂出现 ^? 就立即判断故障。

也不能只看见 Normal 就认定绝对准确,还应确认选中的时间源可信、参考时间持续更新,并检查偏差。

使用systemd-timesyncd的服务器

执行:

timedatectl timesync-status
timedatectl status

查看当前时间服务器、最近同步信息和系统同步状态。

timesync-status 是针对systemd-timesyncd的命令。服务器使用chrony时,应使用前面的 chronyc 命令检查。

5. 长期无法同步时,检查日志和网络

查看相关服务日志:

sudo journalctl \
  -u chrony -u chronyd -u systemd-timesyncd \
  -n 60 --no-pager

重点排查:

  • 时间源域名是否能够正常解析。

  • 配置的时间服务器是否可达。

  • 防火墙是否允许必要的出站请求和返回流量。

  • 配置文件是否有语法错误。

  • 服务是否缺少调整系统时钟的权限。

  • 是否有其他程序同时修改时间。

常规NTP通常访问时间服务器的 UDP 123端口。如果启用了NTS安全校时,还需要检查密钥协商所使用的端口,通常是 TCP 4460。

作为普通校时客户端,不需要为了同步时间就向全网开放本机的UDP 123入站服务。

chrony常见配置位置包括:

/etc/chrony/chrony.conf
/etc/chrony.conf

部分系统还会通过 conf.d、sources.d 或DHCP引入配置。修改前应确认实际加载的位置,不要只改一个未被使用的文件。

优先检查系统已有时间源。确需更换时,应使用运维确认可信、可达的时间服务器,不要把教程中的示例地址直接作为时间源。

如果已经取得可靠测量,但系统仍有较大偏差:

chrony通常会逐渐调整时钟。确需立即校正时,可以在确认业务允许时间跳变后执行:

sudo chronyc makestep

该命令会把剩余调整量直接应用到系统时钟。它不能解决时间源不可达的问题,也不应被加入高频定时任务反复执行。

6. 验证时间和业务是否恢复正常

处理完成后,再次检查:

date '+%F %T %z'
date -u '+%F %T %z'
timedatectl status

使用chrony时,再执行:

chronyc tracking
chronyc sources -v

使用systemd-timesyncd时,再执行:

timedatectl timesync-status

隔一段时间复查,确认参考测量继续更新,偏差保持在业务可以接受的范围内。

随后检查原本异常的业务,例如:

  • 日志时间是否符合预期。

  • 登录令牌或接口签名是否仍提示时间错误。

  • 定时任务是否按照预期时区执行。

  • 原本因时钟偏差产生的证书有效期错误是否消失。

如果系统时间正常,但某个网站或容器仍显示错误时间,应继续检查应用自己的时区设置,而不是再次修改服务器时钟。

使用chronyc tracking检查服务器时间同步状态与时钟偏差

常见问题

1. 为什么服务器时间总是差8小时?

常见原因是服务器显示UTC,而用户按北京时间理解。先查看时区和UTC偏移,不能仅凭8小时差值认定系统时钟错误。

2. 修改系统时区后,网站时间为什么没变化?

应用可能使用独立的时区配置,例如PHP的 date.timezone、数据库会话时区或程序环境变量。应检查实际运行的应用配置,必要时按应用要求重新加载。

3. Docker容器里没有timedatectl怎么办?

普通Docker容器通常没有运行systemd。应先在宿主机检查校时,再检查容器内的时区数据和应用设置。不要为了修改显示时间就给容器增加系统时钟管理权限。

4. 重启后时间又不准确怎么办?

检查校时服务是否设置为开机启动、启动后是否成功同步,以及虚拟机恢复或宿主机相关设置是否影响了时钟。单纯反复手动设置时间,通常无法解决持续漂移的问题。

注意事项

时区调整与系统时钟校正是两件不同的事。不要反复使用手动设时命令代替持续校时,也不要同时启用多个校时程序。

如果服务器时间持续漂移,或每次重启后都出现较大偏差,可向莱卡云提交工单,提供操作系统版本、偏差情况、timedatectl status 输出、校时服务状态及相关日志,便于协助核查。

按文档操作后还是不行,把机器编号、出问题的时间点和现象截图一起提工单,能少来回一轮。

提交工单