Nginx的geo模块不仅可以有限速白名单的作用,还可以做全局负载均衡,可以要根据客户端ip访问到不同的server。比如,可以将电信的用户访问定向到电信服务器,网通的用户重 定向到网通服务器”,从而实现智能DNS的作用。前面介绍过nginx域名访问的白名单配置梳理,下面对nginx的geo模块使用做一梳理(参考Geo模块-Nginx中文文档

geo指令是通过ngx_http_geo_module模块提供的。默认情况下,nginx安装时是会自动加载这个模块,除非安装时人为的手动添加--without-http_geo_module。

ngx_http_geo_module模块可以用来创建变量,其值依赖于客户端IP地址。

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或者地址段来描述地址,支持下面几个参数:
1)delete:删除指定的网络
2)default:如果客户端地址不能匹配任意一个定义的地址,nginx将使用此值。 如果使用CIDR,可以用"0.0.0.0/0"代替default。
3)include: 包含一个定义地址和值的文件,可以包含多个。
4)proxy:定义可信地址。 如果请求来自可信地址,nginx将使用其“X-Forwarded-For”头来获得地址。 相对于普通地址,可信地址是顺序检测的。
5)proxy_recursive:开启递归查找地址。 如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用"X-Forwarded-For"中的最后一个地址来代替原始客户端地址。如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用"X-Forwarded-For"中最后一个与所有可信地址都不匹配的地址来代替原始客户端地址。
6)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 //编辑conf/geo.cong文件
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;
} geo指令主要是根据IP来对变量进行赋值的。因此geo块下只能定义IP或网络段,否则会报错。

====================nginx利用geo模块做限速白名单操作======================

nginx的限速白名单需要结合geo和map指令来实现,map指令使用ngx_http_map_module模块提供的。默认情况下,nginx安装时是会自动加载这个模块,除非安装时人为手动添加--without-http_map_module。
ngx_http_map_module模块可以创建变量,这些变量的值与另外的变量值相关联。允许分类或者同时映射多个值到多个不同值并储存到一个变量中,map指令用来创建变量,但是仅在变量被接受的时候执行视
图映射操作,对于处理没有引用变量的请求时,这个模块并没有性能上的缺失。 配置如下:
http {
geo $whiteiplist {
default 1;
127.0.0.1 0;
192.0.0.0/8 0;
103.20.102.0/24 0;
} map $whiteiplist $limit {
1 $binary_remote_addr;
0 "";
} limit_conn_zone $limit zone=limit:10m; server {
listen 80;
server_name test.huanqiu.com; location ^~ /download/ {
limit_conn limit 4;
limit_rate 200k;
alias /data/www.huanqiu.com/data/download/;
}
}
} ------------------------如下是一个nginx中geo限速白名单的配置实例--------------------------
[root@localhost ~]# cat /usr/local/nginx/conf/vhosts/wangshibo.conf
geo $whiteiplist {
default 1;
127.0.0.1 0;
192.168.0.0/16 0;
58.68.230.0/24 0;
} map $whiteiplist $limit {
1 $binary_remote_addr;
0 "";
} limit_conn_zone $limit zone=limit:10m; server {
listen 80;
server_name dev.wangshibo.com wangshibo.com *.wangshibo.com; access_log /usr/local/nginx/logs/8080-access.log main;
error_log /usr/local/nginx/logs/8080-error.log; location ~ / {
root /var/www/html/8080;
index index.html index.php index.htm;
} location ^~ /download/ {
limit_conn limit 4; //最大的并发连接数
limit_rate 200k; //每个连接的带宽
alias /data/wangshibo/download/;
}
} 配置要点解释:
1)geo指令定义一个白名单$whiteiplist, 默认值为1, 所有都受限制。 如果客户端IP与白名单列出的IP相匹配,则$whiteiplist值为0也就是不受限制。
2)map指令是将$whiteiplist值为1的,也就是受限制的IP,映射为客户端IP。将$whiteiplist值为0的,也就是白名单IP,映射为空的字符串。
3)limit_conn_zone和limit_req_zone指令对于键为空值的将会被忽略,从而实现对于列出来的IP不做限制。 测试方法
[root@localhost vhosts]# ab -c 100 -n 300 http://dev.wangshibo.com/download/docs/pdf/kevingarce.pdf

==============Nginx利用geo模块做负载均衡的操作记录===============

本次测试的机器ip信息如下:

