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的主要内容,如果未能解决你的问题,请参考以下文章

微信登录时用户信息无法写入数据库

Linux 系统挂载 ntfs 移动硬盘无法写入的问题

2022-02-24 安装微信开发者工具失败,报错:无法写入libgit2.lib

ClickHouse集群方案测评

将用户名从 Nginx 传递或写入应用程序

跨域请求response中有Set-cookie,但是Cookie无法写入浏览器问题