如何在access_log路径中使用PCRE匹配

时间:2013-08-13 02:08:27

标签: nginx

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

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

 }

3 个答案:

答案 0 :(得分:2)

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

location ~ /foo/(?<mylog>.*) {
    access_log /var/log/$mylog.access.log;
}

答案 1 :(得分:1)

你应该记住一些事情,可能你必须已经知道所有这些;)。

  1. Nginx有 一个父进程(MASTER PROCESS) ,它始终以 root 运行。
  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'用户拥有和运行)处理, 不是 THE MASTER PROCESS (由'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;
    

    显然失败了。

  6. 为了让事情顺利进行,请按照这种方式进行。

    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的方法。

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

      还考虑下面@ TroyCheng的评论,

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

答案 2 :(得分:0)

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

这应该有效:

location ~ /foo/(.*) {
    access_log /var/log/foo.access.log; //you can add [log_format] at last;
}