介绍
默认情况下,nginx会加载标准模块ngx_http_map_module(或称ngx_map),除非人为的在configure时添加--without-http_map_module选项。
ngx_http_map_module模块可以创建变量,这些变量的值与另外的变量值相关联。允许分类或者同时映射多个值到多个不同值并储存到一个变量中,map指令用来创建变量,但是仅在变量被读取的时候执行计算映射操作,对于处理没有引用变量的请求时,根本不会执行如何无用的计算,所以这个模块并没有性能上的缺失。
Nginx 的这个map指令就可以用于定义两个 Nginx 变量之间的映射关系,或者说是函数关系。
显然,ngx_map 模块认为变量间的映射计算足够昂贵,需要自动将因变量的计算结果缓存下来,这样在当前请求的处理过程中如果再次读取这个因变量,Nginx 就可以直接返回缓存住的结果,而不再调用该变量的“取处理程序”再行计算了。
类似 ngx_map 模块,标准的 ngx_geo 等模块也一样使用了变量值的缓存机制。map 指令只能在 http 块中使用。

很多 Nginx 新手都会担心如此“全局”范围的 map 设置会让访问所有虚拟主机的所有 location 接口的请求都执行一遍变量值的映射计算,然而事实并非如此。前面我们已经了解到 map 配置指令的工作原理是为用户变量注册 “取处理程序”,并且实际的映射计算是在“取处理程序”中完成的,而“取处理程序”只有在该用户变量被实际读取时才会执行(当然,因为缓存的存在,只在请求生命期中的第一次读取中才被执行),所以对于那些根本没有用到相关变量的请求来说,就根本不会执行任何的无用计算。

这种只在实际使用对象时才计算对象值的技术,在计算领域被称为“惰性求值”(lazy evaluation)。提供“惰性求值” 语义的编程语言并不多见,最经典的例子便是 Haskell. 与之相对的便是“主动求值” (eager evaluation)。我们有幸在 Nginx 中也看到了“惰性求值”的例子,但“主动求值”语义其实在 Nginx 里面更为常见,例如下面这行再普通不过的 set 语句:
set $b "$a,$a";
这里会在执行 set 规定的赋值操作时,“主动”地计算出变量 $b 的值,而不会将该求值计算延缓到变量 $b 实际被读取的时候。

模块指令说明
map
语法: map $var1 $var2 { ... }
默认值: —
配置段: http
map为一个变量设置的映射表。映射表由两列组成,依次是匹配模式和对应的值。
在 map 块里的参数指定了源变量值和结果值的对应关系。
匹配模式可以是一个简单的字符串或者正则表达式,使用正则表达式要用('~')。
一个正则表达式如果以 “~” 开头,表示这个正则表达式对大小写敏感。以 “~*”开头,表示这个正则表达式对大小写不敏感。

map $http_user_agent $agent {default "";~curl curl;~*apachebench" ab;
}

正则表达式里可以包含命名捕获和位置捕获,这些变量可以跟结果变量一起被其它指令使用。

map $uri $value {/ttlsa_com                   /index.php;~^/ttlsa_com/(?<suffix>.*)$  /boy/;~/fz(/.*)                    /index.php?;
}

注意:
不能在map块里面引用命名捕获或位置捕获变量。如~^/ttlsa_com/(.*)  /boy/$1; 这样会报错nginx: [emerg] unknown  variable。
如果源变量值包含特殊字符如‘~’,则要以‘\’来转义。

map $http_referer $value {Mozilla    111;\~Mozilla  222;
}

结果变量可以是一个字符串也可以是另外一个变量。

map $num $limit {1   $binary_remote_addr;0   "";
}

map指令有三个参数:
default: 指定如果没有匹配结果将使用的默认值。当没有设置default,将会用一个空的字符串作为默认的结果。
hostnames: 允许用前缀或者后缀掩码指定域名作为源变量值。这个参数必须写在值映射列表的最前面。
include file: 包含一个或多个含有映射值的文件。
volatile:暗示变量不能被缓存。

