Nginx:Nginx limit_req limit_conn限速
简介
- Nginx是一个异步框架的Web服务器,也可以用作反向代理,负载均衡器和HTTP缓存,最常用的便是Web服务器。nginx对于预防一些攻击也是很有效的,例如CC攻击,爬虫,本文将介绍限制这些攻击的方法,可以使用nginx的ngx_http_limit_conn_module、ngx_http_limit_req_module这两个模块达到目的,该模块为nginx内置模块,yum安装即有,无需编译安装。本文就介绍nginx这两个模块的使用和细节,希望能够对需要的小伙伴有所帮助。
基本环境介绍
- 两台机器,192.168.30.105和192.168.30.106均为 1c2g40g配置,106主机提供web服务,105主机部署ab工具。
web服务如下
ab压测获取基础数据
105 ab压测结果
对web服务器index.html页面发送并发为1000总计1000000的请求测试,每个请求建立一个连接
ab -n 1000000 -c 1000 http://192.168.30.106:80/index.html
从测试结果来看,请求全部成功;有98%的请求在22ms以内就完成响应,有99%的请求在1007ms以内就完成响应,请求响应的最长时长为31077ms。
nignx ngx_http_limit_conn_module模块
- 该模块的功能是限制单个ip建立连接的个数。
对nginx进行配置
http {
limit_conn_zone $binary_remote_addr zone=one:10m;
...
server {
...
location / {
limit_conn one 1;
}
限制每个ip连接的个数为一个
测试
对web服务器index.html页面发送并发为1000总计1000000的请求测试
ab -n 1000000 -c 1000 http://192.168.30.106:80/index.html
从测试结果来看,请求全部成功;有98%的请求在58ms以内就完成响应,有99%的请求在1008ms以内就完成响应,请求响应的最长时长为31870ms。
测试效果
测试结果无变化,查众多文档,有问题,无答案,估计是个bug。
nignx ngx_http_limit_req_module模块
- 该模块的功能是限制单个ip请求的个数(请求频率)。
对nginx进行配置
去掉之前limit_conn 配置,添加如下配置
http {
limit_req_zone $binary_remote_addr zone=two:10m rate=1r/s;
...
server {
...
location / {
limit_req zone=two;
}
限制请求的频率为单个ip每秒一个
测试
对web服务器index.html页面发送并发为1000总计1000000的请求测试
ab -n 1000000 -c 1000 http://192.168.30.106:80/index.html
从测试结果来看,请求只有55个成功。
测试效果
有效的阻止了用户的请求。
测试过程web服务资源使用情况监控
CPU利用
网络接口流量
TCP连接数状态
总结
- 从测试的结果以及监控数据来看,limit_conn模块无效,不能起到任何限制作用;limit_req模块能够明显限制用户的请求内容,对于超出限制的请求,给予503的反馈;两者对服务器性能上都没有优化作用,拒绝的请求需要花费更多的硬件资源来处理,CPU消耗增多,接口流出的流量剧增。
- 测试结果不是很理想,对于文中的错误和不足,欢迎有见识的小伙伴批评指教。
参考文档
- 官方文档:http://nginx.org/en/docs
- 使用nginx limit_req限制用户请求速率:https://www.centos.bz/2017/03/using-nginx-limit_req-limit-user-request-rate
- 关于limit_req和limit_conn的区别:https://blog.csdn.net/u012566181/article/details/49968283
- ab压力测试报错:https://www.cnblogs.com/felixzh/p/8295471.html
- ab性能测试结果分析:https://www.cnblogs.com/gumuzi/p/5617232.html
- Rate Limiting with NGINX and NGINX Plus:https://www.nginx.com/blog/rate-limiting-nginx/
Nginx:Nginx limit_req limit_conn限速的更多相关文章
- nginx日志管理与限速
1.日志简介nginx日志主要有两种:访问日志和错误日志.访问日志主要记录客户端访问nginx的每一个请求,格式可以自定义:错误日志主要记录客户端访问nginx出错时的日志,格式不支持自定义.两种日志 ...
- ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail!
ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail! 执行 nginx 重启服务时,提示失败如下: $ sudo service ngi ...
- nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
在重启nginx服务的时候,出现了这个错误. [root@izuf68g6a94fj32w0afx00z etc]# nginx -c /var/run/nginx/nginx.pid nginx: ...
- nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解
nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...
- [development][security][modsecurity][nginx] nginx / modsecurity development things
接续前节:[security][modsecurity][nginx] nginx 与 modsecurity nginx开发手册:https://nginx.org/en/docs/dev/deve ...
- [security][modsecurity][nginx] nginx 与 modsecurity
参考文档: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#installation-for-nginx nginx不支 ...
- nginx: [error] invalid PID number "" in "/var/run/nginx/nginx.pid"
一.出现这个的情况 解决方法一: 1.添加正在运行pid号到/var/run/nginx/nginx.pid就可以解决问题了(这个情况是在重启的情况下发现的) 2.如果是重启机器之后,系统有时会删掉/ ...
- 解决nginx重启“var/run/nginx/nginx.pid" no such file or directory问题
重启虚拟机后,再次重启nginx会报错“/var/run/nginx/nginx.pid” no such file or directory. 方法一(已试过可行): 到/var/run下看没有ng ...
- 重启虚拟机后,再次重启nginx会报错:[emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
问题: 重启虚拟机后,再次重启nginx会报错: open() "/var/run/nginx/nginx.pid" failed (2: No such file or dire ...
随机推荐
- JavaScript | ES6 新增
Evernote Export body, td { font-family: 微软雅黑; font-size: 10pt; } ES6 重点知识 this关键字以及bind let/const 变量 ...
- JavaScript substring()
JavaScript substring() 方法 参数 描述 start 必需.一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置. stop 可选.一个非负的整数, ...
- Mac重装操作系统系统
恢复出厂设置 第一种 1.开机 2.commond + R,进入recover模式. 3.选择磁盘工具 4.显示所有设备 5.抹掉硬盘.格式选择 (1):Mac OS 扩展(日志式). (2): Ma ...
- C#实现文件Move操作和文件的Copy操作
文件移动(Move)操作和文件的复制(Copy)是C#程式开发经常遇到的方法,根据传入的源文件地址和目标文件地址参数,实现对文件的操作.实现代码如下: Move操作代码: public static ...
- JavaScript面向对象 实例与原型
JavaScript 面向对象 和 C# 不太一样,js 的对象是继承自原型的如下: 首先创建一个 js 实例 new function function f () {} 这个函数 会继承 Func ...
- HttpServletRequest & HttpServletResponse
Servlet配置方式 全路径匹配 以 / 开始 /aa/bb localhost:8080/项目名称/aa/bb 路径匹配 , 前半段匹配 以 / 开始 , 但是以 * 结束 /a/* /* *是一 ...
- SpringSecurity 初始化流程源码
SpringSecurity 初始化流程源码 本篇主要讲解 SpringSecurity初始化流程的源码部分,包括核心的 springSecurityFilterChain 是如何创建的,以及在介绍哪 ...
- 曹工说Spring Boot源码(11)-- context:component-scan,你真的会用吗(这次来说说它的奇技淫巧)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- latex一些有用的写法
编辑博文的时候总是忘语法,然后到网上查-- 干脆记一下! 1.编辑漂亮的函数上下标 \(\sum\limits_{i=1}^n\) 对于原有的函数:$\sum\limits_{i=1}^n$ \(\m ...
- JZOJ4238 纪念碑
Description 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一个长为n,宽为m的矩形.它由n* m个1*1的 ...