Nginx 无法写入 access.log
Posted
技术标签:
【中文标题】Nginx 无法写入 access.log【英文标题】:Nginx cannot write into access.log 【发布时间】:2012-03-22 02:45:51 【问题描述】:当 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 部分不起作用?
【问题讨论】:
【参考方案1】:我遇到的一种情况是磁盘满了
【讨论】:
【参考方案2】:根据您的配置,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 docs。
作为次要问题,一旦 nginx 日志达到一定大小,logrotate cronjob 可能会对其进行轮换。当新的日志文件被创建时,它应该被创建为拥有者、组和权限,以允许 nginx 工作进程对其进行写入。
这些 nginx 的日志轮换设置在 /etc/logrotate.d/nginx 中定义
另见log rotation guide for ubuntu。
【讨论】:
logrotate 不是一个守护进程,它是一个 cronjob 好点@Sebastian。在这种情况下,守护进程的定义源自古希腊语:“仁慈或仁慈的自然精神”。 ;-) logrotate 的本性 :) @Mark【参考方案3】:我有一个类似的问题,访问日志文件没有被写入,但错误日志文件工作正常。权限对我来说也很好。我通过强制 nginx 进程重新加载日志文件来修复它自己使用
kill -USR1 `cat /var/run/nginx.pid`
/var/run/nginx.pid
是你的 nginx PID 文件的路径
【讨论】:
只是在 Ubuntu 上做sudo service nginx restart
让它开始为我再次编写 Nginx acces.log。 (在我更正了正确用户的权限之后)【参考方案4】:
您必须将用户和组 nginx 绑定到您的日志文件。
chown nginx:nginx access.log
chown nginx:nginx error.log
你能发布你完整的 nginx.conf 吗?以 pastebin 为例?
编辑:在每个部分中,您必须定义“组合”之类的关键字!
【讨论】:
它是 ubuntu 中的 www-data:www-data 如果 nginx 无法写入它最初创建的日志,chmod 文件并不能解决问题的根本原因。您可能需要查看 nginx 配置。 @holms 默认是,是的。以上是关于Nginx 无法写入 access.log的主要内容,如果未能解决你的问题,请参考以下文章