Nginx是模块化的代码架构,其代码由核心代码与功能模块代码构成。Nginx的主要功能模块是HTTP功能模块,HTTP功能模块在HTTP核心功能的基础上为Nginx对HTTP请求的处理流程提供了扩展功能,这些扩展功能可以让用户很方便地应对访问控制、数据处理、代理缓存等各种复杂的场景应用,同时也让有开发能力的用户能够积极参与,不断增强Nginx的功能。由于功能模块比较多,为了便于对各功能模块进行介绍,此处按照模块的功能进行如下分类:
动态赋值:可根据HTTP请求的变化动态地进行变量赋值的功能模块。
访问控制:对外部访问请求做认证、数量限制等功能的模块。
数据处理:对用户的响应数据进行过滤或修改的功能模块。
协议客户端:可与其他应用协议服务连接的客户端模块。
协议服务:可运行相关应用协议服务、提供其他客户端访问的功能模块。
代理负载:对后端服务器实现代理负载的功能模块。
缓存功能:对响应数据内容实现缓存的功能模块。
日志管理:对请求的日志进行管理配置的功能模块。
监控管理:对Nginx自身状态进行监控的功能模块。
1.动态赋值功能模块
Nginx在核心模块及其他模块中都提供了内置变量,用户可以根据需要灵活调用。在Nginx的模块中除提供了rewrite指令以方便用户对变量进行静态赋值外,还提供了根据请求内容的变化为变量动态赋值的功能。
1.1 根据浏览器动态赋值
模块名称:ngx_http_browser_module。该模块的功能是根据客户端HTTP请求头中的属性字段User-Agent的值,按照用户的指令配置设置变量 $modern_browser和$ancient_browser的值。用户可以根据变量$modern_browser和$ancient_browser的值对客户端浏览器进行区分,并对HTTP请求进行不同的处理。
1.1.1 旧浏览器标识指令
名称 | 旧浏览器标识指令 |
指令 | ancient_browser |
作用域 | http、server、location |
默认值 | - |
指令说明 | 当客户端的HTTP请求头中的属性字段User-Agent的值中包含指令值中的字符串时,设置变量$ancient_browser的值为1 |
#配置样例如下:
http {
ancient_browser 'UCWEB';
}
#变量$ancient_browser的值默认为1
1.1.2 设置旧浏览器变量值指令
名称 | 设置旧浏览器变量值指令 |
指令 | ancient_browser_value |
作用域 | http、server、location |
默认值 | 1 |
指令说明 | 将$ancient_browser的值设置为指定的字符串 |
#配置样例如下:
http {
ancient_browser 'UCWEB';
ancient_browser_value oldweb;
server {
if ($ancient_browser) {
rewrite ^ /${ancient_browser}.html;
# 重定向到oldweb.html
}
}
}
1.1.3 新浏览器标识指令
名称 | 新浏览器标识指令 |
指令 | modem_browser |
作用域 | http、server、location |
默认值 | - |
指令说明 | 当客户端浏览器被nginx识别为内置的浏览器类型,且HTTP请求头中的属性字段User-Agent的值中的版本号等于或高于指令值的版本号时,设置变量$modem_browser的值为1 |
#配置样例如下:
http {
modern_browser msie 5.5;
}
内置浏览器类型有msie、gecko(由Mozilla基 金会维护,Mozilla及Netscape 6后续版本是基于Gecko开发的)、opera、safari、konqueror。
当指令值为unlisted时,Nginx在HTTP请求头中 的属性字段User-Agent的值为空或无法识别浏览器类型时,设置变量$modern_browser的值为1。
#配置样例如下:
http {
modern_browser msie 5.5;
modern_browser unlisted;
}
1.1.4 设置新浏览器变量值指令
名称 | 设置新浏览器变量值指令 |
指令 | modem_browser_value |
作用域 | http、server、location |
默认值 | 1 |
指令说明 | 将变量$modem_browser的值设置为指定的字符串 |
#配置样例如下:
http {
modern_browser msie 5.5;
modern_browser_value newweb;
server {
if ($modern_browser) {
rewrite ^ /${modern_browser}.html;
}
}
}
1.2 根据IP动态赋值
模块名称:ngx_http_geo_module。该模块的功能是从源变量获取IP地址,并根据设定的IP与对应值的列表对新变量进行赋值。该模块只 有一个geo指令,指令格式如下:
geo [源变量]新变量{}
geo指令的默认源变量是$remote_addr,新变量默认值为空。
geo指令的作用域只能是http。
geo指令的指令值参数如下:
参数名 | 参数描述 |
delete | 删除配置中已经存在的相同IP地址的设定 |
default | 如果从源变量获取的IP无法匹配任何一个IP或IP范围,通过该参数的参数值为新变量赋值 |
include | 引入一个包含IP与对应值的外部文件 |
proxy | 指定上层代理IP。当源变量的IP为该参数指定的IP时,nginx将从X-Fowarded-For头中获取IP |
proxy-recursive | 开启代理递归查询。当X-Fowarded-For头中有多个IP时,nginx会将X-Fowarded-For头中的最后一个IP定义为源变量的IP;启用该参数后,nginx会将X-Fowarded-For头中的最后一个IP与所有不属于proxy参数定义的IP定义为源变量的IP |
ranges | 使用地址段的形式定义的IP地址时,该参数必须放在最上面 |
#配置样例如下:
http{
geo $country {
proxy_recursive; # 启用代理递归查询
default ZZ; # 默认值为ZZ
include conf/geo.conf; # 引入外部列表文件
proxy 192.168.100.0/24; # 上层代理地址为192.168.100.0/24的IP
proxy 2001:0db8::/32; # 上层代理地址为2001:0db8::/32的IP
127.0.0.0/16 US; # 赋值US
127.0.0.1/32 RU; # 赋值RU
10.1.0.0/16 RU; # 赋值RU
192.168.1.0/24 UK; # 赋值UK
}
}
为了加速加载IP来设定变量表,IP地址应按升序填写。
10.2.0.0/16 RU;
192.168.2.0/24 RU;
以地址段形式定义的IP地址中ranges参数的配置样例如下:
http{
geo $country {
ranges; # 使用以地址段的形式定义的IP地址
default ZZ;
10.1.0.0-10.1.255.255 RU;
192.168.1.0-192.168.1.255 UK;
}
}
1.3 根据IP动态获取城市信息
模块名称:ngx_http_geoip_module
该模块的功能是将客户端的IP地址与MaxMind数据 库中的城市地址信息进行比对,然后将对应的城市地 址信息赋值给内置变量
1.3.1 国家信息数据库指令
名称 | 国家信息数据库指令 |
指令 | geoip_country |
作用域 | http |
默认值 | 1 |
指令说明 | 指定国家信息的MaxMind数据库文件路径 |
1.3.2 城市信息数据库指令
名称 | 城市信息数据库指令 |
指令 | geoip_city |
作用域 | http |
默认值 | 1 |
指令说明 | 指定城市信息的MaxMind数据库文件路径 | <