0

我读了这篇文章http://wiki.nginx.org/HttpLogModule,似乎这是可能的。我想做一些类似于我在下面的配置指令中所做的事情,但这似乎不起作用。任何人都可以提供一些指导吗?

location ~ /foo/(.*) {
    access_log /var/log/$1.access.log;

 }
4

3 回答 3

2

您的位置捕获 ( $1) 在日志阶段不存在。您应该改用命名捕获。

location ~ /foo/(?<mylog>.*) {
    access_log /var/log/$mylog.access.log;
}
于 2013-08-13T08:35:13.930 回答
1

您应该记住几件事情,可能您必须已经知道所有事情;)。

  1. Nginx 有一个始终以root身份运行的父进程(MASTER PROCESS)
  2. 当 nginx启动/重新启动/重新加载时以及由root 用户创建默认日志(如果它不存在)。
  3. 所以很明显/var/log/nginx的所有者是root。

    drwxr-xr-x  2 root root   4096 Aug 14 01:35 nginx/
    

    或者概括地说,/var/log 的所有者也是 root,只有 root 可以写入。

  4. 任何请求都由工作进程(由“nginx/nobody”用户拥有和运行)处理,而不是由进程(由“root”用户拥有和运行)处理。

    如果没有 nginx 用户,则工作进程由用户nobody*运行。

    root      1272  0.0  0.1  12080  3932 ?        Ss   00:27   0:00 nginx: master process         /usr/sbin/nginx -c /etc/nginx/nginx.conf
    nobody    4226  0.0  0.0  12240  2236 ?        S    01:43   0:00 nginx: worker process
    
  5. 在这种情况下,在处理位置块时,如果要在 /var/log/nginx 中写入日志,则会出现权限错误:'((作为其 nginx 或nobody 用户,无权在此目录中写入) .

    这也适用于日志在 /var/log 中的情况

    2013/08/14 02:00:39 [crit] 4226#0: *20 open() "/var/log/nginx/adad?qwerty.access.log" failed (13: Permission denied) while logging request, client: 127.0.0.1, server: localhost, request: "GET /adad?qwerty HTTP/1.1", host: "localhost"
    

    在上面的示例中,我将日志写为

    access_log /var/log/nginx/$request_uri.access.log;
    

    这显然失败了。

因此,要使事情正常进行,请遵循这种方式。

  1. 为 nginx 创建一个用户,它的建议是——

    useradd -s /sbin/nologin -M nginx
    
  2. 更新您的 nginx 配置 /etc/nginx/nginx.conf (将其添加到此配置的第一行)并重新加载它(服务 nginx 重新加载)

    user    nginx;
    

    现在所有工作进程(子进程)都将以用户身份运行 - 'nginx'

  3. 为保存日志创建一个公共目录,例如 /var/log/ nginx/并更新 nginx 配置以指向该位置。

    在此之后重新加载 nginx。

  4. 现在最重要的是,让这个目录归 nginx 用户所有。

    chown -R nginx:nginx /var/log/nginx 
    
  5. 最后,您可以在位置块中使用@VBART 的方法。

如果出现问题,请在调试模式下启用 error_log,如果有问题,它会告诉你。

并考虑下面@TroyCheng 的评论,

如果您已经启动了 nginx 服务 ,即主进程,来自其他用户说“工作”或(我的情况下的 nginx),那么所有子进程也将从该权限运行,在这种情况下,您将不得不(很难开始这个过程,你必须已经这样做了)允许这个用户在日志目录中写入日志,比如 /var/log/nginx

于 2013-08-13T21:03:18.223 回答
0

实际上,这里的 1 美元并不是您想要的。请注意 location 指令中的正则表达式仅适用于 url 匹配,它不会提取任何变量,因此您不能使用 $x 从 location 指令中获取匹配值。

这应该有效:

location ~ /foo/(.*) {
    access_log /var/log/foo.access.log; //you can add [log_format] at last;
}
于 2013-08-13T03:03:28.620 回答