nginx définit la variable dans l'emplacement

37

J'essaie d'optimiser mes configurations nginx afin qu'il soit possible de définir une variable et que tous les chemins d'emplacement se mettent à jour automatiquement. J'ai quatre lignes en question:

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;

Ce que je voudrais réaliser est de définir une variable (dans ce cas, "php") et de l'inclure dans la configuration.

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;

Cependant, il semblerait que nginx ignore les variables de cette configuration. Est-ce que je fais quelque chose de mal ou il n'est pas possible d'utiliser une variable dans les chemins d'emplacement?

Bogdan Kuštan
la source

Réponses:

58

Les variables ne peuvent être déclarées nulle part, ni être utilisées dans aucune directive.

Comme la documentation de la setdirective est:

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

La conséquence immédiate est que vous ne pouvez pas utiliser de variables personnalisées dans un httpbloc.

Mise à jour : après une discussion et des expériences avec AlexeyTen dans ce salon de discussion .

  • access_logpeut contenir des variables avec des restrictions. Parmi eux, l'absence de mise en mémoire tampon et le fait que la barre oblique ne doit pas être déclarée dans une variable .
  • error_log ne fonctionnera pas du tout avec des variables.
  • root directive can contient des variables.
  • server_namedirective n'autorise que la $hostnamevaleur stricte en tant que notation variable.
Xavier Lucas
la source
1
access_log/ error_logtravaille avec des variables, mais avec quelques limitations. server_namene peut pas contenir de variables.
Alexey Ten
@AlexeyTen Relisez ma réponse. Cela ne fonctionne pas avec les variables personnalisées . Le nom du serveur peut contenir une variable intégrée telle que $hostname. Mise à jour de la réponse pour clarifier ce comportement.
Xavier Lucas
5
Eh bien, $hostnameest la seule variable autorisée. github.com/nginx/nginx/blob/… En fait, c'est plutôt une constante magique, pas une vraie variable
Alexey Ten
1
Continuons cette discussion sur le chat .
Alexey Ten
3
C’est peut-être la réponse SF la mieux documentée à ce jour. Merci à vous deux / Cc @AlexeyTen
kaiser