map $http_host $name {hostnames;default       0;example.com   1;*.example.com 1;example.org   2;*.example.org 2;.example.net  3;wap.*         4;
}map $http_user_agent $mobile {default       0;"~Opera Mini" 1;
}

如果匹配到多个特定的变量,如掩码和正则同时匹配,那么会按照下面的顺序进行选择:
1. 没有掩码的字符串
2. 最长的带前缀的字符串,例如: “*.example.com”
3. 最长的带后缀的字符串,例如:“mail.*”
4. 按顺序第一个先匹配的正则表达式 (在配置文件中体现的顺序)
5. 默认值

map_hash_bucket_size
语法: map_hash_bucket_size size;
默认值: map_hash_bucket_size 32|64|128;
配置段: http
指定一个映射表中的变量在哈希表中的最大值,这个值取决于处理器的缓存。

map_hash_max_size
语法: map_hash_max_size size;
默认值: map_hash_max_size 2048;
配置段: http
设置映射表对应的哈希表的最大值。

实例一

http {map $args $foo {default     0;debug       1;}server {listen 8087;server_name localhost;location /test {set $orig_foo $foo;set $args debug;echo "orginal foo: $orig_foo";echo "foo: $foo";}}
}

curl -v 'http://localhost:8087/test'

curl -v 'http://localhost:8087/test?debug'

实例二

http {map $http_user_agent $agent {~curl curl;~*chrome chrome;}server {listen       8085;server_name  localhost;location /hello {default_type text/plain;echo http_user_agent: $http_user_agent;echo agent: $agent;}}
}

curl -v 127.0.0.1:8085/hello

curl -v 127.0.0.1:8085/hello --user-agent Chrome

curl -v 127.0.0.1:8085/hello --user-agent Safari

实例三

