Nginx在位置设置变量


37

我正在尝试优化我的nginx配置,因此可以设置一个变量,并且所有位置路径都会自动更新。我有四行有疑问:

server_name php.domain.com;
root /srv/web/vhosts/php/web;
error_log /srv/web/vhosts/php/logs/error.log;
access_log /srv/web/vhosts/php/logs/access.log;

我想要实现的是设置一个变量(在本例中为“ php”)并将其包含在config中。

set $variable "php";
server_name $variable.domain.com;
root /srv/web/vhosts/$variable/web;
error_log /srv/web/vhosts/$variable/logs/error.log;
access_log /srv/web/vhosts/$variable/logs/access.log;

但是,它表明nginx会忽略此配置中的变量。我是在做错什么,还是无法在位置路径中使用变量?

Answers:


58

变量不能在任何地方声明,也不能在任何指令中使用。

由于set指令的文档是:

Syntax:   set $variable value;
Default:  —
Context:  server, location, if

直接后果是您不能在http块中使用自定义变量。

更新:在这个聊天室AlexeyTen进行讨论和实验之后。

  • access_log可以包含有限制的变量。其中,缺少缓冲以及不能在变量中声明前导斜杠事实
  • error_log 根本不会使用变量。
  • root 指令可以包含变量。
  • server_name指令仅允许将严格$hostname值作为类似变量的符号表示。

1
access_log/ error_log使用变量,但有一些限制。server_name不能包含变量。
Alexey 2014年

@AlexeyTen重新阅读我的答案。它不适用于自定义变量。服务器名称可以包含内置变量,如$hostname。更新了答案以阐明该行为。
Xavier Lucas 2014年

5
好吧,$hostname是唯一允许的变量。github.com/nginx/nginx/blob/…实际上,它更像是一个魔术常数,而不是真正的变量
Alexey


3
这也许有史以来研究最好的SF答案。感谢你们俩/ Cc @AlexeyTen
kaiser
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.