我运行 nginx。在其中一个网站的“服务器”部分中,我有以下内容:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
set $app_name myapp;
set $app_port 4000;
ssl_certificate /etc/letsencrypt/live/$app_name.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$app_name.com/privkey.pem;
access_log /var/log/nginx/$app_name.com.access.log;
error_log /var/log/nginx/$app_name.com.error.log;
#.............
至少其中一个自定义变量不会得到解析 - app_name
;例如,它将创建一个文件/var/log/nginx/$app_name.com.access.log
即,与$应用程序名称在里面。
因此,在配置文件的所有其他使用它的地方,它也不会得到解决。
在“error.log”中,我看到变量的值为空。
为什么不?如何修复它?
答案1
即使您以某种方式使其正常工作,您也不应该使用此方法:
文件路径可以包含变量(0.7.6+),但此类日志有一些限制:
- 工作进程使用其凭据的用户应有权在包含此类日志的目录中创建文件;
- 缓冲写入不起作用;
- 每次写入日志时都会打开和关闭文件。但是,由于经常使用的文件的描述符可以存储在缓存中,因此可以在 open_log_file_cache 指令的有效参数指定的时间内继续写入旧文件
- [..]
而且error_log
似乎根本不接受变量。
您最好使用模板/宏语言来生成配置(为此我更喜欢 m4,请参阅 参考资料man m4
)。
答案2
缓冲日志路径中不能有变量!
这好像是错误日志默认情况下是一个缓冲日志。
记录到循环内存缓冲区可以通过指定“内存:”前缀和缓冲区大小来配置,并且通常用于调试(1.7.11)。
因此error_log
不适用于路径中定义的变量,如下所示:
error_log /var/log/nginx/$app_name.com.error.log;
这对于定义了或参数的access_log
指令同样有效。buffer
gzip
一旦你设置
access_log /var/log/nginx/$app_name.com.access.log buffer flush=5m;
它是一个缓冲区日志,您的变量名称将无法解析。这会导致 Nginx 的错误。
但如果你设置
access_log /var/log/nginx/$app_name.com.access.log;
显然它不是缓冲区日志,并且您的变量名称需要解析。这就是您的自定义变量名称之一得到解析的原因。