Nginx 日志出现权限错误(常见如 Permission denied 无法写入 access.log / error.log),通常是日志文件或目录权限/属主不对、SELinux 限制或systemd 保护机制导致的。下面按常见场景给你一份排查与修复清单。
ps -ef | grep nginx
一般看到:
nginx: master process /usr/sbin/nginx
www-data 1234 ... nginx: worker process
常见用户:
www-datanginx假设日志在 /var/log/nginx/:
sudo chown -R www-data:adm /var/log/nginx
sudo chmod -R 755 /var/log/nginx
如果是 CentOS:
sudo chown -R nginx:nginx /var/log/nginx
sudo touch /var/log/nginx/access.log
sudo touch /var/log/nginx/error.log
sudo chown www-data:adm /var/log/nginx/*.log
sudo chmod 644 /var/log/nginx/*.log
Nginx 不仅要能写文件,还要能进入目录
namei -l /var/log/nginx/access.log
确保每一级目录都有 x 权限(如 drwxr-xr-x)
sudo tail -f /var/log/audit/audit.log
如果看到 avc: denied
sudo restorecon -Rv /var/log/nginx
或临时关闭测试:
sudo setenforce 0
如果你自定义了日志路径(如 /data/logs/nginx):
systemctl cat nginx
可能看到:
ProtectHome=true
ProtectSystem=full
ReadWritePaths=/var/log/nginx
在 /etc/systemd/system/nginx.service.d/ 下加:
[Service]
ReadWritePaths=/your/log/path
然后:
sudo systemctl daemon-reload
sudo systemctl restart nginx
sudo lsof | grep access.log
如果是 logrotate 后权限变了:
sudo logrotate -f /etc/logrotate.d/nginx
并确保 logrotate 配置里有:
create 0644 www-data adm
如果你愿意,可以把具体报错信息(如 2024/01/01 [crit] open() "/var/log/nginx/access.log" failed (13: Permission denied))贴出来,我可以帮你精确判断是哪一种原因。