zoukankan      html  css  js  c++  java
  • Nginx通过geo模式实现限速白名单和全局负载均衡

    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段收集起来就可以了~~
  • 相关阅读:
    109 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 05 问题解析--通过一个方法完成学生和专业的双向关联
    108 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 04 问题解析--数组未实例化造成的空指针异常
    107 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 03 编写方法完成学生个数统计功能
    106 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 02 新增属性完成学生信息存储
    105 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 01 新增需求及分析
    session与cookie的区别和联系
    session和cookie的区别
    Web服务器主动推送技术
    webSocket的场景应用
    TCP、Http和Socket 优劣比较
  • 原文地址:https://www.cnblogs.com/kevingrace/p/6165572.html
Copyright © 2011-2022 走看看