nginx介绍,流量及并发连接数限制,访问控制及ddos预防
时间:2017-07-15 13:20 来源:linux.it.net.cn 作者:IT
本文来源于实验楼Linux web运维(nginx)实战课程,原文链接:https://www.shiyanlou.com/courses/95,
对其进行总结回顾,如有侵权,私信删除。
1.什么是nginx
nginx是一款高性能的HTTP和反向代理服务器软件,下图是w3techs公布的全球网站服务器软件统计报告

2.为什么选择nginx
Nginx 和 Apache 相同点:
-
同是HTTP服务器软件,都采用模块化结构设计
-
支持通用语言接口,如PHP,Python等
-
支持正向代理和反向代理
-
支持虚拟主机及ssl加密传输
-
支持缓存及压缩传输
-
支持URL重写
-
模块多,扩展性强
-
多平台支持
Nginx的优势
-
轻量级 安装文件小 运行时CPU内存使用率低
-
性能强 支持多核,处理静态文件效率高,内核采用的poll模型最大可以支持50K并发连接
-
支持热部署 同时启动速度快,可以在不间断服务的情况下对软件和配置进行升级
-
负载均衡 支持容错和健康检查
-
代理功能强大 支持无缓存的反向代理,同时支持IMAP/POP3/SMTP的代理
3.工作原理
Nginx由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互。Nginx的各种功能和操作都由模块来实现。Nginx的模块从结构上分为核心模块、基础模块和第三方模块。
-
核心模块: HTTP模块、EVENT模块和MAIL模块
-
基础模块: HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块
-
第三方模块: HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块及用户自己开发的模块
这样的设计使Nginx方便开发和扩展,也正因此才使得Nginx功能如此强大。Nginx的模块默认编译进nginx中,如果需要增加或删除模块,需要重新编译Nginx,这一点不如Apache的动态加载模块方便。如果有需要动态加载模块,可以使用由淘宝网发起的web服务器Tengine,在nginx的基础上增加了很多高级特性,完全兼容Nginx,已被国内很多网站采用。
4.nginx 处理连接过程
nginx 不会为每个连接派生进程或线程,而是由 worker 进程通过监听共享套接字接受新请求,并且使用高效的循环来处理数千个连接。Nginx 不使用仲裁器或分发器来分发连接,这个工作由操作系统内核机制完成。监听套接字在启动时就完成初始化,worker 进程通过这些套接字接受、读取请求和输出响应。
master:
当 nginx 在启动后,会有一个 master 进程和多个 worker 进程。master进程主要用来管理worker进程,master 要做的就是:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。
主要完成如下工作:
-
读取并验证配置信息;
-
创建、绑定及关闭套接字;
-
启动、终止 worker 进程及维护 worker 进程的个数;
-
无须中止服务而重新配置工作;
-
控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;
-
重新打开日志文件;
-
编译嵌入式 perl 脚本
worker:
对于基本的网络事件,则是放在 worker 进程中来处理了。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求(一对一)。然而 nginx 没有专门地仲裁或连接分布的 worker,这项工作是由操作系统内核机制完成的。在启动时,创建一组初始的监听套接字,HTTP 请求和响应之时,worker 连续接收、读取和写入套接字。
worker 进程主要完成的任务包括:
-
接收、传入并处理来自客户端的连接;
-
提供反向代理及过滤功能;
-
nginx 任何能完成的其它任务
举例说明一个完整请求如何通过互相协作来实现的
既然 worker 进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供 80 端口的 http 服务时,一个连接请求过来,每个进程都有可能处理这个连接。那么问题来了,到底最后怎样处理,是由什么决定的呢?首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多个 worker 进程。所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程会在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,然后在读事件里调用 accept 接受该连接。当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求。产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到:一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。
也许你还有个疑问,那就是 nginx 采用多 worker 的方式来处理请求,每个 worker 里面只有一个主线程,那能够处理的并发数很有限啊,多少个 worker 就能处理多少个并发,何来高并发呢?然而,这就是 nginx 的高明之处,nginx 采用了异步非阻塞的方式来处理请求,也就是说,nginx 是可以同时处理成千上万个请求的。
异步非阻塞
异步的概念是和同步相对的,也就是不同事件之间不是同时发生的。非阻塞的概念是和阻塞对应的,阻塞是事件按顺序执行,每一事件都要等待上一事件的完成,而非阻塞是如果事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。
5.nginx 的优化
-
tcp_nodelay 配置 nginx 不要缓存数据,应该快速的发送小数据——这仅仅应该用于频繁发送小的碎片信息而无需立刻获取响应的、需要实时传递数据的应用中。
-
keepalive_timeout 指定了与客户端的 keep-alive 链接的超时时间。服务器会在这个时间后关闭链接。我们可以降低这个值,以避免让 worker 过长时间的忙碌。

2、logging setings
-
access_log 确定了 nginx 是否保存访问日志。将这个设置为关闭可以降低磁盘 IO 而提升速度。
-
error_log 设置 nginx 应当记录临界错误。

-
修改好配置文件以后,务必记得使用:
sudo service nginx reload
来使配置文件生效。
6.流量及并发连接数限制
1)指令使用及配置修改
我们需要在 http 的 server 中加一个 location,就好比之前我们做的简单的 echo 模块,格式为:
location /刚下好的测试文件夹/ {
root /刚才下载测试文件的目录/;
...
...
...
}
接下来就是调用命令实现流量限制。nginx 的模块中早就写好了对应的命令,我们只需要调用就好。
实现流量限制由两个指令 limit_rate 和 limit_rate_after 共同完成:
-
limit_rate
语法: limit_rate rate;
默认值: limit_rate 0;
作用域: http, server, location, if in location
命令概述:限制向客户端传送响应的速率限制。参数 rate 的单位是字节/秒,设置为 0 将关闭限速。 nginx 按连接限速,所以如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的 2 倍。
-
limit_rate_after
语法: limit_rate_after size;
默认值: limit_rate_after 0;
作用域:http, server, location, if in location
设置不限速传输的响应大小。当传输量大于此值时,超出部分将限速传送。
作用范围:http,server,location,if inlocation
要是想了解更多,这里有更加详细的命令信息http://wiki.nginx.org/HttpCoreModule#limit_rate
讲了要使用的指令 我们接下来就实战配置
这是小编实验时的配置(传输量限制为 3m,速率限制为 20k/s):

(2)配置之前与配置之后的测试
接下来就是测试
wgethttp://本机地址/seven/seven.mp4
本机地址用 ifconfig 来查看
修改配置之前,速率没有限制:

修改配置之后,可见由于传输量大于 3m,超出部分的传输速率已经被限制在 20k/s:

