nginx 连接限制新语法

如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。

cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。

HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。

HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令

这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制

HttpLimitReqModul 限制某一段时间内同一ip访问数实例

http {

.....

#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,

#以$binary_remote_addr 为key,限制平均每秒的请求为1个,

#1M能存储16000个状态,rete的值必须为整数,

#如果限制两秒钟一个请求,可以设置成60r/m

limit_req_zone $binary_remote_addr zone=allips:10m rate=60r/m;

#limit_conn_zone $binary_remote_addr zone=one:10m;

## Log Format ###

log_format  main  ‘$remote_addr $host $remote_user [$time_local] "$request" ‘

‘$status $body_bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"‘;

server {

listen       80;

server_name  ckl.zab.com;

location / {

root   /opt/wwwroot/zabbix;

index  index.html index.php index.htm test.php;

}

location ~ \.php$ {

root           /opt/wwwroot/zabbix;

fastcgi_pass   127.0.0.1:9000;

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

include        fastcgi_params;

#限制每ip每秒不超过20个请求,漏桶数burst为5

#brust的意思就是,如果第1秒、2,3,4秒请求为19个,

#第5秒的请求为25个是被允许的。

#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。

#nodelay,如果不设置该选项,严格使用平均速率限制请求数,

#第1秒25个请求时,5个请求放到第2秒执行,

#设置nodelay,25个请求将在第1秒执行。

limit_req zone=allips burst=5 nodelay;

}

}

测试:

/opt/abtmp/usr/bin/ab -n 10 -c 10 http://127.0.0.1/test.php

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

每秒限制一个,超过503

HttpLimitZoneModule 限制并发连接数实例

limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域

http {

.....

#定义一个名为one的limit_zone,大小10M内存来存储session,

#以$binary_remote_addr 为key

#nginx 1.18以后用limit_conn_zone替换了limit_conn

#且只能放在http作用域

limit_conn_zone $binary_remote_addr zone=one:10m;

## Log Format ###

log_format  main  ‘$remote_addr $host $remote_user [$time_local] "$request" ‘

‘$status $body_bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"‘;

server {

listen       80;

server_name  ckl.zab.com;

location / {

root   /opt/wwwroot/zabbix;

index  index.html index.php index.htm test.php;

}

location ~ \.php$ {

root           /opt/wwwroot/zabbix;

fastcgi_pass   127.0.0.1:9000;

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

include        fastcgi_params;

#连接限制为5

limit_conn one 5;

#带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k

limit_rate 300k;

}

}

}

测试:

/opt/abtmp/usr/bin/ab -n 10 -c 10 http://127.0.0.1/test.php

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"

每秒的限制为5,超过503

时间: 2024-09-28 07:57:24

nginx 连接限制新语法的相关文章

.NET中那些所谓的新语法之四:标准查询运算符与LINQ

开篇:在上一篇中,我们了解了预定义委托与Lambda表达式等所谓的新语法,这一篇我们继续征程,看看标准查询运算符和LINQ.标准查询运算符是定义在System.Linq.Enumerable类中的50多个为IEnumerable<T>准备的扩展方法,而LINQ则是一种类似于SQL风格的查询表达式,它们可以大大方便我们的日常开发工作.因此,需要我们予以关注起来! /* 新语法索引 */ 1.自动属性 Auto-Implemented Properties 2.隐式类型 var 3.参数默认值 和

Qt 学习之路:深入 Qt5 信号槽新语法

在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号槽新语法.由于这次改动很大,许多以前看起来不是问题的问题接踵而来,因此,我们用单独的一章重新介绍一些 Qt 5 的信号槽新语法. 基本用法 Qt 5 引入了信号槽的新语法:使用函数指针能够获得编译期的类型检查.使用我们在自定义信号槽中设计的Newspaper类,我们来看看其基本语法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

队列与DelphiXe新语法

好久没写代码了,更久没上博客园的博客了,无聊写几行试一下新语法. 1 unit Main; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, 8 9 iHome.Help

.NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,.Net基类库针对实际开发中最常用的情形提供了几个预定义好的委托,这些委托可以直接使用,无需再重头定义一个自己的委托类型.预定义委托在.Net基类库中使用的比较广泛,比如在Lambda表达式和并行计算中都大量地使用,需要我们予以关注起来! /* 新语法索引 */ 1.自动属性 Auto-Impleme

.NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也不禁地对编译器内部到底为我们做了哪些事儿而感到好奇?于是,我们就借助反编译神器,去看看编译器到底做了啥事!其实本篇中很多都不算新语法,对于很多人来说可能都是接触了很久了,这里主要是针对.NET的老版本来说,是一个“相对”的新语法. /* 新语法索引 */ 1.自动属性 Auto-Implemente

总结常见的ES6新语法特性。

前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数(=>).class等等.用一句话来说就是: ES6给我们提供了许多的新语法和代码特性来提高javascript的体验 不过遗憾的是,现在还没有浏览器能够很好的支持es6语法,点这里查看浏览器支持情况,所以我们在开发中还需要用babel进行转换为CommonJS这种模块化标准的语法. 因为下面我会讲到一

C#7的新语法

C#7为C#语言添加了许多新功能: out变量: 您可以将out内联值声明为使用它们的方法的参数. 元组 您可以创建包含多个公共字段的轻量级,未命名的类型.编译器和IDE工具可以理解这些类型的语义. 模式匹配 您可以根据这些类型的成员的任意类型和值创建分支逻辑. ref 当地人和回报 方法参数和局部变量可以是对其他存储的引用. 本地功能 您可以将功能嵌套在其他功能中,以限制其范围和可见性. 更健康的成员 可以使用表达式创作的成员列表已经增加. throw 表达式 您可以在以前不允许的代码结构中抛

zabbix监控nginx连接状态

zabbix学习笔记:zabbix监控nginx连接状态 zabbix监控nginx zabbix可以监控nginx的状态,关于一个服务的状态可以查看服务本身的状态(版本号.是否开启),还应该关注服务能力(例如以nginx的负载效果:连接数.请求数和句柄数).下面我们使用zabbix监控nginx. nginx的安装 如果想要查看nginx的服务状态,在对nginx进行源码安装的时候要选中–with-http_stub_status_module模块. 1.解压安装包: [[email prot

安装php并使用nginx连接PHP

版本是5.6.31 安装前需要安装的包: yum install gcc make gd-devel libjpeg-devel libpng-devel libxml2-devel bzip2-devel libcurl-devel  freetype-devel -y 编译如下: ./configure --prefix=/usr/local/php-5.6.31 \--with-config-file-path=/usr/local/php-5.6.31/etc --with-bz2 --