环境如下:
[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地址作为变量条件,添加第二个自定义变量
连接数和请求数限制可能有人会迷惑。这里解惑一下:一个页面可能存在多个图片,我们请求了这个页面,建立了链接,但是这个链接包含了10个请求(均是图片)。所以这两个模块结合起来比较好。
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
    limit_rate  num;    限定具体速度,如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的状态

nginx之依据IP做限制的更多相关文章

  1. nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)

    在nginx中常用的有以下四种负载均衡的算法,分别是:round-robin.ip-hash.least-connected和weighted.当然在实际生产中或许使用最多的就是ip-hash了,一般 ...

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

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

  3. nginx 配置禁用ip地址访问

    做过面向公网WEB运维的苦逼们肯定见识过各种恶意扫描.拉取.注入等图谋不轨行为吧?对于直接对外的WEB服务器,我们可以直接通过 iptables . Nginx 的deny指令或者是程序来ban掉这些 ...

  4. ASP.NET Core 搭配 Nginx 的真实IP问题

    一.前言 Nginx(Engine X)是一个高性能HTTP和反向代理服务,是由俄罗斯人伊戈尔·赛索耶夫为访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发 ...

  5. 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则

    负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...

  6. Nginx 限制单个IP的并发连接数及对每个连接速度(限速)

    使用Nginx限制单个IP的并发连接数能够减少一些采集程序或者DDOS的攻击. 再lnmp的nginx配置中已经添加了部分代码,但是是注释掉的,可以编辑/usr/local/nginx/conf/ng ...

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

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

  8. linux , nginx: 封禁IP的办法【转】

    今天,我们的一台服务器出了问题: 被若干IP地址访问某个接口,该接口会发送短信. 所以,我们可以做两件事: 1. nginx的层面封IP .  2  linux server的层面封IP 先看ngin ...

  9. 使用python控制nginx禁封ip

    python控制nginx禁封ip nginx中的access.log最近有大量的用户访问,怎么样屏蔽掉在一定时间段内访问次数多的ip呢? 测试准备: 两个tomcat,一个nginx做均衡负载,服务 ...

随机推荐

  1. 小试牛刀——爬topit.me的图片,附github简易上传教程

    接触了scrapy ,发现爬虫效率高了许多,借鉴大神们的文章,做了一个爬虫练练手: 我的环境是:Ubuntu14.04 + python 2.7 + scrapy 0.24 目标 topit.me 一 ...

  2. Scala学习笔记--隐式转换

    隐式转换的规则:1.无歧义规则:隐式转换唯有不存在其他可插入转换的前提下才能插入  若编译器有两种方法修正x+y 如convert1(x)+y,convert2(x)+y,会报错2.单一调用规则:只尝 ...

  3. [LA] 3027 - Corporative Network [并查集]

    A very big corporation is developing its corporative network. In the beginning each of the N enterpr ...

  4. PHP中$_GET['name']与$_POST['name']变量直接用变量名$name的php配置

    php中,可以直接使用参数名称作为变量来接收get或post的传参,条件是php.ini中register_global设置成On 另外一种方法: if(!ini_get('register_glob ...

  5. poj2975--Nim

    题意:对于一个给定的取石子游戏,有多少种先手策略获胜? Ans:若无法获胜,则输出0. 若能获胜我们只要找到一堆石子,使得我们能取它的一部分让总和的异或和变为0.我们先将整个游戏的值异或起来为s 则a ...

  6. C# LinkButton 带参数的OnCommand事件的写法

    前台: <asp:TemplateField HeaderText ="操作"> <HeaderStyle HorizontalAlign ="Cent ...

  7. GestureDetector和SimpleOnGestureListener的使用教程

    1. 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vi ...

  8. 【转】vsftp 遇到错误 500 OOPS: vsftpd: refusing to run with writable root inside chroot()--不错

    原文网址:http://linux.it.net.cn/e/server/ftp/2015/0227/13554.html 当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错 ...

  9. linux驱动面试题2

    1.什么是GPIO? general purpose input/output GPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,当然某个脚具有复用的 ...

  10. 常用的Eclipse快捷键

    alt+shift+r 修改名字 ctrl+shift+r 查找源类 Eclipse快捷键功能1. [ALT+/]   --->提示此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不 ...