How to define a global variable in nginx conf file

Nginx

Nginx Problem Overview


How to define a global variable in nginx conf file, define a global var in http block,and all servers and locations below can use it.

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
      }
  }

Nginx Solutions


Solution 1 - Nginx

You can do a little trick. If this value must be accessible from every server block in one http block you can use map directive. How will this work?
The map directive allows you to use a variable anywhere in an http block which value will be calculated on some map key. All-telling example:

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
      */
    }
  }
}

So now, what does this mean for you? You can use the map directive to set a global variable for all server blocks with this simple trick. You can use the default keyword to set a default value for your map value. As in this simple example:

map $host $my_variable {
  default lalalala;
}

In this example we calculate the value of $my_variable on the $host value, but in fact it doesn't matter what $host is because we will always set lalalala as the value for our variable by default and without other options. Now everywhere in your code when you will use $my_variable in the same way as all other available variables (for example created with set directive) you will get value of lalalala

And why is this better than simply using the set directive? Because the set directive, as doc says http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#set">nginx set directive is only accessible inside server, location and if blocks, so it cannot be used to create global variable for a number of server blocks.

Docs about map directive are available here: http://nginx.org/en/docs/http/ngx_http_map_module.html#map">map directive

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsinoryView Question on Stackoverflow
Solution 1 - NginxMichał KupisińskiView Answer on Stackoverflow