我读了这篇文章http://wiki.nginx.org/HttpLogModule,似乎这是可能的。我想做一些类似于我在下面的配置指令中所做的事情,但这似乎不起作用。任何人都可以提供一些指导吗?
location ~ /foo/(.*) {
access_log /var/log/$1.access.log;
}
我读了这篇文章http://wiki.nginx.org/HttpLogModule,似乎这是可能的。我想做一些类似于我在下面的配置指令中所做的事情,但这似乎不起作用。任何人都可以提供一些指导吗?
location ~ /foo/(.*) {
access_log /var/log/$1.access.log;
}
您的位置捕获 ( $1
) 在日志阶段不存在。您应该改用命名捕获。
location ~ /foo/(?<mylog>.*) {
access_log /var/log/$mylog.access.log;
}
您应该记住几件事情,可能您必须已经知道所有事情;)。
所以很明显/var/log/nginx的所有者是root。
drwxr-xr-x 2 root root 4096 Aug 14 01:35 nginx/
或者概括地说,/var/log 的所有者也是 root,只有 root 可以写入。
任何请求都由工作进程(由“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
在这种情况下,在处理位置块时,如果要在 /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
实际上,这里的 1 美元并不是您想要的。请注意 location 指令中的正则表达式仅适用于 url 匹配,它不会提取任何变量,因此您不能使用 $x 从 location 指令中获取匹配值。
这应该有效:
location ~ /foo/(.*) {
access_log /var/log/foo.access.log; //you can add [log_format] at last;
}