50

nginx conf ファイルでグローバル変数を定義する方法、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
      }
  }
4

1 に答える 1

109

ちょっとしたトリックができます。この値がserver1 つのブロック内のすべてのブロックからアクセスできる必要がある場合は、ディレクティブhttpを使用できます。mapこれはどのように機能しますか? ディレクティブを使用すると、ブロック内の任意の場所で変数を使用できます
。その値は、マップ キーで計算されます。分かりやすい例:maphttp

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's 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が、実際には、デフォルトで変数の値として常にlalalala$hostを設定し、他のオプションを使用しないため、それが何であるかは問題ではありません。他のすべての使用可能な変数 (たとえば、ディレクティブで作成された変数) と同じ方法で使用すると、コードのどこでもlalalalaの値を取得できます。$host$my_variableset

setそして、なぜこれは単にディレクティブを使用するよりも優れているのでしょうか? setdoc が言うように、ディレクティブブロック内でしかアクセスできないため、複数のブロックserver, location and ifのグローバル変数を作成するために使用することはできません。server

ディレクティブに関するドキュメントmapは、こちらから入手できます: map ディレクティブ

于 2013-01-21T21:12:13.133 に答える