服务器时间同步:chrony 把时间对准
服务器时间差几分钟,证书报错、日志对不上、定时任务乱跑。小够讲 chrony 时间同步:安装配置、验证方法,5 分钟让时间永远准确。
我是小够。时间不对是个隐形坑:HTTPS 证书校验看时间,差太多浏览器直接报错;日志时间戳错乱,排查时对不上;定时任务在错误的时间跑;API 签名(很多接口要求时间戳在 ±5 分钟内)直接失败。服务器时间必须准,这是运维基本功。
先看看时间对不对
timedatectl
看 System clock synchronized 是不是 yes,再看时间和北京时间差多少。差几秒正常,差几分钟就有问题。
chrony:现代的时间同步工具
以前用 ntpd,现在主流发行版默认都是 chrony:同步快、对网络抖动容忍好,VPS 关机一段时间再开机也能快速追上。
# Debian/Ubuntu
sudo apt install chrony
sudo systemctl enable --now chrony
配置文件 /etc/chrony/chrony.conf,默认的 NTP 池一般就能用。国内 VPS 可以换成国内的 NTP 服务器,同步更快更稳:
# 注释掉默认池,加国内源
server ntp.aliyun.com iburst
server ntp.tencent.com iburst
改完重启:sudo systemctl restart chrony。
验证
# 看同步状态
chronyc tracking
# 看时间源
chronyc sources
tracking 里看 Leap status 是 Normal、Stratum 是个位数,就正常了。刚配好等一两分钟再看,同步需要一点时间收敛。
常见问题
Q:时间差太多,chrony 追不上?
A:差几小时的话,先手动设个大概:sudo timedatectl set-time "2025-08-27 15:00:00",再让 chrony 微调。或者 chronyc makestep 强制跳变。
Q:容器里时间不对? A:容器和宿主机共用内核时钟,容器里调不了时间,要去宿主机上配。这是正常的,别在容器里折腾。
Q:和时区设置什么关系?
A:两回事。NTP 保证的是"时刻准确"(UTC 时间对),时区决定的是"显示成哪个时区"。两个都要对:NTP 同步 + timedatectl set-timezone Asia/Shanghai。
小够的建议
- 装机第一件事就配好时间同步,别等出问题了再查
- 监控里加一项时间偏移检查,简单但有效
- 日志、备份文件名都用 UTC 还是本地时间?定个规范全站统一,别混用
时间准了,很多莫名其妙的问题就消失了。5 分钟的配置,值得。
chrony 配置详解
/etc/chrony/chrony.conf 核心就几行:
# 时间源,iburst 表示启动时快速同步
server ntp.aliyun.com iburst
server ntp.tencent.com iburst
server pool.ntp.org iburst
# 允许 chrony 大步调整时间(默认 3 次更新内)
makestep 1 3
# 记录时钟漂移,下次启动更快收敛
driftfile /var/lib/chrony/drift
时间源配 3-4 个,互相校验,单个挂了不影响。
systemd-timesyncd:更轻的选择
Debian/Ubuntu 自带 systemd-timesyncd,更轻量,个人 VPS 完全够用:
timedatectl set-ntp true
# 配文件 /etc/systemd/timesyncd.conf
[Time]
NTP=ntp.aliyun.com ntp.tencent.com
chrony 功能更强(NTP 服务器、复杂网络),timesyncd 更轻(二选一,别两个都开)。
NTP 安全:别当别人的时间服务器
chrony 默认只做客户端,不对外服务,这就对了。千万别把 NTP 服务开到公网,会被拿去做 NTP 放大攻击,流量能把你的 VPS 打满。
检查:ss -ulnp | grep 123,确认没有对外监听。
离线/内网环境
没公网的机器(比如纯内网),指定一台内网机器做时间源:
# 内网时间服务器
server 192.168.1.10 iburst
内网那台再去同步公网 NTP,层级结构,经典做法。
监控时间偏移
# 写个简单检查,偏移超 5 秒告警
chronyc tracking | grep "System time"
输出里有偏移量,配进监控。时间漂移通常是宿主机的问题(超售严重的机器时钟会飘),发现漂移先找商家工单。
常见问题
Q:chrony 和 ntpd 冲突吗?
A:只能跑一个。装 chrony 时包管理器一般会自动处理,systemctl status 确认只有一个在跑。
Q:时间总是不准,调好了又飘? A:VPS 的时钟来自宿主机,超售严重的宿主机时钟会漂移。这是商家问题,开工单;工单解决不了,换商家。时间都保不住的机器,别放重要业务。
Q:夏令时要管吗? A:服务器一律用 UTC 或固定时区(如 Asia/Shanghai),别用夏令时地区。日志和定时任务最怕一年调两次时间。
时间不同步的真实案例
小够见过的坑:
- Let’s Encrypt 申请失败:时间差了 10 分钟,ACME 校验直接拒绝,证书下不来
- API 签名失败:对接第三方接口,时间戳差 5 分钟,签名无效,调了一下午以为是密钥错了
- 定时任务乱跑:cron 设的凌晨 2 点,结果服务器时间是 UTC,实际 10 点才跑,备份和高峰撞车
- 日志对不上:两台机器时间差 3 分钟,排查跨机器的问题时,日志时间线全乱
每一个都是"小问题,大麻烦"。时间同步是地基,地基歪了上面全歪。
chrony vs systemd-timesyncd 怎么选
| chrony | systemd-timesyncd | |
|---|---|---|
| 精度 | 高 | 够用 |
| 功能 | 全(可做服务端) | 客户端 only |
| 资源 | 稍多 | 极轻 |
| 推荐 | 业务机器 | 个人小 VPS |
个人博客用 timesyncd 就够了,业务机器上 chrony。记住只开一个。
容器和虚拟机的时间
- Docker 容器:和宿主机共享时钟,容器里不用配,配了也白配
- KVM 虚拟机:时钟可能漂移,虚拟机里要跑 chrony
- 宿主机:超售严重的宿主机时钟会飘,这是商家问题,开工单
一键检查脚本
#!/bin/bash
# time-check.sh
echo "=== 系统时间 ==="
timedatectl | grep -E "Local time|Universal time|synchronized"
echo "=== chrony 状态 ==="
chronyc tracking | grep -E "Leap status|System time"
echo "=== 与标准时间差 ==="
chronyc tracking | grep "Last offset"
偏移(Last offset)在毫秒级就是正常的,秒级以上要查。
小够的建议
时间同步是"装机第一天"清单里的一项,和换源、建用户、配 SSH 并列。别等到证书报错、API 罢工了才想起来。5 分钟配置,终身受益——这是运维里性价比最高的事情之一。