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 игнорирует переменные в этой конфигурации. Я делаю что-то неправильно или невозможно использовать переменные в путях расположения?

Богдан Куштан
источник

Ответы:

58

Переменные нигде не могут быть ни объявлены, ни использованы в каких-либо директивах.

В качестве документации setуказана директива:

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

Непосредственным следствием является то, что вы не можете использовать пользовательские переменные в httpблоке.

Update : after a discussion and experiments with AlexeyTen in this chatroom.

  • access_logможет содержать переменные с ограничениями. Среди них отсутствие буферизации и тот факт, что начальная косая черта не должна быть объявлена ​​в переменной .
  • error_log не будет работать с переменными вообще.
  • root Директива может содержать переменные.
  • server_nameдиректива допускает только строгое $hostnameзначение как переменная запись.
Ксавье Лукас
источник
1
access_log/ error_logработать с переменными, но с некоторыми ограничениями. server_nameне может содержать переменные.
Алексей Тен
@AlexeyTen Перечитайте мой ответ. Это не работает с пользовательскими переменными. Имя сервера может содержать встроенную переменную, как $hostname. Обновлен ответ, чтобы прояснить это поведение.
Ксавье Лукас
5
Ну, $hostnameэто единственная допустимая переменная. github.com/nginx/nginx/blob/… На самом деле, это больше похоже на магическую константу, а не на реальную переменную
Алексей Тен
1
Давайте продолжим эту дискуссию в чате .
Алексей Тен
3
Это может быть наиболее исследованным SF ответ когда - либо. Спасибо вам обоим / Cc @AlexeyTen
kaiser