简介

  • 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消耗增多,接口流出的流量剧增。
  • 测试结果不是很理想,对于文中的错误和不足,欢迎有见识的小伙伴批评指教。

参考文档

Nginx:Nginx limit_req limit_conn限速的更多相关文章

  1. nginx日志管理与限速

    1.日志简介nginx日志主要有两种:访问日志和错误日志.访问日志主要记录客户端访问nginx的每一个请求,格式可以自定义:错误日志主要记录客户端访问nginx出错时的日志,格式不支持自定义.两种日志 ...

  2. ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail!

    ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail!       执行 nginx 重启服务时,提示失败如下: $ sudo service ngi ...

  3. 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: ...

  4. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  5. [development][security][modsecurity][nginx] nginx / modsecurity development things

    接续前节:[security][modsecurity][nginx] nginx 与 modsecurity nginx开发手册:https://nginx.org/en/docs/dev/deve ...

  6. [security][modsecurity][nginx] nginx 与 modsecurity

    参考文档: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#installation-for-nginx nginx不支 ...

  7. nginx: [error] invalid PID number "" in "/var/run/nginx/nginx.pid"

    一.出现这个的情况 解决方法一: 1.添加正在运行pid号到/var/run/nginx/nginx.pid就可以解决问题了(这个情况是在重启的情况下发现的) 2.如果是重启机器之后,系统有时会删掉/ ...

  8. 解决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 ...

  9. 重启虚拟机后,再次重启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 ...

随机推荐

  1. C语言之运算符和表达式

    运算符优先级: 求余运算用法: 声明变量的名字和类型: 变量的类型决定占用内存空间的大小.数据的存储形式,合法的表数范围.可参与的运算种类.变量名标识了内存中的一个存储单元. 自动类型转换: 运算符和 ...

  2. laravel配置加解密

    基于安全考虑,我们php项目配置文件中密码应该是加密的,laravel中也提供了OpenSSL 的 AES-256-CBC 来进行加密 但是如果我们项目配置的是其他加密方式,且希望以最少的改动实现读取 ...

  3. hadoop搭建

    一.前期准备 1.1 静态ip,请查看虚拟机安装不放呢 1.2 hostname 以及 hosts文件修改 cat /etc/hostname 不同的机器设置不同的名字 cat /etc/hosts ...

  4. 两个关于 Java 面试的 Github 项目

    哈喽,大家好.相信大家都知道金九银十,在人才市场上是指每年的 9 月和 10 月是企业的招聘高峰期.这个时候企业往往有大量招聘需求,求职者在这个时候就找工作无疑是最适合的.需求大,谈工资什么的就更容易 ...

  5. ElasticSearch安装中文分词器IKAnalyzer

    # ElasticSearch安装中文分词器IKAnalyzer  本篇主要讲解如何在ElasticSearch中安装中文分词器IKAnalyzer,拆分的每个词都是我们熟知的词语,从而建立词汇与文档 ...

  6. Adaboost和随机森林

    在集成学习中,主要分为bagging算法和boosting算法.随机森林属于集成学习(Ensemble Learning)中的bagging算法. Bagging和Boosting的概念与区别该部分主 ...

  7. python爬虫——urllib使用代理

    收到粉丝私信说urllib库的教程还没写,好吧,urllib是python自带的库,没requests用着方便.本来嘛,python之禅(import this自己看)就说过,精简,效率,方便也是大家 ...

  8. 用K-Means聚类分析做客户分群

    聚类指的是把集合,分组成多个类,每个类中的对象都是彼此相似的.K-means是聚类中最常用的方法之一,它是基于点与点距离的相似度来计算最佳类别归属. 在使用该方法前,要注意(1)对数据异常值的处理:( ...

  9. 4.JavaSE之标识符

    标识符:Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关键字:abstract.assert.boolean.breake.public.static.class...

  10. C#中TripleDES对应Java中的DESede即大家说的3DES,附C#及Java加解密结果一致的控制台程序例子

    直接上代码了. Java控制台代码: package Test; import java.security.Key; import javax.crypto.Cipher; import javax. ...