Nginx map使用

map 指令是由 ngx_http_map_module 模块提供的,默认情况下安装 nginx 都会安装该模块。

map 的主要作用是创建自定义变量,通过使用 nginx 的内置变量,去匹配某些特定规则,如果匹配成功则设置某个值给自定义变量。 而这个自定义变量又可以作于他用

下面举几个例子:

  • 场景一: 匹配请求 url 的参数,如果参数是 debug 则设置 $foo = 1 ,默认设置 $foo = 0
map $args $foo {
    default 0;
    debug   1;
}

解释:$args 是nginx内置变量,就是获取的请求 url 的参数。 如果 $args 匹配到 debug 那么 $foo 的值会被设为 1 ,如果 $args 一个都匹配不到 $foo 就是default 定义的值,在这里就是 0

语法:

map $var1 $var2 {...}

map指令的三个参数:

  • default : 指定源变量匹配不到任何表达式时将使用的默认值。当没有设置 default,将会用一个空的字符串作为默认的结果
  • hostnames : 允许用前缀或者后缀掩码指定域名作为源变量值。这个参数必须写在值映射列表的最前面
  • include : 包含一个或多个含有映射值的文件

在 Nginx 配置文件中的作用段: http{} ,注意 map 不能写在 server{} 否则会报错

  • map 的 $var1 为源变量,通常可以是 nginx 的内置变量,$var2 是自定义变量。 $var2 的值取决于 $var1 在对应表达式的匹配情况。 如果一个都匹配不到则 $var2 就是 default 对应的值
  • 一个正则表达式如果以 “~” 开头,表示这个正则表达式对大小写敏感。以 “~*”开头,表示这个正则表达式对大小写不敏感
map $http_user_agent $agent {
    default "";
    ~curl curl;
    ~*apachebench" ab;
}

  • 场景二:接下来看看实际用法,之前在给项目做php7升级,开发环境装了php5和php7,按项目来逐步升级php7,如何让某些项目使用php5,某些项目使用php7呢?
    upstream php56 {
        server 127.0.0.1:9000;
    }

    upstream php72 {
        server 127.0.0.1:9002;
    }

    map $uri $php_backend {
        default php56;
        ~^/project1/ php72;
        ~^/project2/ php72;
        ~^/project3/ php72;
        ~^/project4/ php72;
        ....
    }

    ....

    location ~ .*\.(php|php5)?$ {
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_pass $php_backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param REQUEST_URI $new_request_uri;
        fastcgi_intercept_errors on;
    }

用以上的方式,根据链接特征设置了php_backend变量,从而使用不同的端口处理