Nginx - 动态虚拟主机的 error_log

Posted

技术标签:

【中文标题】Nginx - 动态虚拟主机的 error_log【英文标题】:Nginx - error_log for dynamic vhosts 【发布时间】:2019-01-10 07:50:16 【问题描述】:

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

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;

root 和 access_log 工作正常,但如果我添加 error_log 行,则 nginx 无法启动,因为 /var/www/projects/dev/$user/$folder/ 不存在。

【问题讨论】:

我知道这不是您希望的答案,但它确实回答了这个问题,您愿意接受答案和/或奖励赏金吗?如果您在宽限期的接下来 4 小时内未执行任何操作,至少有一半的赏金将不可挽回地损失。 感谢您的赏金! +1! 【参考方案1】:

这根本不受支持 - 您可以使用 http://nginx.org/r/access_log 中的变量,但不能使用 http://nginx.org/r/error_log 中的变量。

附:请注意,一般来说,在access_logerror_log 中使用用户输入变量是一个非常糟糕的主意,因为您可能会通过在@ 中使用随机字符串发出请求来使恶意用户耗尽inodes on your filesystem 987654328@ 标头,这可能会导致为每个新请求创建一个新文件。这甚至可能会因某人试图枚举您服务器上所有可能的用户而无意中(没有恶意)发生。您的特定代码不一定会受此影响,因为任何 UNIX 软件通常不会自动创建目录,但这仍然不是最好的处理方式。

在 nginx 哲学中,最好为每个用户生成一个单独的http://nginx.org/r/server 配置(因为 nginx 可以在没有任何停机时间的情况下重新启动)。考虑到它有额外的好处,因为 nginx 严重依赖数学上有效的数据结构来找到正确的server(基于正则表达式的服务器配置不是)。不在access_log 中使用变量也可以确保对access_log 的写入可以被缓冲,这可以大大提高服务器的有效吞吐量(尤其是在您登录非SSD HDD 时)。

基本上,nginx 中已经有很多bandaids 来支持access_log 内的变量(只需查看http://nginx.org/r/access_log 的限制列表,了解何时使用变量指定文件),我猜,它被认为是将更多此类创可贴也引入error_log 是不合适的(特别是考虑到生产场景中的error_log 不应该与access_log 一样大,因此,如有必要,您可以轻松编写外部工具分开)。

【讨论】:

顺便说一句,我什至忘记明确提及的一件事 - 如果您的 error_log 指定一个不存在的目录中的文件,您希望错误消息去哪里?!正是由于这个和许多其他原因,error_log 不(也不应该)支持变量。

以上是关于Nginx - 动态虚拟主机的 error_log的主要内容,如果未能解决你的问题,请参考以下文章

Nginx-2.nginx日志详解

简单nginx配置基于域名的虚拟主机

nginx日志及错误日志详解

Nginx 错误日志配置

Nginx 错误日志配置

Nginx: error_log