Nginx无法写入access.log文件。

30
当nginx启动时,它会创建一个大小为0的日志文件"access.log",但其中没有任何日志被写入。error.log则工作正常。 nginx.conf:
http {
    access_log /usr/local/webserver/nginx/logs/access.log combined;
    ....
}

日志文件为:

-rw-r--r--  1 root root    0 Mar  4 00:54 access.log
-rw-r--r--  1 root root 3903 Mar  4 00:54 error.log

我完全困惑了。 @_@

这是权限问题吗?

然而,在nginx.conf的后半部分,server {}节中,access_log有效!为什么http {}部分不行?

4个回答

22
根据您的配置,nginx主进程和工作进程可能以不同的用户身份运行。
要查看nginx进程的用户和组,请执行以下操作:
ps -eo "%U %G %a" | grep nginx

root     root     nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
www-data www-data nginx: worker process

工作进程用户需要对日志文件拥有写入权限。
要查看access.log的文件权限:
ls -l /var/log/nginx/access.log
-rw-r----- 1 www-data www-data 0 Apr 29  2012 /var/log/nginx/access.log

在这种情况下,访问日志归nginx工作进程所有,并具有写访问权限。
另请参阅nginx http_log_module文档。
其次,当nginx日志达到一定大小时,可能会由logrotate cronjob进行轮换。创建新的日志文件时,应使用所有者、组和权限来允许nginx工作进程对其进行写入。
这些针对nginx的日志轮换设置定义在/etc/logrotate.d/nginx中。
另请参阅ubuntu日志轮换指南

2
logrotate不是守护进程,而是一个cron作业。 - Sebastian
2
很好的观点,@Sebastian。在这种情况下,“守护进程”的定义源自古希腊:“一种仁慈或良性的自然精灵”。;-) - Mark
3
logrotate的真正本质 :) @Mark - Sebastian
非常棒的信息,谢谢; 原来是logrotate给我带来了问题! - Simon

9

我曾遇到类似的问题,即访问日志文件没有被写入,但错误日志文件正常工作。对我来说权限也没问题。我通过强制nginx进程重新加载日志文件来解决了这个问题,方法如下:

kill -USR1 `cat /var/run/nginx.pid`

其中/var/run/nginx.pid是您的nginx PID文件的路径。


4
在Ubuntu上执行sudo service nginx restart命令后,我的Nginx又开始记录access.log了(在我更正了正确用户的权限之后)。 - program247365

3

你必须将用户和组nginx绑定到你的日志文件上。

chown nginx:nginx access.log
chown nginx:nginx error.log

您能发布您完整的nginx.conf文件吗?例如使用pastebin?

编辑:在每个部分中,您必须定义关键字,例如“combined”!


2
在Ubuntu中,它是www-data:www-data。 - holms
4
如果nginx无法写入其最初创建的日志文件,那么更改文件权限不是解决问题的根本原因。你可能需要查看nginx配置文件。 - nick fox
默认情况下,是的。 - sitilge

0

我遇到的一种情况是磁盘已满


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接