Nginx-动态虚拟主机的错误日志

Nginx-动态虚拟主机的错误日志,nginx,vhosts,error-log,Nginx,Vhosts,Error Log,如何获得动态虚拟主机的错误日志文件 server { listen 80; server_name ~^(?<folder>[^.]*).(?<user>[^.]*).dev.example.com; root /var/www/projects/dev/$user/$folder/htdocs; access_log /var/www/projects/dev/$user/$folder/access.log; error_l

如何获得动态虚拟主机的错误日志文件

server {
    listen 80;

    server_name ~^(?<folder>[^.]*).(?<user>[^.]*).dev.example.com;

    root /var/www/projects/dev/$user/$folder/htdocs;
    access_log /var/www/projects/dev/$user/$folder/access.log;
    error_log  /var/www/projects/dev/$user/$folder/error.log;
}
服务器{
听80;
服务器名称~^(?[^.]*)(?[^.]*)。dev.example.com;
root/var/www/projects/dev/$user/$folder/htdocs;
access_log/var/www/projects/dev/$user/$folder/access.log;
error_log/var/www/projects/dev/$user/$folder/error.log;
}

根目录和访问日志工作正常,但如果我添加错误日志行,则nginx无法启动,因为/var/www/projects/dev/$user/$folder/不存在。

这根本不受支持-您可以在中使用变量,但不能在中使用

注意,一般来说,在
access\u log
error\u log
中使用用户输入变量是一个非常糟糕的主意,因为您引入了恶意用户通过在
主机
头中使用随机字符串发出请求的可能性,这可能会导致为每个新请求创建一个新文件。这甚至可能是由于某人试图枚举服务器上所有可能的用户而无意中(没有恶意)发生的。您的特定代码不一定会遇到这种情况,因为任何UNIX软件通常都不会自动创建目录,但这仍然不是最好的方法

在nginx理念中,最好为每个用户生成一个单独的配置(因为nginx可以在没有任何停机的情况下重新启动)。考虑到它有额外的好处,因为NGNX很大程度上依赖于数学上高效的数据结构来找到正确的<代码>服务器< /代码>(基于ReGEXP的服务器配置没有)。不在
access\u log
中使用变量也可以确保对
access\u log
的写入可以得到缓冲,这可以极大地提高服务器的有效吞吐量(尤其是当您登录到非SSD HDD时)


基本上,nginx中已经有很多bandaid支持
access\u log
中的变量(只需查看变量用于指定文件的时间限制列表),而且,我想,在
error\u log
中引入更多这样的bandaid也被认为是不合适的(特别是考虑到生产场景中的
error\u log
不应该像
access\u log
那么大,因此,如果需要,您可以轻松编写外部工具将其拆分).

BTW,有一件事我甚至忘了明确提到——如果您的
error\u log
在一个目录中指定了一个不存在的文件,那么错误消息会出现在哪里?!正是由于这个原因和许多其他原因,变量不存在(也不应该存在)支持
error\u log
。我知道这不是您希望的答案,但它确实回答了问题,您是否愿意接受答案和/或奖励奖金?如果您在宽限期的接下来4小时内没有采取任何行动,至少一半的奖金金额将不可挽回地丢失。感谢您的奖金!+1!