ngx_http_geo_module模块,默认情况下,nginx会加载,除非人为的 --without-http_geo_module。
这个模块提供了一个非常好用的geo指令,可以用它来创建变量,诞生其值依赖于客户端IP地址。

ngx_http_geo_module
模块官网地址
http://nginx.org/en/docs/http/ngx_http_geo_module.html

geo指令
语法: geo [$address] $variable { ... }
默认值: —
配置段: http
定义从指定的变量获取客户端的IP地址。默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其他变量获得。如

geo $remote_addr $geo {default 0;127.0.0.1 1;
}
geo $arg_ttlsa_com $geo {default 0;127.0.0.1 1;
}

如果该变量的值不能代表一个合法的IP地址,那么nginx将使用地址“255.255.255.255”。
nginx通过CIDR或者地址段来描述地址,支持下面几个参数:
delete:删除指定的网络
default:如果客户端地址不能匹配任意一个定义的地址,nginx将使用此值。 如果使用CIDR,可以用“0.0.0.0/0”代替default。
include:包含一个定义地址和值的文件,可以包含多个。
proxy:定义可信地址。 如果请求来自可信地址,nginx将使用其“X-Forwarded-For”头来获得地址。 相对于普通地址,可信地址是顺序检测的。
proxy_recursive:开启递归查找地址。 如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中的最后一个地址来代替原始客户端地址。如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中最后一个与所有可信地址都不匹配的地址来代替原始客户端地址。
ranges:使用以地址段的形式定义地址,这个参数必须放在首位。为了加速装载地址库,地址应按升序定义。

geo $country {default        ZZ;include        conf/geo.conf;delete         127.0.0.0/16;proxy          192.168.100.0/24;proxy          2001:0db8::/32;127.0.0.0/24   US;127.0.0.1/32   RU;10.1.0.0/16    RU;192.168.1.0/24 UK;
}
vim conf/geo.conf
10.2.0.0/16    RU;
192.168.2.0/24 RU;

地址段例子:

geo $country {ranges;default                   ZZ;127.0.0.0-127.0.0.0       US;127.0.0.1-127.0.0.1       RU;127.0.0.1-127.0.0.255     US;10.1.0.0-10.1.255.255     RU;192.168.1.0-192.168.1.255 UK;
}

遵循最精确匹配原则,即nginx使用能最精确匹配客户端地址的值。

适用实例

上面的例子几乎都是官网说明例子。下面举例说明便于理解该指令的用法。

完整的nginx.conf如下:
https://github.com/taoyunxing/github_test/blob/master/nginx.conf

1. 使用默认变量也就是$remote_addr

http {geo $ttlsa_com {default 0;127.0.0.1 1;}server {listen       8080;server_name  localhost;location /hello {default_type text/plain;echo $ttlsa_com;echo $arg_boy;}}
}

# curl 127.0.0.1:8081/hello?boy=默北
1

默北

2. 使用指定变量

http {geo $arg_boy $tao_com {default 0;127.0.0.1 1;8.8.8.8 2;}server {listen       8081;server_name  localhost;location /hello2 {default_type text/plain;echo $tao_com;echo $arg_boy;}}
}

curl 127.0.0.1:8081/hello2?boy=8.8.8.8
2
8.8.8.8

3. 匹配原则

http {geo $arg_boy $tao2_com {default 0;127.0.0.1/24 24;127.0.0.1/32 32;8.8.8.8 2;}server {listen       8081;server_name  localhost;location /hello3 {default_type text/plain;echo $tao2_com;echo $arg_boy;}}
}

curl 127.0.0.1:8081/hello3?boy=127.0.0.1
32
127.0.0.1
curl 127.0.0.1:8081/hello3?boy=127.0.0.12
24
127.0.0.12

4. range用法

http {include       mime.types;default_type  application/octet-stream;geo $arg_ip $address {ranges;default no;     # note that ranges precedes all other directives.0.0.0-126.255.255.255   abroad|abroad;127.0.0.0-223.255.254.255   beijing|cmcc;}server {listen       80;server_name  localhost;location /iptool {default_type text/plain;echo $address;}}
}

curl "http://127.0.0.1:8081/iptool?ip=144.144.144.144"
beijing|cmcc

geo $arg_ip $address 表示使用客户端请求的ip参数值当做ip,如http://127.0.0.1:8081/iptool?ip=144.144.144.144,意思是使用144.144.144.144当做ip过geo这个模块,查询属于127.0.0.0-223.255.254.255这个网段,因此就将这个网段对应的值beijing|cmcc赋值给$address。

注意:geo指令主要是根据IP来对变量进行赋值的。因此geo块下只能定义IP或网络段,否则会报错“nginx: [emerg] invalid network”。

5.自定义常量

    geo $dollar {default "$";}server {listen 8081;server_name localhost;location /test2 {echo "This is a dollar sign: $dollar";}} 

curl -v 'http://localhost:8081/test2'

参考文献
[1].http://nginx.org/en/docs/http/ngx_http_geo_module.html
[2].http://ju.outofmemory.cn/entry/96242
[3].http://www.ttlsa.com/nginx/using-nginx-geo-method/
[4].http://blog.sina.com.cn/s/blog_6d579ff40100wi7p.html

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

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

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

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

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

  3. 在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自带的模 ...

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

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

  5. 在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选项. n ...

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

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

  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. DP:Sumsets(POJ 2229)
  2. 计算机组成原理补充实验,计算机组成原理实验补充实验指导-实.doc
  3. labelImg 工具
  4. python 后台系统 源码_这是我见过最好的博客系统!附源码(前端、后台、APP、小程序都有)...
  5. 理工计算机系相关内容,弗吉尼亚理工大学计算机系
  6. Opencv之Vs编译
  7. HTML弹窗上下一步,JS实现从网页顶部掉下弹出层效果的方法
  8. Tableau数据可视化案例
  9. vim 的配置详解/键盘映射配置详解
  10. Yasm的作用及NASM详解
  11. 学习视频处理(一),了解HLS,流媒体,视频编码
  12. 空指针异常是什么意思
  13. 魔兽世界---熊猫人之谜
  14. 实用健指操:让你告别鼠标手、键盘手
  15. 杰理6905A更改蓝牙名字
  16. 超好用的java反编译工具(Java Decompiler)
  17. 计算机毕业设计Java电子病历系统(源码+系统+mysql数据库+lw文档)
  18. 七个人生工具 | SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则
  19. 我真感觉软件测试不难,自己技术也过得去,为什么我找不到工作呢?面了好多家,都没有收到offer。
  20. 操作系统没有声音,是因为这个原因,汗!

热门文章

  1. 小程序中点击input控件键盘弹出时placeholder文字上移
  2. 2022-2028年中国搪胶行业市场深度分析及投资前景分析报告
  3. 【洛谷P2024】食物链
  4. 【转】android错误 aapt.exe已停止工作的解决方法
  5. jsp 环境配置记录
  6. 可以发张图片做链接用吗
  7. python八大排序算法 间书_python八大排序算法
  8. shell5.0密钥_8.使用Xshell5密钥登录liunx
  9. ad域不去用frs_年轻人就是不喜欢喝茶?那就用高级时尚的茶包装去吸引
  10. 多个数字数组_三菱ST语言教学(2)——数组的使用