首页 > 在CentOS 6.9 x86_64的nginx 1.12.2上开启标准模块ngx_http_map_module实录

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

介绍

默认情况下,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/(?.*)$  /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



更多相关:

  • 文章目录1. Map的声明2. Map 元素访问带来的问题3. Map 元素的遍历4. 通过Map 实现 函数对象(C++)5. 通过Map实现一个简单Set功能...

  • 多线程编程 mind-Mapping保存有一下导图的xmind文件,可直接获取 互斥变量 互斥对象 ptrhead相关接口 条件变量 future异步访问类 async类 promise类 package_task类...

  • 我们在实际开发的过程中,可能需要某些类的成员变量并不是针对每一个对象的,而是针对每一个类而言的,比如在银行中有一个利率数据,我们希望的是,当一个利率改变的时候,所有的对象都能够看到这个改变的数据,并利用它,而不是每一个对象都有一个利率成员变量。这个时候就设计到了静态成员变量。 一. 内存那些事 静态成员变量是存放在静态...

  • volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触...

  •   引子     阅读以下代码,并尝试分析 代码解析 在主线程中,线程Id为1,为线程变量赋值 变量==d6ff开启一个新的task,此时线程Id为4,变量==d6ff,并调用Task1开启一个同步Task3,线程Id为1。变量==d6ff,修改值==f598此时第二步启动的Task1运行,线程Id为4,变量==d6ff,修改值=...

  • 操作系统基础    操作系统是协调、控制、管理计算机硬件资源与软件资源的控制程序 为什么要用操作系统?    1.操作系统可以把复杂的操作简化给用户使用或者应用程序  2.可以让应用程序对计算机硬件竞争变的有序  一套完整的计算机分为:操作系统、应用程序、计算机硬件 编程语言的分类   机械语言:使用二进制让计算机工作   优点:运行...

  • ng g s services/http  app.module.ts ... @NgModule({declarations: [...],imports: [...HttpClientModule,//这个很重紧要,没有就会报错],providers: [],bootstrap: [AppComponent] }) expor...

  • set-misc-nginx-module模块是标准的HttpRewriteModule指令的扩展,提供更多的功能,如URI转义与非转义、JSON引述、Hexadecimal/MD5/SHA1/Base32/Base64编码与解码、随机数等等。在后面的应用中,都将会接触使用到这个模块的。该模块是由章亦春先生开发的,他开发的其他模块应用...

  • 该源码包是MySQL-python-1.2.4b4.tar.gz 从2013-06-28以来一直没有更新,注意该网站可以区分访问的终端类型是Windows还是Linux之类的,从而返回的源码包格式不一样。 在CentOS上的安装方法是 http://www.cnblogs.com/jackluo/p/3559978.html...

  • ATS默认提供了对Referer头的http request的防盗链功能,主要应用于图片,对视频等会使用级别更高的防盗链功能,比如事先约定好key,采用md5或HMAC-Sha1算法加密等。 在remap.config中按如下格式设置: map_with_referer client-URL origin-server-URL re...

  • 测试大文件下载 curl -I "http://resource.tsk.erya100.com/TS/flv/TS180/5836/9.flv?t=1430796561727" 单条转发模式in per remap mode 在remap.config中添加一条 map http://resource.tsk.e...