Nginx 突然不写访问日志,通常不是“它坏了”,而是配置或运行环境发生了变化。下面按最常见原因 → 排查方法给你一个清单,你可以逐条核对。
access_log 被关闭或覆盖检查配置中是否有:
access_log off;
或在某些 server / location 中被重新定义:
access_log /dev/null;
✅ 解决:确认 http、server、location 层级都有正确的 access_log
例如:
access_log /var/log/nginx/access.log;
但:
/var/log/nginx 不存在www-data、nginx)无写权限✅ 排查:
ls -ld /var/log/nginx
ps -ef | grep nginx
✅ 解决:
chown -R nginx:nginx /var/log/nginx
chmod 755 /var/log/nginx
if 导致日志被跳过(经典坑)比如:
if ($remote_addr = "1.2.3.4") {
return 403;
}
或在 if 中写了 access_log off;
⚠️ nginx 官方不推荐在 if 里控制日志
常见配置:
access_log /var/log/nginx/access.log main buffer=32k flush=5s;
在低流量时,可能几分钟内看不到新日志。
✅ 解决(临时调试):
access_log /var/log/nginx/access.log main;
例如:
return 444;deny 掉error_page 拦截try_files 直接处理但配置异常✅ 排查:
打开 error_log 到 debug:
error_log /var/log/nginx/error.log debug;
logrotate 后 nginx 仍写旧文件:
lsof | grep access.log
✅ 解决:
nginx -s reopen
或 logrotate 中加:
postrotate
nginx -s reopen
endscript
✅ 检查:
docker exec -it nginx ls -l /var/log/nginx
# 1. 检查配置
nginx -T | grep access_log
# 2. 测试配置
nginx -t
# 3. 看文件时间
ls -l --time-style=full-iso /var/log/nginx/access.log
# 4. 看 nginx 进程用户
ps -o user= -p $(pgrep nginx | head -1)
你可以贴出:
nginx -T 的输出(重点 http/server/location)我可以直接告诉你是哪一行配置导致的。