码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx 限制连接的实践 (DDOS)

时间:2017-12-19 15:09:27      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:sea   同事   返回   stream   href   color   div   nta   ons   

参考:  运维人员的日常

 

关于限制用户连接,Nginx 提供的模块: ngx_http_limit_req_modulengx_http_limit_conn_module  , 还有 stream 模块也包含类似的功能, 本文只说明 ngx_http_limit_req_module 的使用

 

 

ngx_http_limit_req_module 配置

 

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    ...

    server {

        ...
        limit_req zone=one burst=5;

        location /search/ {
            limit_req zone=one burst=5;
        }
        ...
}

 

$binary_remote_addr -- 二进制远程地址

zone=one:10m -- 定义zone名字叫one,并为这个zone分配10M内存,用来存储会话(二进制远程地址),1m内存可以保存16000会话

rate=10r/s -- 限制频率为每秒10个请求

burst=5 -- 允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的,反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。

 

 

遇到的问题

 

拟定这样一个场景:

一次请求返回 50 个 HTML 页面,总共用时10s。 如果在一个500人的场所中,单个客户端 IP 发出的最大请求数会是: 500/10 * 500 = 2500. 

 所以,为了不影响正常用户的访问,我似乎只能做如下设置: rate=2500r/s. 显然,这样的设置是不合理的。

 

 

如何解决这个问题?

  

Syntax: limite_req_zone key zone=name:size rate=rate   中的 key 设定为: $remote_addr$uri , 如下:

limit_req_zone "$remote_addr$uri" zone=one:10m rate=1r/s;

 

这样,计数的时候会记录 URL 而不是客户端的 IP.

 

ps:这个方法是一个萌萌的同事想出来的.

 

以上.

 

Nginx 限制连接的实践 (DDOS)

标签:sea   同事   返回   stream   href   color   div   nta   ons   

原文地址:http://www.cnblogs.com/tiantiandas/p/nginx_protect_ddos.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!