Nginx 日志无法写入,通常不是单一原因,而是权限、路径、配置或磁盘等问题叠加。下面按最常见 → 较少见的顺序帮你系统排查。
access.log / error.log 不生成ls -ld /var/log/nginx
ls -l /var/log/nginx/*.log
drwxr-x--- nginx nginx /var/log/nginx
-rw-r--r-- nginx nginx access.log
chown -R nginx:nginx /var/log/nginx
chmod 755 /var/log/nginx
⚠️ 如果你用的是 root 启动 worker,但配置里是
user nginx;,权限很容易错。
access_log /var/log/nginx/access.log;
但目录不存在
nginx -t
mkdir -p /var/log/nginx
df -h
df -i
df -h:磁盘空间df -i:inode 已满(日志小文件多时常见)rm -f 旧日志
journalctl --vacuum-time=7d
getenforce
如果是 Enforcing,很可能是 SELinux 阻止写入。
setenforce 0
如果立刻能写日志,就是 SELinux 问题。
semanage fcontext -a -t httpd_log_t "/data/logs(/.*)?"
restorecon -Rv /data/logs
access_log off;
access_log /var/log/nginx/access.log if=$loggable;
如果 $loggable = 0,日志不会写。
access_log /data/logs/$host/access.log;
但 /data/logs/example.com 不存在。
✅ Nginx 不会自动创建目录
mkdir -p /data/logs/example.com
chown -R nginx:nginx /data/logs
user nginx;
但日志目录只允许 root 写。
ps -ef | grep nginx
systemctl cat nginx
ProtectHome=yes
ProtectSystem=full
ReadWritePaths=/var/log/nginx
✅ 自定义日志目录必须加入:
ReadWritePaths=/data/logs
然后:
systemctl daemon-reload
systemctl restart nginx
logrotate 把文件删了,但 Nginx 仍持有旧 fd
nginx -s reload
✅ 正规 logrotate 应带:
postrotate
nginx -s reload
endscript
# 1. 配置是否正确
nginx -t
# 2. 目录是否存在
ls /var/log/nginx
# 3. 权限
ls -ld /var/log/nginx
# 4. 磁盘
df -h
# 5. SELinux
getenforce
# 6. 是否真的没写
lsof | grep nginx | grep log
Nginx 日志写不进去,90% 是:权限不对 / 目录不存在 / 磁盘满 / SELinux 拦截。
如果你愿意,可以把下面信息发我,我可以直接帮你定位到具体原因:
nginx -t 输出我可以直接给你精确修复命令 ✅