Nginx 模块:

ngx_http_limit_req_module
ngx_http_geo_module
ngx_http_map_module


Nginx 编译参数:

#./configure --prefix=/opt/nginx \
--user=www \
--group=www \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-pcre=/root/soft/pcre-8.34 \
--with-http_ssl_module \
--with-openssl=/root/soft/openssl-1.0.1


注:Nginx 默认是支持geo和map 模块的。平时我们都禁用了,
--without-http_geo_module
--without-http_map_module

Nginx 配置:
# /opt/nginx/conf/nginx.conf

http{}模块中添加如下配置:

geo $whiteiplist {     

   default 1;

        127.0.0.1 0;
        192.168.0.167 0;
        192.168.0.48 0;
}
 
map $whiteiplist $limit {
        1 $binary_remote_addr;
        "";
}

 limit_req_zone $limit zone=one:10m rate=120r/m; #定义zone记录区,名称为one,容量为10M,同1IP,每分钟限制120次请求

注:

1、使用geo指令定义一个$whiteiplist IP白名单,默认值为1,所有都受限制。如果客户端IP与白名单里的IP匹配,则$whiteiplist值为0,不受限制。
2、使用map指令将$whiteiplist值为1,受限制IP,映射为客户端IP,将$whiteiplist值为0的,也就是白名单IP,映射为空字符串。
3、使用limit_req_zone指令对于键值为空的将会被忽略,实现对白名单IP不做限制

在要限制的server{}模块中配置限速请求。

#cat /opt/nginx/conf/vhost/z.conf

server {    

  liste 80;

    server_name www.test.com;
    root /opt/web/test;
    index index.html index.php;
   limit_req zone=one burst=10; #使用limit_req模块对当前域名下所有连接限速访问,zone记录区为one,与nginx.conf配置文件里zone相对应。burst=10 使用列表模式。
}


注:limit_req 指令支持http{}、server()、location{}

测试:

使用webench工具测试,结果如下:www.test.com域名限制访问,同1IP,每分钟120次请求。

[root@vmh04-centos ~]# webbench  -t60   http://www.test.com/test.html
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
 
Benchmarking: GET http://www.test.com/test.html
1 client, running 60 sec.


Speed=120 pages/min, 159456 bytes/sec.  #每分钟处理请求为120次
Requests: 120 susceed, 0 failed.                  #成功处理请求120次

res.test.com域名不做限制

[root@vmh04-centos ~]# webbench  -t60 http://res.test.com/test.html
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
 
Benchmarking: GET http://res.test.com/test.html
1 client, running 60 sec.


Speed=55861 pages/min, 17824036 bytes/sec.  #每分钟处理请求为55861次

Requests: 55861 susceed, 0 failed.                       #成功处理请求55861次