必须启用stream模块才能代理NTP,因NTP基于UDP 123端口,而HTTP模块仅支持TCP;stream模块实现无状态四层UDP透传,精度损耗极小,并需配置reuseport、调优内核参数及Chrony客户端指向代理IP。

不能用 Nginx 的 HTTP 模块代理 NTP,必须启用 stream 模块,因为 NTP 协议基于 UDP 123 端口,而 HTTP 模块只处理 TCP 流量。Nginx 本身不解析或参与 NTP 协议交互,它仅做四层转发,所以“代理”实为无状态透传,精度损耗极小(通常
启用 stream 模块并配置 NTP 转发
Nginx 默认不编译 stream 模块,需确认安装时已启用:
- 检查是否支持:
nginx -V 2>&1 | grep -o with-stream,有输出即支持 - 若无,需重新编译:configure 时加
--with-stream参数 - 在主配置文件
/etc/nginx/nginx.conf的顶层(http块之外)添加:
upstream ntp_backend {
server 192.168.10.5:123 weight=5;
server 192.168.10.6:123 weight=3;
server 192.168.10.7:123 backup;
}
server {
listen 123 udp reuseport;
proxy_pass ntp_backend;
proxy_timeout 1s;
proxy_responses 1;
}
}
确保内核与系统适配 UDP 高频转发
UDP 123 是短连接、高频小包(每次约 48 字节),需调优避免丢包:
- 增大接收缓冲区:
sysctl -w net.core.rmem_max=4194304,并写入/etc/sysctl.conf - 禁用 ICMP 目标不可达响应(减少干扰):
sysctl -w net.ipv4.icmp_echo_ignore_all=1 - 绑定 CPU 核心提升确定性(可选):
taskset -c 1 nginx -g "daemon off;" - 验证监听状态:
ss -ulpn | grep ':123',应看到nginx进程监听*:123
客户端统一指向 Nginx 代理 IP,禁用直连公网源
所有内网服务器应只信任该代理,避免时间源冲突:
- Chrony 客户端配置(
/etc/chrony.conf):
driftfile /var/lib/chrony/drift
makestep 1.0 3
logdir /var/log/chrony
- 立即生效:
chronyc makestep && systemctl restart chronyd - 验证:
chronyc tracking查看 Offset(理想值 chronyc sources -v 确认 * 标记指向代理 IP
高可用增强:Nginx + Keepalived 组 VIP 集群
单台 Nginx 仍是单点,建议部署双机热备,共享虚拟 IP(如 10.1.5.123):
- 两台 Nginx 服务器均部署相同 stream 配置
- Keepalived 配置中指定
vrrp_instance VI_1绑定 10.1.5.123 到 eth0 - 健康检查脚本检测
ss -uln | grep ':123'是否存活,失败则切主 - 客户端始终使用 VIP,无需感知后端变更


















