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变量,从而使用不同的端口处理