尧图精选

Nginx应用与运维——Nginx HTTP模块详解(动态赋值功能模块)

🕒 发布时间:2026/10/2 17:25:46 📁 来源:尧图网络
Nginx HTTP模块详解1、动态赋值功能模块1.1、根据浏览器动态赋值1.1.1、旧浏览器标识指令——ancient_browser1.1.2、设置旧浏览器变量值指令——ancient_browser_value1.1.3、新浏览器标识指令——modern_browser1.1.4、设置新浏览器变量值指令——modern_browser_value1.2、根据IP动态赋值1.3、根据IP动态获取城市信息1.4、比例分配赋值1.5、变量映射赋值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{ancient_browserUCWEB;}变量$ancient_browser的值默认为1。1.1.2、设置旧浏览器变量值指令——ancient_browser_value配置样例如下http{ancient_browserUCWEB;ancient_browser_value oldweb;server{if($ancient_browser){rewrite ^ /${ancient_browser}.html;# 重定向到oldweb.html}}}1.1.3、新浏览器标识指令——modern_browser配置样例如下http{modern_browser msie5.5;}内置浏览器类型有msie、gecko由Mozilla基金会维护Mozilla及Netscape 6后续版本是基于Gecko开发的​、opera、safari、konqueror。当指令值为unlisted时Nginx在HTTP请求头中的属性字段User-Agent的值为空或无法识别浏览器类型时设置变量$modern_browser的值为1。配置样例如下http{modern_browser msie5.5;modern_browser unlisted;}1.1.4、设置新浏览器变量值指令——modern_browser_value配置样例如下http{modern_browser msie5.5;modern_browser_value newweb;server{if($modern_browser){rewrite ^ /${modern_browser}.html;}}}配置样例如下ancient_browserUCWEB;# 必须使用单引号ancient_browser_value oldweb;# 设置$ancient_browser的值为oldwebmodern_browser_value newweb;# 设置$ancient_browser的值为newwebmodern_browser unlisted;# 设置$modern_browser的值为1, $ancient_browser的值为0root /opt/nginx-web;server{listen8080;if($ancient_browser){rewrite ^ /${ancient_browser}.html;# 重定向到oldweb.html}if($modern_browser){rewrite ^ /${modern_browser}.html;# 重定向到newweb.html}}1.2、根据IP动态赋值模块名称ngx_http_geo_module该模块的功能是从源变量获取IP地址并根据设定的IP与对应值的列表对新变量进行赋值。该模块只有一个geo指令指令格式如下geo 源变量新变量{}geo指令的默认源变量是$remote_addr新变量默认值为空。geo指令的作用域只能是http。该指令的指令值参数如表所示。配置样例如下http{geo$country{proxy_recursive;# 启用代理递归查询default ZZ;# 默认值为ZZinclude conf/geo.conf;# 引入外部列表文件proxy192.168.100.0/24;# 上层代理地址为192.168.100.0/24的IPproxy2001:0db8::/32;# 上层代理地址为2001:0db8::/32的IP127.0.0.0/16 US;# 赋值US127.0.0.1/32 RU;# 赋值RU10.1.0.0/16 RU;# 赋值RU192.168.1.0/24 UK;# 赋值UK}}为了加速加载IP来设定变量表IP地址应按升序填写。外部文件geo.conf的内容格式如下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;}}自定义源变量配置样例如下geo$arg_ip$address{# 设置请求参数IP为源变量default CN;127.0.0.0/24 US;127.0.0.10/32 RU;10.1.0.0/16 RU;delete127.0.0.10/32;# 删除127.0.0.10/32的设定}server{listen8081;server_name localhost;charset utf-8;root /opt/nginx-web;default_type text/xml;location /{rewrite ^ /${address}.htmlbreak;# 重定向到$address.html}}1.3、根据IP动态获取城市信息模块名称ngx_http_geoip_module该模块的功能是将客户端的IP地址与MaxMind数据库中的城市地址信息进行比对然后将对应的城市地址信息赋值给内置变量。该模块的配置指令如表所示。国家信息数据库指令城市信息数据库指令机构信息数据库指令上层代理IP指令代理递归查询IP指令geo内置变量如表所示。配置样例如下geoip_country /usr/share/GeoIP/GeoIP.dat;geoip_city /usr/share/GeoIP/GeoIPCity.dat;geoip_org /usr/share/GeoIP/GeoIPASNum.dat;geoip_proxy192.168.2.145;geoip_proxy_recursive on;server{listen8081;server_name localhost;charset utf-8;root /opt/nginx-web;default_type text/xml;location /{if($geoip_country_code){rewrite ^ /$geoip_country_code/break;# 重定向到$geoip_country_cod目录}}}1.4、比例分配赋值模块名称ngx_http_split_clients_module该模块会按照配置指令将一个0232之间的数值根据设定的比例分割为多个数值范围每个数值范围会被设定一个对应的给定值。用户每次请求时指定的字符串会被计算出一个数值该模块会将该数值所在范围对应的给定值赋值给配置中定义的变量。该功能常用来按照用户的来源IP进行访问流量分流。该指令语法格式如下split_clients 字符串 新变量{}配置样例如下split_clients${remote_addr}AAA$source{# ${remote_addr}AAA会被计算出一个数值0.5% .one;# 数值在021474835之间$source被赋值.one80.0% .two;# 数值在214748363435973836之间$source被赋值.two*;# 数值在34359738374294967295, $source被赋值}server{location /{index index${source}.html;}}该指令会将一个2的32次幂计算的值数值范围为04294967295按照指令域中的比例进行分割。客户端每次请求时会将指定字符串使用MurmurHash2算法计算出一个0232(04 294 967 295)之间的数值该模块会将该数值所在范围对应的给定值赋值给配置中定义的变量。指定的字符串可以是Nginx内置变量。1.5、变量映射赋值模块名称ngx_http_map_module该模块的功能是在客户端每次请求时Nginx按照map指令域中源变量的当前值把设定的对应值赋值给新变量。该指令语法格式如下map 源变量 新变量{}map指令值参数如表所示。配置样例如下map$remote_addr$name{hostnames;default0;example.com1;*.example.com1;# 主机名前缀wap.*4;# 主机名后缀include hostmap.conf;}map指令只能编辑在http指令域中。map指令域中指定了源变量为不同值时与新变量值的对应关系。map指令域中源变量的值可以是字符串或正则表达式的匹配。map指令域中对源变量的值进行正则表达式匹配时以“”开头表示对源变量值的匹配区分大小写以“*”开头表示对源变量值的匹配不区分大小写。map$http_user_agent$mobile{Opera Mini1;*UCWEB2;}map指令域中对源变量的值进行正则表达式匹配时可以对源变量值进行正则捕获。map$uri$new_uri{^/user/(.*)ucenter;# 若URI为/user/login时,$new_uri被赋值为ucenter}server{listen8080;location /user{default_type text/plain;rewrite ^ /$new_uri/$1;# rewrite到/ucenter/login}location /ucenter{index index.html;}}若源变量值中包含特殊字符串“”​可以用“”进行转义。map$http_referer$flag{Mozilla111;\Mozilla222;}新变量的值可以是字符串也可以是另一个变量。map$http_referer$value{Mozillachrom;\safity$http_user_agent;}map指令域中当源变量值存在相同匹配项时匹配顺序如下1)完全匹配的字符串。2)有主机前缀的最长字符串。3)有主机后缀的最长字符串。4)在指令域中按自上而下顺序最先匹配到的正则表达式。5)default参数给定的默认值。map哈希表大小指令map哈希桶大小指令配置样例如下map$remote_addr$dir{default www;# 设置默认目录为wwwinclude conf.d/remoteip.list;# 以外部文件形式编写IP及对应新变量赋值列表}server{listen8080;root /opt/nginx-web/$dir;index index.html;}remoteip.list文件内容192.168.2.145 blue;# 源IP为192.168.2.145时map的新变量值为blue192.168.2.100 green;# 源IP为192.168.2.100时map的新变量值为green
上一篇/下一篇内容由系统自动关联 返回资讯列表 →