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?

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.

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


3
C’est peut-être la réponse SF la mieux documentée à ce jour. Merci à vous deux / Cc @AlexeyTen
kaiser
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.