也许你已经发现配置之后刚开始的时候传输速度很高,因为,传输量大于设定值的部分才会受到限制。这就说明,我们两个命令都发挥了作用,这也就完成了我们第一个实战。
2.实现并发连接数限制的具体配置
(1)指令使用及配置文件修改
这个的配置是基于 ngx_http_limit_zone_module 模块的,要简单完成并发限制,我们要涉及到 limit_conn_zone 和 limit_conn 这两个指令:
-
limit_conn_zone
语法: limit_conn_zone zone_name $variable the_size
默认值: no
作用域: http
本指令定义了一个数据区,里面记录会话状态信息。 variable 定义判断会话的变量;the_size 定义记录区的总容量。
-
limit_conn
语法: limit_conn zone_name the_size
默认值: no
作用域: http, server, location
指定一个会话最大的并发连接数。 当超过指定的最发并发连接数时,服务器将返回 "Service unavailable" (503)。
配置示例:
http {
limit_conn_zone $binary_remote_addr zone=one:10m;
...
server {
...
location /seven/ {
limit_conn one 1;
.....
}
-
定义一个叫“one”的记录区,总容量为 10M,以变量 $binary_remote_addr 作为会话的判断基准(即一个地址一个会话)。 限制 /seven/ 目录下,一个会话只能进行一个连接。 简单点,就是限制 /seven/ 目录下,一个 IP 只能发起一个连接,多过一个,一律 503。
-
你可以注意到了,在这里使用的是$binary_remote_addr 而不是 $remote_addr。$remote_addr 的长度为 7 至 15 bytes,会话信息的长度为 32 或 64 bytes。 而 $binary_remote_addr 的长度为 4 bytes,会话信息的长度为 32 bytes。 当 zone 的大小为 1M 的时候,大约可以记录 32000 个会话信息(一个会话占用 32 bytes)。
-
由于环境的原因这里没有办法测试只是让大家了解,限制并发连接数 nginx 的对应模块的配置,如果大家有需要,可以进一步参照http://wiki.nginx.org/HttpLimitZoneModule 这里有更详细的讲解。
7.访问控制及 DDOS 预防
1.访问控制配置
基于各种原因,我们要进行访问控制。比如说,一般网站的后台都不能让外部访问,所以要添加 IP 限制,通常只允许公司的 IP 访问。访问控制就是指只有符合条件的 IP 才能访问到这个网站的某个区域。
涉及模块:ngx_http_access_module
模块概述:允许限制某些 IP 地址的客户端访问。
对应指令:
-
allow
语法: allow address | CIDR | unix: | all;
默认值: —
作用域: http, server, location, limit_except
允许某个 IP 或者某个 IP 段访问。如果指定 unix,那将允许 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
-
deny
语法: deny address | CIDR | unix: | all;
默认值: —
作用域: http, server, location, limit_except
禁止某个 IP 或者一个 IP 段访问。如果指定 unix,那将禁止 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
配置范例:
location / {
deny192.168.1.1;
allow192.168.1.0/24;
allow10.1.1.0/16;
allow2001:0db8::/32;
deny all;
}
规则按照顺序依次检测,直到匹配到第一条规则。 在这个例子里,IPv4 的网络中只有 10.1.1.0/16 和 192.168.1.0/24 允许访问,但 192.168.1.1 除外;对于 IPv6 的网络,只有 2001:0db8::/32 允许访问。
ngx_http_access_module 配置允许的地址能访问,禁止的地址被拒绝。这只是很简单的访问控制,而在规则很多的情况下,使用 ngx_http_geo_module 模块变量更合适。这个模块大家下来可以了解 : ngx_http_geo_module
2.DDOS 预防配置
DDOS 的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量。对于七层的应用攻击,我们还是可以做一些配置来防御的,使用 nginx 的 http_limit_conn 和 http_limit_req 模块通过限制连接数和请求数能相对有效的防御。
ngx_http_limit_conn_module 可以限制单个 IP 的连接数
ngx_http_limit_req_module 可以限制单个 IP 每秒请求数
配置方法:
(1). 限制每秒请求数
涉及模块:ngx_http_limit_req_module
通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回 503 错误。
配置范例:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
...
server {
...
location ~ \.php$ {
limit_req zone=one burst=5 nodelay;
}
}
}
必要配置说明(上一部分解释过的就不再解释):
$binary_remote_addr 二进制远程地址
rate=10r/s; 限制频率为每秒 10 个请求
burst=5 允许超过频率限制的请求数不多于 5 个,假设 1、2、3、4 秒请求为每秒 9 个,那么第 5 秒内请求 15 个是允许的;反之,如果第一秒内请求 15 个,会将 5 个请求放到第二秒,第二秒内超过 10 的请求直接 503,类似多秒内平均速率限制。
nodelay 超过的请求不被延迟处理,设置后 5(不延时)+10(延时)个请求在 1 秒内处理。(这只是理论数据,最多的情况)
(2).限制 IP 连接数
上一章讲过,我们就直接写出来
http {
limit_conn_zone $binary_remote_addr zone=addr:10m; //上面讲过
...
server {
...
location /操作目录/ {
limit_conn addr 1;
}
}
}
(3).白名单设置
http_limit_conn 和 http_limit_req 模块限制了单 IP 单位时间内的连接和请求数,但是如果 Nginx 前面有 lvs 或者 haproxy 之类的负载均衡或者反向代理,nginx 获取的都是来自负载均衡的连接或请求,这时不应该限制负载均衡的连接和请求,就需要 geo 和 map 模块设置白名单:
geo $whiteiplist {
default 1;
10.11.15.1610;
}
map $whiteiplist$limit {
1$binary_remote_addr;
0"";
}
limit_req_zone $limit zone=one:10m rate=10r/s;
limit_conn_zone $limit zone=addr:10m;
geo 模块定义了一个默认值是 1 的变量 whiteiplist,当在 ip 在白名单中,变量 whiteiplist 的值为 0,反之为 1
-
下面是设置的逻辑关系解释:
如果在白名单中--> whiteiplist=0 --> $limit="" --> 不会存储到 10m 的会话状态(one 或者 addr)中 --> 不受限制;
反之,不在白名单中 --> whiteiplist=1 --> $limit=二进制远程地址 -->存储进 10m 的会话状态中 --> 受到限制。
3.动手测试 DDOS 预防配置
下面我们就来测一下刚刚的配置是否起到了作用。
1.安装所有测试所需的软件(源码安装 nginx,apt 安装 php5-fpm,apt 安装 apach-u) 为了便于修改配置文件,这里选择源码安装 nginx:
wget http://labfile.oss.aliyuncs.com/nginx-1.7.9.tar.gz
接下来编译安装。
sudo apt-get install apache2-utils
sudo apt-get install php5-fpm
安装好以后 分别启动 php5 和 nginx。
2.写一个测试的 PHP 文件,修改 nginx 配置文件,使其能正常访问。
在/home/shiyanlou 目录下写一个 test.php,内容如下:

nginx 配置文件修改:


最后展示:

3.使用命令 ab 测试,修改配置文件前后(连接数和请求数分开测试)。
什么都没修改之前:
测试条件:

测试结果:

修改了配置文件图(记得重启 nginx)测试条件也要一样:


最后测试结果图:

(责任编辑:IT)
本文来源于实验楼Linux web运维(nginx)实战课程,原文链接:https://www.shiyanlou.com/courses/95, 对其进行总结回顾,如有侵权,私信删除。 1.什么是nginx
nginx是一款高性能的HTTP和反向代理服务器软件,下图是w3techs公布的全球网站服务器软件统计报告
![]() 2.为什么选择nginx Nginx 和 Apache 相同点:
Nginx的优势
Nginx由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互。Nginx的各种功能和操作都由模块来实现。Nginx的模块从结构上分为核心模块、基础模块和第三方模块。
这样的设计使Nginx方便开发和扩展,也正因此才使得Nginx功能如此强大。Nginx的模块默认编译进nginx中,如果需要增加或删除模块,需要重新编译Nginx,这一点不如Apache的动态加载模块方便。如果有需要动态加载模块,可以使用由淘宝网发起的web服务器Tengine,在nginx的基础上增加了很多高级特性,完全兼容Nginx,已被国内很多网站采用。
nginx 不会为每个连接派生进程或线程,而是由 worker 进程通过监听共享套接字接受新请求,并且使用高效的循环来处理数千个连接。Nginx 不使用仲裁器或分发器来分发连接,这个工作由操作系统内核机制完成。监听套接字在启动时就完成初始化,worker 进程通过这些套接字接受、读取请求和输出响应。
master:当 nginx 在启动后,会有一个 master 进程和多个 worker 进程。master进程主要用来管理worker进程,master 要做的就是:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。 主要完成如下工作:
worker:对于基本的网络事件,则是放在 worker 进程中来处理了。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求(一对一)。然而 nginx 没有专门地仲裁或连接分布的 worker,这项工作是由操作系统内核机制完成的。在启动时,创建一组初始的监听套接字,HTTP 请求和响应之时,worker 连续接收、读取和写入套接字。 worker 进程主要完成的任务包括:
既然 worker 进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供 80 端口的 http 服务时,一个连接请求过来,每个进程都有可能处理这个连接。那么问题来了,到底最后怎样处理,是由什么决定的呢?首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多个 worker 进程。所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程会在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,然后在读事件里调用 accept 接受该连接。当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求。产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到:一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。 也许你还有个疑问,那就是 nginx 采用多 worker 的方式来处理请求,每个 worker 里面只有一个主线程,那能够处理的并发数很有限啊,多少个 worker 就能处理多少个并发,何来高并发呢?然而,这就是 nginx 的高明之处,nginx 采用了异步非阻塞的方式来处理请求,也就是说,nginx 是可以同时处理成千上万个请求的。 异步的概念是和同步相对的,也就是不同事件之间不是同时发生的。非阻塞的概念是和阻塞对应的,阻塞是事件按顺序执行,每一事件都要等待上一事件的完成,而非阻塞是如果事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。
![]()
![]()
来使配置文件生效。 6.流量及并发连接数限制1)指令使用及配置修改我们需要在 http 的 server 中加一个 location,就好比之前我们做的简单的 echo 模块,格式为:
接下来就是调用命令实现流量限制。nginx 的模块中早就写好了对应的命令,我们只需要调用就好。 实现流量限制由两个指令 limit_rate 和 limit_rate_after 共同完成:
语法: limit_rate rate; 默认值: limit_rate 0; 作用域: http, server, location, if in location 命令概述:限制向客户端传送响应的速率限制。参数 rate 的单位是字节/秒,设置为 0 将关闭限速。 nginx 按连接限速,所以如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的 2 倍。
语法: limit_rate_after size; 默认值: limit_rate_after 0; 作用域:http, server, location, if in location 设置不限速传输的响应大小。当传输量大于此值时,超出部分将限速传送。 作用范围:http,server,location,if inlocation 要是想了解更多,这里有更加详细的命令信息http://wiki.nginx.org/HttpCoreModule#limit_rate 讲了要使用的指令 我们接下来就实战配置 这是小编实验时的配置(传输量限制为 3m,速率限制为 20k/s): ![]() (2)配置之前与配置之后的测试接下来就是测试
本机地址用 ifconfig 来查看 修改配置之前,速率没有限制: ![]() 修改配置之后,可见由于传输量大于 3m,超出部分的传输速率已经被限制在 20k/s: ![]() 也许你已经发现配置之后刚开始的时候传输速度很高,因为,传输量大于设定值的部分才会受到限制。这就说明,我们两个命令都发挥了作用,这也就完成了我们第一个实战。 2.实现并发连接数限制的具体配置(1)指令使用及配置文件修改这个的配置是基于 ngx_http_limit_zone_module 模块的,要简单完成并发限制,我们要涉及到 limit_conn_zone 和 limit_conn 这两个指令:
语法: limit_conn_zone zone_name $variable the_size 默认值: no 作用域: http 本指令定义了一个数据区,里面记录会话状态信息。 variable 定义判断会话的变量;the_size 定义记录区的总容量。
语法: limit_conn zone_name the_size 默认值: no 作用域: http, server, location 指定一个会话最大的并发连接数。 当超过指定的最发并发连接数时,服务器将返回 "Service unavailable" (503)。 配置示例:
7.访问控制及 DDOS 预防1.访问控制配置基于各种原因,我们要进行访问控制。比如说,一般网站的后台都不能让外部访问,所以要添加 IP 限制,通常只允许公司的 IP 访问。访问控制就是指只有符合条件的 IP 才能访问到这个网站的某个区域。 涉及模块:ngx_http_access_module 模块概述:允许限制某些 IP 地址的客户端访问。 对应指令:
语法: allow address | CIDR | unix: | all; 默认值: — 作用域: http, server, location, limit_except 允许某个 IP 或者某个 IP 段访问。如果指定 unix,那将允许 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
语法: deny address | CIDR | unix: | all; 默认值: — 作用域: http, server, location, limit_except 禁止某个 IP 或者一个 IP 段访问。如果指定 unix,那将禁止 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。 配置范例:
规则按照顺序依次检测,直到匹配到第一条规则。 在这个例子里,IPv4 的网络中只有 10.1.1.0/16 和 192.168.1.0/24 允许访问,但 192.168.1.1 除外;对于 IPv6 的网络,只有 2001:0db8::/32 允许访问。 ngx_http_access_module 配置允许的地址能访问,禁止的地址被拒绝。这只是很简单的访问控制,而在规则很多的情况下,使用 ngx_http_geo_module 模块变量更合适。这个模块大家下来可以了解 : ngx_http_geo_module 2.DDOS 预防配置DDOS 的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量。对于七层的应用攻击,我们还是可以做一些配置来防御的,使用 nginx 的 http_limit_conn 和 http_limit_req 模块通过限制连接数和请求数能相对有效的防御。 ngx_http_limit_conn_module 可以限制单个 IP 的连接数 ngx_http_limit_req_module 可以限制单个 IP 每秒请求数 配置方法: (1). 限制每秒请求数 涉及模块:ngx_http_limit_req_module 通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回 503 错误。 配置范例:
必要配置说明(上一部分解释过的就不再解释): $binary_remote_addr 二进制远程地址 rate=10r/s; 限制频率为每秒 10 个请求 burst=5 允许超过频率限制的请求数不多于 5 个,假设 1、2、3、4 秒请求为每秒 9 个,那么第 5 秒内请求 15 个是允许的;反之,如果第一秒内请求 15 个,会将 5 个请求放到第二秒,第二秒内超过 10 的请求直接 503,类似多秒内平均速率限制。 nodelay 超过的请求不被延迟处理,设置后 5(不延时)+10(延时)个请求在 1 秒内处理。(这只是理论数据,最多的情况) (2).限制 IP 连接数 上一章讲过,我们就直接写出来
(3).白名单设置 http_limit_conn 和 http_limit_req 模块限制了单 IP 单位时间内的连接和请求数,但是如果 Nginx 前面有 lvs 或者 haproxy 之类的负载均衡或者反向代理,nginx 获取的都是来自负载均衡的连接或请求,这时不应该限制负载均衡的连接和请求,就需要 geo 和 map 模块设置白名单:
geo 模块定义了一个默认值是 1 的变量 whiteiplist,当在 ip 在白名单中,变量 whiteiplist 的值为 0,反之为 1
如果在白名单中--> whiteiplist=0 --> $limit="" --> 不会存储到 10m 的会话状态(one 或者 addr)中 --> 不受限制; 反之,不在白名单中 --> whiteiplist=1 --> $limit=二进制远程地址 -->存储进 10m 的会话状态中 --> 受到限制。 3.动手测试 DDOS 预防配置下面我们就来测一下刚刚的配置是否起到了作用。 1.安装所有测试所需的软件(源码安装 nginx,apt 安装 php5-fpm,apt 安装 apach-u) 为了便于修改配置文件,这里选择源码安装 nginx:
接下来编译安装。
安装好以后 分别启动 php5 和 nginx。 2.写一个测试的 PHP 文件,修改 nginx 配置文件,使其能正常访问。 在/home/shiyanlou 目录下写一个 test.php,内容如下: ![]() nginx 配置文件修改: ![]() ![]() 最后展示: ![]() 3.使用命令 ab 测试,修改配置文件前后(连接数和请求数分开测试)。 什么都没修改之前: 测试条件: ![]() 测试结果: ![]() 修改了配置文件图(记得重启 nginx)测试条件也要一样: ![]() ![]() 最后测试结果图: ![]() (责任编辑:IT) |