http {map $uri $match {~^/hello/(.*) http://www.ttlsa.com/;}server {listen       8086;server_name  localhost;location /hello {default_type text/plain;echo uri: $uri;echo match: $match;echo capture: $1;echo new: $match$1;}}
}

curl -v http://127.0.0.1:8086/hello/aaa/bbb

参考文献
[1].http://www.ttlsa.com/nginx/using-nginx-map-method/
[2].http://www.ttlsa.com/nginx/nginx-var-4/

[3].http://nginx.org/en/docs/http/ngx_http_map_module.html

在CentOS 6.9 x86_64的nginx 1.12.2上开启标准模块ngx_http_map_module实录相关推荐

  1. 在CentOS 6.9 x86_64的nginx 1.12.2上开启标准模块ngx_http_auth_request_module实录

    ngx_http_auth_request_module是是nginx的一个验证模块,它允许您的nginx通过发送请求到后端服务器(一般是应用服务器,例如tomcat,或者php等)进行请求, 并且根 ...

  2. 在CentOS 6.9 x86_64的nginx 1.12.2上安装第三方模块set-misc-nginx-module实录

    set-misc-nginx-module模块是标准的HttpRewriteModule指令的扩展,提供更多的功能,如URI转义与非转义.JSON引述.Hexadecimal/MD5/SHA1/Bas ...

  3. 在CentOS 6.9 x86_64的nginx 1.12.2上开启ngx_http_empty_gif_module模块实录

    ngx_http_empty_gif_module是nginx自带的标准模块,它只返回一个保存在内存中的透明像素的GIF图片(速度当然比硬盘上读取的速度快很多),多用于传递统计参数,用在locatio ...

  4. 在CentOS 6.9 x86_64的nginx 1.12.2上开启ngx_http_geo_module模块实录

    ngx_http_geo_module模块,默认情况下,nginx会加载,除非人为的 --without-http_geo_module. 这个模块提供了一个非常好用的geo指令,可以用它来创建变量, ...

  5. 在CentOS 6.9 x86_64的nginx 1.12.2上开启echo-nginx-module模块实录

    echo-nginx-module是一个第三方模块,在nginx源码中没有,但是OpenResty中有,它为nginx.conf带来了echo,sleep,time等多个类似bash的强大命令. 目前 ...

  6. 在CentOS 6.9 x86_64的nginx 1.12.2上开启ngx_req_status模块实录

    ngx_req_status是一个第三方模块,它用来展示nginx请求状态信息,类似于apache的status,ats的stats_over_http和channel_stats,nginx自带的模 ...

  7. 在CentOS 6.8 x86_64的nginx 1.10.3上开启http2功能

    在原有基础上修改编译选项来开启http2 回见 http://blog.csdn.net/tao_627/article/details/60957521 在nginx源码目录下的configure选 ...

  8. 在CentOS 6.9 x86_64上开启nginx 1.12.2的stub_status模块(ngx_http_stub_status_module)监控

    Nginx中的stub_status模块主要用于查看Nginx的一些状态信息.  本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定: ./configure -- ...

  9. 在CentOS 6.8 x86_64上安装nginx 1.10.3

    本文档记录了完全使用最新源码来编译安装nginx最新版1.10.3,所有的依赖也是最新的,便于第三方nginx模块开发 假定使用root身份安装 目前最新的源码地址汇总 ftp://ftp.csx.c ...

最新文章

  1. GreenPlum查看表和数据库大小
  2. ios解锁动态图片_iOS 苹果开机启动的 滑动来解锁动画
  3. 国家开放大学2021春1026西方经济学(本)题目
  4. 多线程+链表模拟RR调度算法
  5. 前端性能优化--图片懒加载(lazyload image)
  6. MySQL数据库恢复-勒索病毒 PLEASE_READ_ME_VVV、delete、drop,没有binlog 数据库恢复工具 持续更新2020.5.27
  7. 入职阿里巴巴,成为年薪百万阿里P7高级架构师需要必备哪些技术栈,带你来观望一下
  8. 使用vue音频播放器(vue-aplayer)详解
  9. untiy virtual reality supported勾选
  10. 计算机专业专科可以进的国企,专科毕业生想进国企?这三大专业不要错过,成功率高达60%...
  11. 利用 MySQLi 将PHP连接到mysql数据库,并采用MySQLi以面向对象的方式对mysql进行增删查改(CRUD)
  12. Pulmonary--Detection3
  13. 【元胞自动机】基于matlab元胞自动机3D森林火灾模型【含Matlab源码 656期】
  14. IDEA同款数据库管理工具,提示太全了,用起来贼香!
  15. python 网格交易源码_网格交易法策略源码
  16. java练习——用循环输出等腰三角形
  17. 软件测试简历?面试题?企业面试官想要什么?我不再和offer失之交臂...
  18. 越狱后天气闪退 iPhone5天气闪退解决方法
  19. C语言有符号数和无符号数的判断方法
  20. Arduino Uno开发板+电机驱动扩展版CNC Shield V3.0硬件说明

热门文章

  1. linux的三个时间
  2. Visual Web Development 2005开发ASP.NET使用小技巧
  3. php的运算符实践输入年份,[php第四课]运算符
  4. vmd变分模态分解程序matlab论坛_博士兼职辅导员论坛分享会第三期
  5. java聊天程序步骤解析_java网络之基于UDP的聊天程序示例解析
  6. c语言判断字符串是不是回文_125. 验证回文串
  7. 梦幻西游三维版显示服务器未开启,梦幻西游三维版登录不进去怎么办-梦幻西游三维版登录不进去解决办法介绍_斗蟹游戏网...
  8. js 多维数组长度_C++申请与释放动态数组1(学习笔记:第6章 16)
  9. as3 android白屏,Android 8.0中一些坑以及对应的解决方法
  10. mysql substr 中文乱码_刚碰到的MySql乱码的问题