<!DOCTYPE html>
Linux 服务器时间同步实战:chrony 配置、NTP 原理与时间漂移排错
日志时间对不上排错半天、数据库事务时间戳错乱、SSL 证书突然"未生效"、crontab 任务提前一小时执行……这些诡异问题的元凶往往只有一个:服务器时间不准。现代 Linux 发行版(RHEL 8+ / CentOS 8+ / Ubuntu 18.04+ / Debian 10+)默认用 chrony 取代了老牌的 ntpd 做时间同步。本文从 NTP 原理讲起,带你完成 chrony 的安装、配置、验证,并给出时间漂移的完整排错方案。
一、为什么服务器需要精确时间
时间一旦漂移,破坏是连锁性的:
- 日志错乱:多台机器日志时间不一致,故障定位无从下手。
- HTTPS 证书:证书有效期校验依赖本地时间,时间超前/滞后会导致"证书尚未生效/已过期"。
- 数据库一致性:MySQL/PostgreSQL 的时间戳、主从复制的 binlog 位置判断都依赖时钟。
- 分布式系统:Redis 过期键、消息队列延时、分布式锁的租约全部依赖时间。
- 任务调度:crontab、systemd timer 按本地时间触发,时区或时钟错误会整体错位。
因此,保证服务器时间同步是运维的基本功,也是所有排错的起点。
二、NTP 原理与 chrony 的优势
NTP(Network Time Protocol)通过分层体系同步时间:Stratum 0 是原子钟/GPS 等基准源,Stratum 1 直连基准源,Stratum 2 从 Stratum 1 同步……层级越高精度越低。客户端向多个服务器发起请求,采用时钟过滤算法剔除异常样本,并持续微调本地时钟。
相比 ntpd,chrony 有两个显著优势:
- 同步更快:启动后几十秒内即可完成初次同步,ntpd 可能需要几分钟甚至更久。
- 适应不稳定网络:使用状态机平滑调整频率,即使网络抖动、机器频繁休眠也能保持精度,特别适合 VPS 和笔记本。
三、安装与初始配置
CentOS / RHEL / Rocky 系:
yum install -y chrony systemctl enable --now chronyd systemctl status chronyd
Debian / Ubuntu 系(多数已预装):
apt update apt install -y chrony systemctl enable --now chrony systemctl status chrony
验证是否已在同步:
chronyc tracking
Reference ID : 3D74A97A (ntp.aliyun.com) Stratum : 2 Ref time (UTC) : Sun Oct 19 03:12:45 2026 System time : 0.000123 seconds slow of NTP time Last offset : +0.000456 seconds RMS offset : 0.003192 seconds Frequency : 2.114 ppm slow ...
看到 System time 偏移在毫秒级,说明同步正常。
四、chrony.conf 配置详解
主配置文件为 /etc/chrony.conf(Debian/Ubuntu 为 /etc/chrony/chrony.conf)。核心配置项:
# 时间服务器:国内 VPS 建议用阿里云 / 腾讯云 NTP,或官方 NTP Pool server ntp.aliyun.com iburst server ntp1.aliyun.com iburst server ntp.tencent.com iburst # pool 指令可一次指定多个服务器,系统自动选优 # pool 2.ntp.pool.org iburst # 允许本机作为时间服务器,为内网其他机器提供同步(可选项) allow 192.168.1.0/24 # 本地时钟作为最后备选(所有服务器都不可达时兜底) local stratum 10 # 让系统时间自动跟随硬件时钟 rtcsync # 日志与统计数据 logdir /var/log/chrony makestep 1 3
关键参数说明:
iburst:首次启动时快速连续发送多个请求,加速初次同步。makestep 1 3:如果时钟偏移超过 1 秒,且前 3 次同步都未收敛,直接大步调整(step)而不是缓慢微调,避免时间长期不准。rtcsync:把系统时间写回硬件时钟,防止重启后时间回退。
五、时区与时区数据库
同步只解决"准",时区决定"显示成几点"。查看与设置时区:
# 查看当前时区 timedatectl # 列出可用时区 timedatectl list-timezones | grep -i shanghai # 设置为上海时区 timedatectl set-timezone Asia/Shanghai # 确认 NTP 同步开关 timedatectl set-ntp true
# 设置后验证 date # Sun Oct 19 11:12:45 CST 2026 (CST = 中国标准时间)
注意:如果程序使用 UTC 存储、本地时间展示(数据库和日志常如此),时区设置不当时很容易出现"差 8 小时"的经典问题,排查时先分清是"时间不准"还是"时区不对"。
六、同步状态验证与监控
chrony 提供了功能强大的客户端命令 chronyc:
# 查看所有时间源的状态 chronyc sources -v # .-- Number of sample points in measurement set. # / .-- Number of time sources with valid data. # (S) (?) (S) (?) ... # ^* ntp.aliyun.com 2/2 5 1 4 +197us[ +235us] +/- 8.9ms # 查看更详细的追踪信息 chronyc sourcestats # 手动触发一次强制同步 chronyc makestep # 查看是否使用了本地时钟(异常信号) chronyc tracking | grep -i stratum
sources 输出中每行首字符含义:^* 表示当前选中的同步源(正常),^- 表示可用但未被选中,^? 表示不可达(异常)。如果所有源都是 ^?,说明网络到 NTP 服务器不通。
七、常见排错手册
7.1 所有时间源不可达(sources 全是 ^?)
# 测试 NTP 端口(123/UDP)连通性 nc -uvz ntp.aliyun.com 123 # 抓包看是否有响应 tcpdump -i eth0 udp port 123 -n -c 10
- 云安全组 / 防火墙需放行 UDP 123 出方向(阿里云默认放行,某些厂商默认禁止 UDP)。
- VPS 时间偏差过大(超过 10 分钟)时,NTP 客户端会拒绝直接同步,先手动校正:
date -s "2026-10-19 11:00:00"或chronyc makestep。 - 检查 DNS 解析:
dig ntp.aliyun.com。
7.2 时间同步了但每次重启都回退
这是硬件时钟(RTC)漂移或与系统时间冲突。确认 rtcsync 已开启,并检查:
# 手动把系统时间写入硬件时钟 hwclock --systohc # 查看硬件时钟时间 hwclock --show
7.3 偏移一直降不下来(几百毫秒抖动)
常见原因是时间源太差或网络抖动大。换用就近的优质 NTP 源(阿里云/腾讯云/华为云),或增加服务器数量让算法取优。也可以把 pollinterval 调大减少频繁采样带来的噪声。
7.4 时间准了但业务日志还是"差8小时"
这是时区问题不是同步问题。确认 timedatectl 时区、php.ini 的 date.timezone、JVM 的 -Duser.timezone、容器 TZ 环境变量是否一致。容器场景别忘了挂载 /etc/localtime 或设置 TZ 环境变量。
八、内网 NTP 服务器:多台机器统一时钟
内网有多台机器时,最好的实践是让一台机器作为内网 NTP 服务器,其余机器从它同步,避免全部直连公网:
# 服务端 /etc/chrony.conf server ntp.aliyun.com iburst allow 192.168.0.0/16 # 允许内网段访问 local stratum 10
# 客户端 /etc/chrony.conf 只需指向内网服务器 server 192.168.1.10 iburst makestep 1 3
# 两端都重启 chrony 并验证 systemctl restart chronyd && chronyc sources -v
总结
时间同步是运维排错的"第一性原理"——时间不对,所有日志、证书、任务、分布式组件都会给你错误信号。掌握 chrony 的核心配置(server/iburst/makestep/rtcsync)、熟练使用 chronyc sources -v 判断同步状态、分清"时间不准"与"时区不对",就能在 90% 的时间类故障中一击命中。建议把 chronyc tracking 的偏移量加入监控告警,偏移超过 500ms 即告警。

