我读过这篇文章http://wiki.nginx.org/HttpLogModule,看来这是可能的。我想做一些类似我在下面的配置指令中所做的事情,但这似乎不起作用。任何人都可以提供一些指导吗?
location ~ /foo/(.*) {
access_log /var/log/$1.access.log;
}
答案 0 :(得分:2)
您的位置捕获($1
)在日志阶段不存在。您应该使用命名捕获。
location ~ /foo/(?<mylog>.*) {
access_log /var/log/$mylog.access.log;
}
答案 1 :(得分:1)
你应该记住一些事情,可能你必须已经知道所有这些;)。
很明显,/ var / log / nginx的所有者是root。
drwxr-xr-x 2 root root 4096 Aug 14 01:35 nginx/
或者概括,/ var / log的所有者也是root用户,只有root可以写入。
任何请求都由工作进程(由'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
在这种情况下处理位置块如果要在/ 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;
显然失败了。
为了让事情顺利进行,请按照这种方式进行。
为nginx创建一个用户,建议为 -
useradd -s /sbin/nologin -M nginx
更新你的nginx配置/etc/nginx/nginx.conf(在此配置的第一行添加)并重新加载(服务nginx重新加载)
user nginx;
现在所有工作进程(子进程)都将以用户身份运行 - 'nginx'
创建一个用于保存日志的公共目录/ var / log / nginx / ,并更新nginx配置以指向此位置。
在此之后重新加载nginx。
现在最重要的是,让这个目录由nginx用户拥有。
chown -R nginx:nginx /var/log/nginx
最后,您可以在位置块中使用@ VBART的方法。
如果出现问题,请在调试模式下启用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;
}