Nginx - 动态虚拟主机的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_log  /var/www/projects/dev/$user/$folder/error.log;
}

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

4
投票

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

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

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

基本上,nginx中已经有很多bandaids来支持access_log中的变量(只需查看http://nginx.org/r/access_log中的变量用于指定文件时的限制列表),并且,我想,引入更多这样的变量被认为是不合适的。对error_log也是如此(特别是考虑到生产场景中的error_log不应该像access_log那么大,所以,如果有必要,你可以轻松地编写外部工具来分解它)。