Nginx 如何自定义变量? (2)

geo $country {
default ZZ;
#include conf/geo.conf;
#proxy 172.18.144.211;
127.0.0.0/24 US;
127.0.0.1/32 RU;
10.1.0.0/16 RU;
192.168.1.0/24 UK;
}

问题:以下命令执行时,变量 country 的值各为多少?(proxy 实际上为客户端地址,这里设置为本机的局域网地址即可,我这里是 172.18.144.211)

curl -H 'X-Forwarded-For: 10.1.0.0,127.0.0.2' geo.ziyang.com
curl -H 'X-Forwarded-For: 10.1.0.0,127.0.0.1' geo.ziyang.com
curl -H 'X-Forwarded-For: 10.1.0.0,127.0.0.1,1.2.3.4' geo.ziyang.com

结果如下: ```shell ➜ test_nginx curl -H 'X-Forwarded-For: 10.1.0.0,127.0.0.2' geo.ziyang.com US ➜ test_nginx curl -H 'X-Forwarded-For: 10.1.0.0,127.0.0.1' geo.ziyang.com RU ➜ test_nginx curl -H 'X-Forwarded-For: 10.1.0.0,127.0.0.1,1.2.3.4' geo.ziyang.com ZZ

这里可以看出来,匹配规则实际上是遵循最长匹配的规则的。

geoip 模块

geoip 模块可以根据 IP 地址生成对应的地址变量,用法与前面的也都类似,Nginx 是基于 MaxMind 数据库来生成对应的地址的。

功能:根据 IP 地址创建新变量

模块:ngx_http_geoip_module,默认未编译进 Nginx,通过 --with-http_geoip_module 禁用

使用这个模块是需要安装 MaxMind 库的,安装步骤如下:

安装 MaxMind 里 geoip 的 C 开发库(https://dev.maxmind.com/geoip/legacy/downloadable/ )

编译 Nginx 时带上 --with-http_geoip_module 参数

下载 MaxMind 中的二进制地址库,这个地址库是需要在指令中指定对应的地址的

使用 geoip_country 或者 geoip_city 指令配置好 nginx.conf

运行或者升级 Nginx

geoip_country 指令提供的变量

指令

Syntax: geoip_country file; # 指定国家类的地址文件 Default: — Context: http Syntax: geoip_proxy address | CIDR; Default: — Context: http

变量

$geoip_country_code:两个字母的国家代码,比如 CN 或者 US

$geoip_country_code3:三个字母的国家代码,比如 CHN 或者 USA

$geoip_country_name:国家名称,例如 “China”, “United States”

geoip_city 指令提供的变量

指令

Syntax: geoip_city file; Default: — Context: http

变量

$geoip_latitude:纬度

$geoip_longitude:经度

$geoip_city_continent_code:位于全球哪个洲,例如 EU 或 AS

与 $geoip_country 指令生成的变量重叠

$geoip_country_code:两个字母的国家代码,比如 CN 或者 US

$geoip_country_code3:三个字母的国家代码,比如 CHN 或者 USA

$geoip_country_name:国家名称,例如 “China”, “United States”

$geoip_region:洲或者省的编码,例如 02

$geoip_region_name:洲或者省的名称,例如 Zhejiang 或者 Saint Petersburg

$geoip_city:城市名

$geoip_postal_code:邮编号

$geoip_area_code:仅美国使用的邮编号,例如 408

$geoip_dma_code:仅美国使用的 DMA 编号,例如 807

keepalive 模块

前面说的都是 Nginx 的变量相关的内容,其实 Nginx 还有一个很具有特色的模块,那就是 keepalive 模块,由于内容不是很多,所以我就直接写到这篇文章里面了,单写一篇显得内容不够哈。

这里指的是 HTTP 的 keepalive,TCP 也有 keepalive,后面会说。

而且是对客户端的 keepalive,不是对上游服务器的。

功能:多个 HTTP 请求通过复用 TCP 连接,可以实现以下功能:

减少握手次数

通过减少并发连接数减少了服务器资源消耗

降低 TCP 拥塞控制的影响,保证滑动窗口维持在一个最优的大小

Connection 头部

close:表示请求处理完就关闭连接

keepalive:表示复用连接处理下一条请求

Keepalive 头部:timeout=n,单位是秒,表示连接至少保持 n 秒

指令

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyydxf.html