Nginx 日志中显示的时间“不对”,通常不是 Nginx 本身算错了,而是时区或时间来源的问题。常见原因和排查方式如下:
Nginx 默认使用 系统的本地时区。
查看系统时间与时区:
date
timedatectl
如果时区是 UTC,而你在 CST / Asia/Shanghai,日志就会“慢 8 小时”。
解决:
# CentOS / Ubuntu
timedatectl set-timezone Asia/Shanghai
重启 Nginx:
nginx -s reload
容器里默认一般是 UTC。
排查:
docker exec -it 容器名 date
解决方式之一(挂载宿主机时区):
-v /etc/localtime:/etc/localtime:ro
-v /etc/timezone:/etc/timezone:ro
或在 Dockerfile 中:
ENV TZ=Asia/Shanghai
常用变量:
$time_local:本地时间(受系统时区影响)$time_iso8601:ISO 时间(也是本地时间)示例:
log_format main '$remote_addr - $time_local';
如果系统时区是 UTC,日志就是 UTC。
date
同步时间:
# CentOS
ntpdate pool.ntp.org
# 或
chronyc -a makestep
$msec / $request_time 等精度时间这些不是“日志时间”,而是:
$msec:请求处理时间(带毫秒)$request_time:请求总耗时它们不会显示时区,不要误以为是时间不对。
如果 Nginx 前面还有:
日志时间是对当前 Nginx 收到请求的时间,不是用户真实访问时间。
date # 系统时间是否正确
timedatectl # 时区是否正确
nginx -V # 是否特殊编译
docker exec xx date # 容器时间
timedatectl set-timezone Asia/Shanghai
nginx -s reload
日志格式建议:
log_format json escape=json '{'
'"time":"$time_iso8601",'
'"remote_addr":"$remote_addr"'
'}';
如果你愿意,可以贴一下:
date 输出我可以直接帮你判断是哪一种情况。