Nginx-Set-Variable in Position

37

Ich versuche, meine Nginx-Konfigurationen zu optimieren, damit eine Variable festgelegt werden kann und alle Pfadangaben automatisch aktualisiert werden. Ich habe vier Zeilen in Frage:

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;

Was ich erreichen möchte, ist, eine Variable (in diesem Fall 'php') zu setzen und sie in config aufzunehmen.

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;

Es scheint jedoch so, dass Nginx Variablen in dieser Konfiguration ignoriert. Mache ich etwas falsch oder ist es nicht möglich, Variablen in Standortpfaden zu verwenden?

Bogdan Kuštan
quelle

Antworten:

58

Variablen können nirgendwo deklariert oder in Direktiven verwendet werden.

Da die Dokumentation der setRichtlinie ist:

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

Die unmittelbare Folge ist, dass Sie in einem httpBlock keine benutzerdefinierten Variablen verwenden können .

Update : Nach einer Diskussion und Experimenten mit AlexeyTen in diesem Chatroom .

  • access_logKann Variablen mit Einschränkungen enthalten. Darunter die fehlende Pufferung und die Tatsache, dass der führende Schrägstrich nicht in einer Variablen deklariert werden darf .
  • error_log funktioniert überhaupt nicht mit Variablen.
  • root Direktive kann Variablen enthalten.
  • server_nameDirektive erlaubt nur strenge $hostnameWerte als variable Notation.
Xavier Lucas
quelle
1
access_logIch error_logarbeite mit Variablen, aber mit einigen Einschränkungen. server_namedarf keine Variablen enthalten.
Alexey Ten
@AlexeyTen Lies meine Antwort noch einmal. Es funktioniert nicht mit benutzerdefinierten Variablen. Servername kann eingebaute Variable wie enthalten $hostname. Die Antwort wurde aktualisiert, um dieses Verhalten zu verdeutlichen.
Xavier Lucas
5
Naja, $hostnameist die einzig erlaubte Variable. github.com/nginx/nginx/blob/… Eigentlich ist es eher eine magische Konstante, keine echte Variable
Alexey Ten
1
Lassen Sie uns diese Diskussion im Chat fortsetzen .
Alexey Ten
3
Dies ist wahrscheinlich die am besten recherchierte SF-Antwort aller Zeiten. Dank an Sie beide / Cc @AlexeyTen
kaiser