Nginx之动态虚拟主机的 error_log

Leo_wl 阅读:23 2024-10-24 08:47:37 评论:0

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

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/不存在。

请您参考如下方法:

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

附言请注意,一般来说,在 access_log 中使用用户输入变量是一个非常糟糕的主意。或 error_log ,因为您引入了恶意用户耗尽 inodes on your filesystem 的可能性。通过在 Host 中使用随机字符串发出请求 header ,这可能会导致为每个新请求创建一个新文件。这甚至可能是由于某人试图枚举您服务器上所有可能的用户而无意中(没有恶意)发生的。您的特定代码不一定会受到此影响,因为目录通常不会由任何 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 一样大,因此,如有必要,您可以轻松编写外部工具将其拆分)。


标签:nginx
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号