Nginx-动态虚拟主机的error_log

时间:2018-08-02 13:49:50

标签: 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_log  /var/www/projects/dev/$user/$folder/error.log;
}

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

1 个答案:

答案 0 :(得分:4)

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

P.S。请注意,通常来说,在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中已经有很多创可贴来支持access_log中的变量(仅查看http://nginx.org/r/access_log的限制列表,了解何时使用变量指定文件),而且,我猜,将更多这样的创可贴也引入error_log被认为是不合适的(特别是考虑到生产场景中的error_log不应与access_log一样大,因此,如有必要,您可以轻松编写外部工具以将其拆分。)