虚位以待(AD)
虚位以待(AD)
首页 > 操作系统 > LINUX > nginx对ip限流的操作

nginx对ip限流的操作
类别:LINUX   作者:码皇   来源:<a href="http://blog.csdn.net/qq_29069885" target="_blank" rel="nofollow   点击:

我们经常遇到这种情况,客户使用生产环境进行了压力测试,大量的请求,导致其他客户的请求未能响应。 服务器资源有限,但是客户端来的请求在不断的上涨, 为了保证一部分的请求能够正常相应, 不得不放弃一些客户端来的请求, 这个时候我们会选择行的进行一些NGINX的限流操作

一.背景

我们经常遇到这种情况,客户使用生产环境进行了压力测试,大量的请求,导致其他客户的请求未能响应。

服务器资源有限,但是客户端来的请求在不断的上涨, 为了保证一部分的请求能够正常相应, 不得不放弃一些客户端来的请求, 这个时候我们会选择行的进行一些NGINX的限流操作, 这种操作可以很大程度上缓解服务器的压力, 使其他正常的请求能够得到正常响应.

二.使用nginx模块

 

1. ngx_http_limit_conn_module模块

 

说明:此模块用来限制单IP的连接数

配置方式:

1.在nginx配置文件中的http配置模块添加: limit_conn_zone key zone=name:size;

说明:开辟一个内存空间,为不同的key值保存状态,状态属性里面有当前来的连接数。key可以为变量,这里的key为$binary_remote_addr,即远程服务器的地址。name为该空间的命名,size为大小。

PS: 64位系统上,$binary_remote_addr存储占用64 bytes内存空间,状态存储占用64bytes内存空间,1M的size能存8192个不同$binary_remote_addr的状态。

2. 再在http->server->location配置模块中添加:limit_conn zone number;

说明:在当前location下,命名为zonekey值对应的连接数不能超过number,如果超过了,就会返回503错误

配置实例:

 

    http {
    # 定义一个key为$binary_remote_addr、名字为addr、空间大小为10M的limit_conn_zone
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    ...
    server {
    ...
    location /download/ {
    # 定义当前location下$binary_remote_addr对应的连接数不能超过1
    limit_conn addr 1;
    }
    }
}

 

 

 

 

ngx_http_limit_req_module模块

 

说明:此模块用来限制单IP的请求频率

配置方式:

1.在nginx配置文件中的http配置模块添加: limit_req_zone key zone=name:size rate[rate];

说明:开辟一个内存空间,为不同的key值保存状态,状态属性里面有当前来的次数数。key可以为变量,这里的key为$binary_remote_addr,即远程服务器的地址。name为该空间的命名,size为大小,rate为限制的频率。

PS: 64位系统上,$binary_remote_addr存储占用64 bytes内存空间,状态存储占用64bytes内存空间,1M的size能存8192个不同$binary_remote_addr的状态。

2. 再在http->server->location配置模块中添加:limit_req_zone=name [brust=number] [nodelay];

说明:当前location受zone名为name的limit_req_zone限制,burst为可配参数,该配置可以理解为允许速率超过正常的请求个数(实际上比这个复杂的多),数量为number个,如果超过了,可配参数nodelay配置了就会返回503错误,没有配置超过的请求就会排队等待。

配置示例:

 

    http {
    # 定义一个key为$binary_remote_addr、名字为one、空间大小为10M、速度限制为1次每秒的limit_req_zone
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    ...
    server {
    ...
    location /search/ {
    # 定义当前location请求受名为one的limit_req_zone限制,令牌数为5,请求溢出后直接报错
    limit_req zone=one burst=5 nodelay;
    }
    }
    }

     

    附录:

    可能存在有些IP我们是不想被限制的,则可利用nginx_http_geo_module 和 ngx_http_map_module模块

    具体参考:http://nginx.org/en/docs/http/ngx_http_geo_module.html

    http://nginx.org/en/docs/http/ngx_http_map_module.html

     

    具体配置示例:

     

      http {

     

    # 定义名为$whiteiplist的geo,会根据client IP 映射成不同的值,默认值为1,白名单ip的值为0

    geo $whiteiplist {

    default 1; #IP默认映射为1,根据geo的优先级,优先匹配完整IP。

    192.168.1.10 0; #将192,168.10.0映射为0

    192.168.1.11 0;

    }

     

    # 定义名为$limit变量,$limit变量的值是由$whiteiplist的值决定的,当$whiteiplist为1时,$limit的值为$binary_remote_addr;当$whiteiplist为0时,$limit的值为空

     

    map $whiteiplist $limit {

    1 $binary_remote_addr;

    0 "" ;

    }

     

      # 定义一个key为$limit、名字为one、空间大小为10M、速度限制为1次每秒的limit_req_zone
      limit_req_zone $limit zone=one:10m rate=1r/s;

     

    ……

     

      server {
      ...

     

      location /search/ {
      # 定义当前location请求受名为one的limit_req_zone限制,令牌数为5,请求溢出后直接报错
      limit_req zone=one burst=5 nodelay;
      }

    }

    }

     

    相关热词搜索: