环境如下:



[root@localhost ~]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
[root@localhost ~]# uname -r
2.6.32-431.el6.x86_64
[root@localhost ~]# nginx -V
nginx version: nginx/1.4.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre





1.既然依据ip做限制,那么可限制的一般有连接数、请求数、速率、带宽


2.nginx官方已经提供的有对应的模块,且默认是已经加载的,如果需要取消则--without-*,那么,模块具体信息如下:


    http_limit_req_module     请求数限制



     http_limit_conn_module     连接数限制



    http_core_module     速率、带宽限制



    http_map_module     以第一个变量值为条件,添加第二个自定义变量



    http_geo_module     以客户端IP地址作为变量条件,添加第二个自定义变量




nginx 设置ip根据省份负载均衡 nginx的ip_nginx

连接数和请求数限制可能有人会迷惑。这里解惑一下:一个页面可能存在多个图片,我们请求了这个页面,建立了链接,但是这个链接包含了10个请求(均是图片)。所以这两个模块结合起来比较好。


nginx 设置ip根据省份负载均衡 nginx的ip_nginx

map和geo的目的在于设置限定范围,毕竟我们有时候需要针对某一个范围的ip进行限制,如仅对外网进行限制

3.模块解析:


>>http_limit_req_module


    http上下文中,可做如下


     limit_req_zone $variable zone=zone_name:num rate=numr/s;

    limit_req_zone:固定格式

     $variable:指的是对某个ip作出限定,此变量一般从$binary_remote_addr或者$remote_addr获取,当然也可以直接调用这两个变量

    zone=zone_name:num:指定共享内存空间名和大小,比如说zone=req1:5m

    rate=numr/s:指定请求速率,这里值只能是整数,比如说1r/s表示每秒最多1个请求,30r/m表示每分钟最多30个请求,也就是每秒最多2个请求


    location上下文中,可做如下

    limit_req zone=zone_name burst=num;

    limit_req:固定格式

    zone:设定共享内存空间名

    burst:如果请求频率超出了http上下文中限定的速率,则指定允许超出多少,当然,这超出的部分会被延迟处

理。如果继续超出burst的限定值,则返回503错误

>>http_limit_conn_module

    此模块基本和http_limit_conn_module一致


    http上下文中,可做如下


    limit_conn_zone $variable zone=zone_name:num;


    location上下文中,可做如下:   


    limit_conn zone_name num;

    num:限定每秒连接数,并发


http_core_module  


    location上下文中,可做如下



     limit_rate_after num;     限定使用多少带宽之后,再执行限速,如1m



    限定具体速度,如100k,即限定100kb/s



http_map_module


    http上下文中,可做如下



    map $var1 $var2 {



         变量1的匹配项     变量2的值;



     }



          例1:依据一个具体数值,限定ip范围,当white为1时,则ip为请求的客户端ip


        map $white $ip {
            1 $binary_remote_addr;
        }

          例2:依据域名,赋值

        map $host $value {
            ~test abc
        }

>> http_geo_module


    定义从指定的变量获取客户端的IP地址。默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其他变量获得。


    http上下文中,可做如下



    geo $var1 $var2 {



         ip地址     变量2的值;



     }



          例1:依据ip地址,赋值给变量2。如果是来访客户端是127.0.0.1,则white为1,反之为0.


        geo $white {
            default 0;
            127.0.0.1 1;
        }


4.一个综合例子


http {
    ...
    geo $white {
    default 0;
    127.0.0.1 1;
    }
    map $white $limit {
    0 $binary_remote_addr;
    1 "";
    }
    limit_conn_zone $limit zone=conn:5m;
    limit_req_zone $limit zone=req:5m rate=1r/s;
    ...
    server {
    ...
        location / {
            root   html;
            index  index.html index.htm;
        limit_conn conn 2;
        }
    ...
    }
}



测试:


加入限制前:客户端访问nginx的状态


nginx 设置ip根据省份负载均衡 nginx的ip_客户端_03


加入限制后:客户端访问nginx的状态


nginx 设置ip根据省份负载均衡 nginx的ip_nginx 设置ip根据省份负载均衡_04