nginx 限流 cc/ddos基础防御

编程教程 > Linux > Linux Security (1014) 2024-11-26 14:39:04

Nginx 限流组件limit_req

limit_req作用:

  • 限制用户(同一个ip)在给定时间内HTTP请求的数量,
  • 流量限制主要用作安全目的,
  • 可以防止大量请求的攻击下服务被压垮,
  • 可以减慢暴力密码破解的速率

limit_req原理:

漏桶算,

在limit_req的限制下,请求被nginx以固定的速率处理,这个符合漏桶算法,即流出的速率恒定。

 

Nginx limit_req 配置案例

参考一:

http {
    limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
    ......略....
    server{
    ......略....
        location / {
             limit_req zone=perip;
             limit_req_status 503;
             ......略....
        }
    ......略....
    }
}

说明:

  • 变量:$binary_remote_addr【这里是客户端的ip地址,在这里是做限制的标识,是基于ip地址来限制】
  • zone=perip:20m:  perip  【  perip是内存区域的名字,20m: 生成的内存区域的大小】
  • rate=1r/s 【允放相同标识(IP)的客户端的访问频次,1次/秒】
  • limit_req_status 【限流后快速返回状态码,默认503】

在上面这个例子中:就是同一个ip地址在每秒内只能访问1次

配置好以后重启nginx使用ab测试

ab -n 100 -c 10  http://127.0.0.1/

测试结果

测试结果:

  • 只有1个成功其他99个失败
  • 响应总时间0.011秒

参考二:增加 burst 配置

http {
    limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
    ......略....
    server{
    ......略....
        location / {
             limit_req zone=perip burst=5;
             limit_req_status 503;
             ......略....
        }
    ......略....
    }
}

burst :

有大量请求时,超过频次限制的请求,会允许5个访问

允许超过限制后添加到队列执行,队列执行速率按照zone配置的rate进行

 注意:burst指定的请求数量,不会马上进行处理,而是按照上面zone中rate指定的值,以固定的速率进行处理。

 

执行ab测试

ab -n 100 -c 10 http://127.0.0.1/

测试2

测试结果:

有6个请求成功(1+队列5个),符合预期

注意时间,花费了5.009s (队列中的请求按设定的速率1秒执行一个所以消耗5s+另外一个,总计大于5s),符合预期

 

参考三:nodelay

http {
    limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
    ......略....
    server{
    ......略....
        location / {
             limit_req zone=perip burst=5 nodelay;
             limit_req_status 503;
             ......略....
        }
    ......略....
    }
}

nodelay参数说明:

  • burst的队列虽然可以处理用户的需求,但需要用户按照处理时间等待,对用户不够友好,
  • nodelay参数允许请求在排队的时候就立即被处理,

这里有一点要注意:因为nodelay允许立即处理,也就是有并发请求时,事实上已经超过了rate设置的处理速率了,所以要根据自己机器的实际情况设置这个值

注意nodelay+burts另外一个情况:

nodelay只是对放到burst队列中的请求立即处理,但处理完成后队列并不立即清空

队列清空的速度仍然按原来的速度每秒一个清空,所以当再有请求过来时,并不会马上又有两个burst请求被处理.

 

再次测试:

ab -n 100 -c 10 http://127.0.0.1/

测试3

这次请求完成时间为 0.009秒

 

rate 和 burst 设置多少

网站需要把动态生成的内容(java,php,python等程序生成)和静态内容分离到不同的虚拟主机

 因为静态内容不需要大量的计算,所以通常limit_req用于限制动态内容的访问频率

 

限流的目的不是让用户不能访问,而是为了保证用户能流畅的访问,所以需要根据页面的实际情况来限制。

 如果一个页面打开时同时发出的请求比较多,  (静态文件分离后要检查ajax请求数, 可以根据生产环境的日志进行检查) 则rate值不能低于并发的请求数.如果低于并发的情求数,会导致用户不能正常访问页面

 

以下配置仅供参考

     limit_req_zone $binary_remote_addr zone=reqperip:20m rate=20r/s;
     limit_req zone=reqperip burst=10 nodelay;

 

其他可配置参数

  • limit_req_status 用来指定请求时报错产生的状态码,默认503。可以指定为一个自定义的值,如:444(说明:444是nginx自定义的一个非标准状态码, 它会立即关闭连接,连响应头也不给客户端发,可以在受到恶意攻击时使用这个状态码)
  • limit_req_log_level   当报错时记录到日志的错误级别,默认值是error

 

使用nginx配置能减少部分cc攻击导致宕机情况增加基础安全,配合其他手段进行更全面的安全基础防护。

遇到恶意大量ddos攻击,还是只有花钱买专业服务。

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
Nginx 限流组件limit_req limit_req作用: 限制用户(同一个ip)在给定时间内HTTP请求的数量, 流量限制主要用作安全目的, 可以防止大量请求的...
ddos攻击属于网络攻击的常见模式之一。这里写一个能简单防御的脚本ddos-deflate脚本的安装和卸载
nginx配置文件检查命令正确命令:nginx -t -c /etc/nginx/nginx.conf错误命令:nginx -t -c /etc/nginx/conf.d/example.con...
Nginx 安装Nginx 安装参考:Linux yum nginx安装和nginx入门配置方法-XQLEE'BlogAlpine Linux nginx安装配
Nginx 配置日志nginx默认的日志配置在nginx.conf配置文件。
Linux(centos) nginx安装和nginx入门配置方法1.切换至root用户$su - 2.执行在线安装命令#yum install nginx -y 如果上面提示以下内容[root...
alpineLinux安装nginx更新软件apkupdate安装nginxapkaddnginx查看nginx版本nginx-vnginx启停启动停止servicenginxstop重启ser...
打开任务管理器发现一大堆nginx进程
需求将静态资源如css/js/图片缓存到不用每次都到后端服务去拿取,减少性能消耗。 配置nginx缓存配置缓存文件存放信息在nginx配置文件,httpd内部配
最近网站被恶意访问了,了解了一些基础防护手段,nginx屏蔽ua访问 编写文件agent_deany.conf #使用方法 #创建目录 /etc/nginx/conf.d/deny...
最近博客升级总是nginx原生的502页面,感觉有些不友好,特此研究了下502页面的配置nginx 502配置502页面核心配置 #502 page error_...
最终看起来像这样 nginx (host,ssl) -&gtl; harbor-nginx (non-ssl) -&gtl; harbor。说明首先服务上安装有 nginx,且
nginx常规使用时作为http协议的反向代理,这里要讲的是非http的Mysql端口代理,理论支持其他协议nginx.conf配置如下:user nginx; worker_process...
Nginx的upstream支持5种 分配方式,其中 轮询、权重、IP散列这三种为Nginx原生支持的分配方式,fair 和 url_hash 为第三方支持的分
nginx开启gzip压缩配置配置参考:server{listen443ssl;server_namet.example.com;#charsetkoi8-r;#access_log/var/l...