Nginx无法写入access.log

Set*_*eth 20 linux nginx amazon-ec2 logfile

当nginx启动时,它会创建0大小的日志文件"access.log".但是没有写入日志.error.log工作正常.

nginx.conf:

http {
    access_log /usr/local/webserver/nginx/logs/access.log combined;
    ....
}
Run Code Online (Sandbox Code Playgroud)

日志文件是:

-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
Run Code Online (Sandbox Code Playgroud)

我完全糊涂了.@ _ @

这是一个许可问题吗?

但是,在nginx.conf的后面部分,在server {}部分,access_log有效!为什么http {}部分不起作用?

Mar*_*ark 19

根据您的配置,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
Run Code Online (Sandbox Code Playgroud)

工作进程用户需要对日志文件的写许可权.

要查看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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,访问日志由nginx工作进程拥有,并具有写访问权限.

另请参见nginx http_log_module文档.

作为次要问题,nginx日志可以通过logrotate cronjob一旦达到一定大小就旋转.创建新日志文件时,应使用所有者,组和权限创建它,以允许nginx工作进程写入它.

nginx的这些日志轮换设置在/etc/logrotate.d/nginx中定义

另请参阅ubuntu的日志轮换指南.

  • logrotate不是一个守护进程,它是一个cronjob (2认同)
  • 好点@Sebastian.在这种情况下,守护进程的定义来源于古希腊语:"一种仁慈或良性的自然精神".;-) (2认同)
  • logrotate的真实本质:) @Mark (2认同)

Ani*_*ain 8

我有一个类似的问题,访问日志文件没有被写入,但错误日志文件工作正常.权限也适合我.我通过强制nginx进程使用重新加载日志文件来解决自己

kill -USR1 `cat /var/run/nginx.pid`
Run Code Online (Sandbox Code Playgroud)

/var/run/nginx.pid你的nginx PID文件的路径在哪里

  • 刚刚在Ubuntu上执行`sudo service nginx restart`让它开始为我重新编写Nginx acces.log.(在我更正了正确用户的权限之后) (2认同)

小智 3

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

chown nginx:nginx access.log
chown nginx:nginx error.log
Run Code Online (Sandbox Code Playgroud)

你能发布完整的 nginx.conf 吗?例如用pastebin?

编辑:在每个部分中,您必须定义“组合”等关键字!

  • 如果 nginx 无法写入它最初创建的日志,则 chmod'ing 文件并不能解决问题的根本原因。您可能需要查看 nginx 配置。 (4认同)
  • 这是 ubuntu 中的 www-data:www-data (2认同)