nginx - 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/ 不存在。
解决方案
这根本不被支持——你可以使用http://nginx.org/r/access_log中的变量,但不能使用http://nginx.org/r/error_log中的变量。
PS 请注意,一般来说,在access_log
or中使用用户输入变量是一个非常糟糕的主意error_log
,因为您引入了恶意用户通过在标头中使用随机字符串发出请求来耗尽文件系统上的 inodeHost
的可能性,这可能会导致为每个新请求创建一个新文件。这甚至可能是由于某人试图枚举您服务器上所有可能的用户而无意中(没有恶意)发生的。您的特定代码不一定会受此影响,因为任何 UNIX 软件通常不会自动创建目录,但它仍然不是最好的处理方式。
在 nginx 哲学中,最好为每个用户生成一个单独的http://nginx.org/r/server配置(因为 nginx 可以在没有任何停机时间的情况下重新启动)。考虑到它有额外的好处,因为 nginx 严重依赖数学上有效的数据结构来找到正确的server
(基于正则表达式的服务器配置不是)。不使用内部变量access_log
也可以确保写入access_log
可以缓冲,这可以大大提高服务器的有效吞吐量(特别是如果您登录到非 SSD 硬盘驱动器)。
基本上,nginx 中已经有很多创可贴来支持其中的变量access_log
(只需查看http://nginx.org/r/access_log上的限制列表,了解何时使用变量来指定文件),而且,我猜,它也被认为不适合引入更多这样的创可贴error_log
(特别是考虑到error_log
生产中的场景不应该像 一样大access_log
,因此,如有必要,您可以轻松编写外部工具将其拆分出来)。
推荐阅读
- flutter - Flutter setState() 只调用一次
- python - 如何使用python查找数据中满足条件的次数?
- android-studio - 导入 Buildbox 项目时 Android Studio 构建错误
- java - 将列表视图点击值传递给具有共享首选项的另一个活动
- javascript - 如何制作一个只为至少有 12 点的人发送邮件的邮件系统?
- node.js - 如何在 .goto(url) puppeteer 中使用多个链接?
- typescript - 如何更正错误 win 指的是一个值,但在这里被用作一个类型
- http - 发出 HEAD 请求是否仍需要 3 次握手?
- macos-high-sierra - 是否可以在 High Sierra (10.13.6) 上安装 Xcode 11?
- discord.js - 当我尝试运行不和谐机器人时,它说“未定义消息”