温馨提示×

nginx日志时间不对原因

小樊
42
2026-10-24 22:07:21
栏目: 编程语言

Nginx 日志中显示的时间“不对”,通常不是 Nginx 本身算错了,而是时区或时间来源的问题。常见原因和排查方式如下:


一、最常见原因:时区不对(90% 情况)

1. 系统时间是对的,但时区不是你以为的

Nginx 默认使用 系统的本地时区。

查看系统时间与时区:

date
timedatectl

如果时区是 UTC,而你在 CST / Asia/Shanghai,日志就会“慢 8 小时”。

解决:

# CentOS / Ubuntu
timedatectl set-timezone Asia/Shanghai

重启 Nginx:

nginx -s reload

2. Docker / 容器环境(非常常见)

容器里默认一般是 UTC。

排查:

docker exec -it 容器名 date

解决方式之一(挂载宿主机时区):

-v /etc/localtime:/etc/localtime:ro
-v /etc/timezone:/etc/timezone:ro

或在 Dockerfile 中:

ENV TZ=Asia/Shanghai

二、Nginx 使用 UTC 时间(配置或编译原因)

1. Nginx 日志格式中的时间变量

常用变量:

  • $time_local:本地时间(受系统时区影响)
  • $time_iso8601:ISO 时间(也是本地时间)

示例:

log_format main '$remote_addr - $time_local';

如果系统时区是 UTC,日志就是 UTC。


三、系统时间本身不对(不是时区问题)

1. 服务器时间错了

date

同步时间:

# CentOS
ntpdate pool.ntp.org

# 或
chronyc -a makestep

四、使用 $msec / $request_time 等精度时间

这些不是“日志时间”,而是:

  • $msec:请求处理时间(带毫秒)
  • $request_time:请求总耗时

它们不会显示时区,不要误以为是时间不对。


五、前端 / 代理导致“看起来不对”

1. 反向代理转发时间

如果 Nginx 前面还有:

  • CDN
  • LB
  • 其他 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"'
'}';

如果你愿意,可以贴一下:

  • 系统(CentOS / Ubuntu / Docker)
  • date 输出
  • Nginx 日志示例

我可以直接帮你判断是哪一种情况。

0 踩