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

原文:http://www.cnblogs.com/kevingrace/p/6165572.html

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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模块做限速白名单操作------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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;
 "";
 }
   
 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;
 "";
 }
   
 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模块做负载均衡的操作记录------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
本次测试的机器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模块做限速白名单以及geo实现全局负载均衡的操作记录的更多相关文章

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

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

  2. Nginx通过geo模式实现限速白名单和全局负载均衡 - 运维笔记

    Nginx的geo模块不仅可以有限速白名单的作用,还可以做全局负载均衡,可以要根据客户端ip访问到不同的server.比如,可以将电信的用户访问定向到电信服务器,网通的用户重 定向到网通服务器”,从而 ...

  3. nginx限速白名单配置

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

  4. nginx利用limit模块设置IP并发防CC攻击

    nginx利用limit模块设置IP并发防CC攻击 分类: 系统2013-01-21 09:02 759人阅读 评论(0) 收藏 举报 来源:http://blog.xencdn.net/nginx- ...

  5. Nginx 全模块安装及匹配方式、反向代理和负载均衡配置

    一.安装 OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超 ...

  6. Nginx的继续深入(日志轮询切割,重写,负载均衡等)

    Nginx的访问日志轮询切割 通常什么情况Nginx会把所有的访问日志生成到一个制定的访问日志文件access.log里面,但时间一长,日志个头很大不利于日志的分析和处理. 有必要对Nginx日志进行 ...

  7. Angular白名单&&Angular拦截器 全局通用

    //angular 白名单全局通用 app.config([ '$compileProvider', function ($compileProvider) { $compileProvider.aH ...

  8. Nginx(二):Nginx的四层(L4)和七层(L7)负载均衡

    OSI七层模型 和 TCP/IP四层模型 四层负载均衡( L4 Load Balancing ) 四层负载均衡,主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内 ...

  9. 利用Py-Socket模块做的一个不登陆windows服务器自动实现替换或者调用自动拨号功能

    xu言: 最近,有个朋友让我帮忙“搞点事情”,然后正好在学习socket模块,这个模块666啊,基本上可以实现远程服务器cmd shell的大部分功能.好,话不多说,直接上码~ 由于很多电信运营商都会 ...

随机推荐

  1. swoole的http服务

    PHP实现基于Swoole简单的HTTP服务器 引用Swoole官方定义: PHP语言的异步.并行.高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户 ...

  2. BZOJ - 4518: 征途(斜率优化,求N数划分为M区间的最小方差)

    注意初始化...等等补 #include<bits/stdc++.h> #define ll long long using namespace std; ; int q[maxn],he ...

  3. HDU4080Stammering Aliens(后缀数组+二分)

    However, all efforts to decode their messages have failed so far because, as luck would have it, the ...

  4. Dubbo配置设计

    配置分类 配置格式 配置加载 可编程配置 配置缺省值 配置一致性 配置覆盖 配置继承 配置向后兼容 配置分类 首先,配置的用途是有多种的,大致可以分为: 环境配置,比如:连接数,超时等配置. 描述配置 ...

  5. mac下配置xampp的vhost

    1 先确定在httpd.conf文件(/Applications/XAMPP/xamppfiles/etc/httpd.conf)中,引入了vhosts.conf文件. 1.1 在httpd.conf ...

  6. C#支持从自定义日期时间格式到DateTime类型

            /// <summary>         ///         /// </summary>         /// <param name=&quo ...

  7. Oracle字段增删改方法总结

    一.修改字段的语法:alter table tablename modify (字段名 类型 [default value][null/not null],….);有一个表名为tb,字段段名为name ...

  8. Day06:迭代器,生成器,生成表达式,面向过程编程,包及常用模块

    今日内容:1.迭代器(****)2.生成器(***)3.生成器表达式(*****)4.面向过程编程(*****)5.包的使用(***)6.常用模块    logging (*****)    re ( ...

  9. AR/VR-VR-Info-Micron-Insight:一镜观一屋:VR 将建筑设计变为现实

    ylbtech-AR/VR-VR-Info-Micron-Insight:一镜观一屋:VR 将建筑设计变为现实 1.返回顶部 1. 一镜观一屋:VR 将建筑设计变为现实 想象一下,在一栋为你设计的还没 ...

  10. ceph 删除了osd但是osd目录保存完整如何恢复

    1. 这里假设有一个osd被删除了 执行下列步骤删除: ceph osd out osd.0 service ceph stop osd.0 ceph osd crush remove osd.0 c ...