Подтвердить что ты не робот

Как определить глобальную переменную в файле nginx conf

Как определить глобальную переменную в файле конфига nginx, определите глобальный var в блоке http, и все серверы и местоположения ниже могут его использовать.

http{
      some confs
      ...
      //define a global var mabe like
      set APP_ROOT /home/admin
      // and it can be use in all servers and locations below, like
      server {
        root $APP_ROOT/test1
      }

      server {
        root $APP_ROOT/test2
      }
  }
4b9b3361

Ответ 1

Вы можете сделать небольшой трюк. Если это значение должно быть доступно из каждого блока server в одном блоке http, вы можете использовать директиву map. Как это будет работать?
Директива map позволяет вам использовать переменную где угодно в блоке http, значение которой будет вычисляться на каком-либо ключевом ключе. Всеобъемлющий пример:

http {

  ...

  /* 
     value for your $my_everywhere_used_variable will be calculated
     each time when you use it and it will be based on the value of $query_string.
  */
  map $query_string $my_everywhere_used_variable {

    /* 
       if the actual value of $query_string exactly match this below then 
       $my_everywhere_used_variable will have a value of 3
    */
    /x=1&y=2&opr=plus     3;

    /* 
       if the actual value of $query_string exactly match this below then
       $my_everywhere_used_variable will have a value of 4
    */
    /x=1&y=4&opr=multi    4;

  /*
    it needs to be said that $my_everywhere_used_variable value is calculated each
    time you use it. When you use it as pattern in a map directive (here we used the
    $query_string variable) some variable which will occasionally change 
    (for example $args) you can get more flexible values based on specific conditions
  */
  }

  // now in server you can use this variable as you want, for example:

  server {

    location / {
      rewrite .* /location_number/$my_everywhere_used_variable;
      /* 
         the value to set here as $my_everywhere_used_variable will be
         calculated from the map directive based on $query_string value
      */
    }
  }
}

Итак, что это значит для вас? Вы можете использовать директиву map для установки глобальной переменной для всех блоков server с помощью этого простого трюка. Вы можете использовать ключевое слово default, чтобы установить значение по умолчанию для вашего значения карты. Как в этом простом примере:

map $host $my_variable {
  default lalalala;
}

В этом примере мы вычисляем значение $my_variable по значению $host, но на самом деле не имеет значения, что $host, потому что мы всегда будем устанавливать lalalala как значение для нашей переменной по умолчанию и без другие варианты. Теперь везде в вашем коде, когда вы будете использовать $my_variable так же, как и все другие доступные переменные (например, созданные с помощью директивы set), вы получите значение lalalala

И почему это лучше, чем просто использовать директиву set? Поскольку директива set, поскольку doc говорит, что директива set nginx доступна только внутри блоков server, location and if, поэтому ее нельзя использовать для создания глобальной переменной для нескольких блоков server.

Документы о директиве map доступны здесь: директива карты