server1: 113.110.86.28
server2: 113.110.86.25
server3: 188.84.155.239 客户端1:113.110.86.23
客户端2:113.110.86.51
客户端3:113.110.86.19 三台server机器上都部署了nginx环境,为了测试效果,特意配置了server1和server2的9090端口的首页,如下:
[root@localhost ~]# curl http://113.110.86.28:9090
this is server1:113.110.86.28 [root@localhost ~]# curl http://113.110.86.25:9090
this is server2:113.110.86.25 配置server3,在server3上实现利用geo模块做负载均衡的目的,server3的nginx配置如下:
[root@localhost vhosts]# cat test.conf
geo $geo {
default default;
113.110.86.19/32 uk;
113.110.86.51/32 us;
} #这里我是单网测试,所以掩码是32位;如果是vlan,可以是24位掩码,比如:
# 113.110.86.0/24 tw; upstream uk.server {
server 113.110.86.28:9090;
} upstream us.server {
server 113.110.86.25:9090;
} upstream default.server {
server 188.84.155.239:9090;
} server {
listen 80;
server_name 188.84.155.239;
index index.html index.htm;
root /var/www/html/80; location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://$geo.server$request_uri;
}
} server {
listen 9090;
server_name 188.84.155.239; location / {
root /var/www/html/9090;
index index.html index.htm;
}
} 访问server3的9090端口
[root@localhost vhosts]# curl http://188.84.155.239:9090
this is server3:188.84.155.239 ------------------------接下来就开始测试-------------------------
1)在客户端1上访问http://188.84.155.239,如下:
[root@localhost ~]# curl http://188.84.155.239
this is server3:188.84.155.239 因为客户端1的IP地址为113.110.86.23,按照上面server3中nginx的配置,它访问的很明显是server3的9090端口! 2)在客户端2上访问http://188.84.155.239,如下:
[root@localhost ~]# curl http://188.84.155.239
this is server2:113.110.86.25 按照server3的nginx配置,客户端2访问server3的80端口就会被负载到server2的9090端口上! 3)在客户端3上访问http://188.84.155.239,如下:
[root@jenkins-server ~]# curl http://188.84.155.239
this is server1:113.110.86.28 按照server3的nginx配置,客户端3访问server3的80端口就会被负载到server1的9090端口上! ------------------------------------------------------------
通过上面的测试,很明显能看到geo模块起到了负载均衡的作用。这样就可以把三台服务器分别放到不同的IDC机房。然后在数据同步就可以了。
这样做的好处就是省去了在DNS上做手脚,因为智能DNS有时候按照来访IP解析的时候会解析对方的DNS地址,把它匹配到一台服务器,如果对方是
网通用户,它用的电信DNS,会直接把它匹配到电信的服务器。而nginx的geo模块就是根据来访问IP来匹配服务器的,这样只要我们把各地区的IP段收集起来就可以了~~

Nginx通过geo模式实现限速白名单和全局负载均衡 - 运维笔记的更多相关文章

  1. (转)nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录

    nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录 原文:http://www.cnblogs.com/kevingrace/p/6165572.html Nginx的geo模块 ...

  2. nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录

    geo指令使用ngx_http_geo_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_geo_module.ngx_http_geo_modu ...

  3. nginx限速白名单配置

    在<nginx限制连接数ngx_http_limit_conn_module模块>和<nginx限制请求数ngx_http_limit_req_module模块>中会对所有的I ...

  4. Nginx+upstream针对后端服务器容错的运维笔记

    熟练掌握Nginx负载均衡的使用对运维人员来说是极其重要的!下面针对Nignx负载均衡upstream容错机制的使用做一梳理性说明: 一.nginx的upstream容错 1)nginx 判断节点失效 ...

  5. Linux系统运维笔记(四),CentOS 6.4安装Nginx

    Linux系统运维笔记(四),CentOS 6.4安装Nginx 1,安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool op ...

  6. Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。

    Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...

  7. Nginx之https配置 - 运维笔记 (http->https强转)

    一.Nginx安装(略)安装的时候需要注意加上 --with-http_ssl_module,因为http_ssl_module不属于Nginx的基本模块.Nginx安装方法: # ./configu ...

  8. Nginx详解(正向代理、反向代理、负载均衡原理)

    Nginx配置详解 nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行 ...

  9. Nginx突破高并发的性能优化 - 运维笔记

    在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...

随机推荐

  1. Application类-多窗口交互

    我们在派生自Application类中出来放置响应应用程序事件的代码外,还可以放置一些完成其他任务的代码. 在此之前要知道: 如何获取应用程序的Application对象: //App是一个继承自Ap ...

  2. 制作一个SSRS的ORACLE数据库报表,使用了时间类型的参数。

    需求:我们这个报表是以月为单位,呈现的数据为查询为当前月的第一天到最后一天.条件类似于:time_day > 20140601 and  time_day < 20140630 因为是让用 ...

  3. 视频监控GB28181测试参考

    说明: 1.  需要对前端摄像机和后端NVR.解码器.平台进行GB28181测试和开发的人员.本文档提供的一些测试细节,比如测试环境,SIP消息格式说明,SDP文本信息字段说明,GB28181测试注意 ...

  4. Java之路---Day17(数据结构)

    2019-11-04-23:03:13 目录: 1.常用的数据结构 2.栈 3.队列 4.数组 5.链表 6.红黑树 常用的数据结构: 包含:栈.队列.数组.链表和红黑树 栈: 栈:stack,又称堆 ...

  5. 【selenium】基于python语言,如何用select选择下拉框

    在项目测试中遇到了下拉框选择的控件,来总结下如何使用select选择下拉框: 下图是Select类的初始化描述,意思是,给定元素是得是select类型,不是就抛异常.接下来给了例子:要操作这个sele ...

  6. 用node发布一个包

    手把手教你用npm发布一个包 注:本文引用于简书 http://www.jianshu.com/p/36d3e0e00157   但是内容的话,还是一样的,也就是继续之前的工作,将那个autoRout ...

  7. 分析mybatis中 #{} 和${}的区别

    分析方法: 在 GenericTokenParser这个类的parse方法的这一行下个断点调试一下就明白了 builder.append(handler.handleToken(content)); ...

  8. kubernetes部署spring cloud注册中心 Eureka

    系统环境 java JDK 1.8 Docker 18.09.6 kubernetes 1.16 创建Eureka Server 1.Maven引入相应的jar 引入 SpringBoot 做基础框架 ...

  9. Linux服务管理之ntp

    NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 在计算机的世界里,时间非常地重要,例如对于火箭发射这种科研活动,对时间的统一性和准确性要 ...

  10. Linux高级运维 第八章 部署docker容器虚拟化平台

    8.1  Docker概述 实验环境: CENTOS7.4-63 64位 Dcoker概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到 ...