Nginx之客户并发数限制解读

简介: Nginx之客户并发数限制解读

基本介绍

在我们进行系统开发设计中,要考虑服务器流量异常,负载过大等问题。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制。

nginx可以通过limit_conn_zone 和limit_req_zone两个组件来对客户端访问目录和文件的访问频率和次数进行限制,另外还可以善用进行服务安全加固,两个模块都能够对客户端访问进行限制,具体如何使用要结合公司业务环境进行配置。

配置指令

limit_conn_zone

 # 语法配置
 Syntax: limit_conn_zone key zone=name:size;
 Default:    —
 Context:    http
 # 示例
 limit_conn_zone $binary_remote_addr zone=addr:10m;
  • limit_conn_zone只能够在http块中使用
  • key就是用来判定连接数的变量,这个变量可以是文本、变量或它们的组合,例如我们可以使用IP地址+cookie等其他复杂的组合来更精确地限定范围
  • name就是这个zone的命名,经过实测name需要全局唯一,不可以和其他的limit_conn_zone的相同,毕竟后面的limit_conn命令需要根据这个name来查找对应的zone进行相应限制规则的匹配
  • size定义了这个zone的大小,也就是nginx会在内存中开辟多大的空间来存储这个zone的相关信息,主要和前面定义的key的大小有关系,需要注意的是,当内存大小耗尽的时候,nginx会直接返回错误码limit_conn_status给后续的请求

limit_conn

 # 语法配置
 Syntax: limit_conn zone number;
 Default:    —
 Context:    http, server, location
 # 示例
 limit_conn_zone $binary_remote_addr zone=addr:10m;
 server {
     location /download/ {
         limit_conn addr 1;
     }
  • limit_conn能在httpserverlocation三个块中使用,但是需要注意的是要搭配前面提及的limit_conn_zone
  • limit_conn指令的变量只有zonenumber两个
  • 其中zone就是前面的limit_conn_zone中的name变量,也就是对应着全局唯一的zone,负责确定限制连接数的依据
  • 其中number就是限制的连接数,zone和number组合就可以完成连接数的限定功能,注意这里的number必须使用数字而不能使用变量

其他

limit_rate

limit_rate 指令是用来操控发送至客户端的数据传输速度的,它可以约束整个衔接的流量,也可以约束单个客户端拜访速度。

Syntax:limit_rate rate;
Default:limit_rate 0;
Context:http, server, location, if in location

限制发向客户端响应的数据的速率。单位是BYTES每秒。默认值0表示不进行速率限制。此限制是针对每一个连接请求而言的,所以,如果客户端同时有并行的n个连接,那么这个客户端的整体速率就是n倍的limit_rate。

limit_rate 1k;

limit_rate_after

在传输完一定数量的BYTES之后设开始实施带宽控制。与指令limit_rate一样,后面的参数数值可以通过变量来设置。

Syntax:limit_rate_after size;
Default:limit_rate_after 0;
Context:http, server, location, if in location

指令limit_rate_after只有在配置了limit_rate的前提下才能生效。如果只配置limit_rate_after则不会有带宽控制的效果。

location /test/ {
limit_rate_after 500k;
limit_rate 50k;
}

如果同时配置了sendfile_max_chunk 指令,按照两者较小的数值进行带宽控制。

limit_req_zone

定义一个以IP为限制请求的方式,名字为req_limit_zone,开辟10M的共享内存区域,每秒处理的速率为10个请求

limit_req_zone $binary_remote_addr zone=req_limit_zone:10m rate=10r/s;

说明 :limit_req_zone指令通常在 HTTP 块中定义,使其可在多个上下文中使用,它需要以下三个参数:

  •    key - 定义应用限制的请求特性。示例中使用的是 Nginx 嵌入变量binary_remote_addr(二进制客户端地址)
  •    zone - 定义用于存储每个 IP 地址状态以及被限制请求 URL 访问频率的共享内存区域。保存在内存共享区域的信息,意味着可以在 Nginx 的 worker 进程之间共享。定义分为两个部分:通过zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000 个 IP 地址的状态信息,大约需要 1MB,所以示例中区域可以存储 160000 个 IP 地址。
  •    rate - 定义最大请求速率。在示例中,速率不能超过每秒 10 个请求。Nginx 实际上以毫秒的粒度来跟踪请求,所以速率限制相当于每 100 毫秒 1 个请求。因为不允许”突发情况”,这意味着在距离前一个请求 100 毫秒内到达的请求将被拒绝。
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
    location /login/ {
        limit_req zone=mylimit;
        proxy_pass http://my_upstream;
    }
}

limit_req

limit_req指令来将其限制应用于特定location或server块。

limit_req zone=req_limit_zone burst=10 nodelay;
  • limit_req zone=req_limit_zone; 每个 IP 地址被限制为每秒只能请求 10 次 URL,更准确地说,在距离前一个请求的 100 毫秒内不能请求该 URL。
  • limit_req zone=req_limit_zone burst=10; burst 参数定义了超出 req_limit_zone指定速率的情况下(示例中的 req_limit_zone区域,速率限制在每秒 10 个请求,或每 100 毫秒一个请求),客户端还能发起多少请求。距离上一个请求 100 毫秒内到达的请求将会被放入队列,我们将队列大小设置为 10。

也就是说,如果从一个给定 IP 地址发送 11 个请求,Nginx 会立即将第一个请求发送到上游服务器群,然后将余下 10 个请求放在队列中。然后每 100 毫秒转发一个排队的请求,只有当传入请求使队列中排队的请求数超过 10 时,Nginx 才会向客户端返回503。

  • limit_req zone=req_limit_zone burst=10 nodelay;  使用 nodelay 参数,可以实现无延迟的排队;Nginx 仍将根据 burst 参数分配队列中的位置,当一个请求到达时,只要在队列中能分配位置,Nginx 将立即转发这个请求。将队列中的该位置标记为”taken”(占据),并且不会被释放以供另一个请求使用,直到一段时间后才会被释放(在这个示例中是,100 毫秒后)。
limit_req zone=name [burst=number] [nodelay | delay=number];
location /login/ {
    limit_req zone=mylimit burst=20 nodelay;
    proxy_pass http://my_upstream;
}
  • 上面这段配置中我们设置了burst=20,该配置定义了客户端可以超过区域指定速率的请求数(对于我们前面定义的mylimit区域,请求速率限制为每秒 10 个请求即每 100 毫秒 1 个)。在前一个请求之后 100 毫秒内到达的请求会被放入到队列中,这里我们将队列大小设置为 20。
  • 说如果有22个请求同时发送过来,那么NGINX会马上把第1个请求根据相关规则转发给upstream服务器,然后把接下来的第2到21共计20个请求放入队列中,接着直接返回503代码给第22个请求,随后的2秒时间内,每100毫秒从队列中取出一个请求发送给upstream服务器进行处理。
相关文章
|
缓存 运维 监控
面试官:Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?
Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?Nginx常见的优化手段有哪些?502错误可能原因有哪些??
241 0
面试官:Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?
|
域名解析 负载均衡 架构师
Nginx极简入门(六)配置Nginx负载均衡,提高系统并发性能!
前面讲了如何配置Nginx虚拟主机、如何配置反向代理。Nginx最主要的功能就是反向代理和负载均衡。今天要说的是如何配置nginx和tomcat实现反向代理。
Nginx极简入门(六)配置Nginx负载均衡,提高系统并发性能!
|
网络协议 Unix 应用服务中间件
Nginx极简实战—Nginx服务器高性能优化配置,轻松实现10万并发访问量
如何使Nginx轻松实现10万并发访问量。通常来说,一个正常的 Nginx Linux 服务器可以达到 500,000 – 600,000 次/秒 的请求处理性能,如果Nginx服务器经过优化的话,则可以稳定地达到 904,000 次/秒 的处理性能,大大提高Nginx的并发访问量。
Nginx极简实战—Nginx服务器高性能优化配置,轻松实现10万并发访问量
|
6月前
|
安全 应用服务中间件 API
互联网并发与安全系列教程(14) - 基于Nginx实现API网关
互联网并发与安全系列教程(14) - 基于Nginx实现API网关
49 0
|
6月前
|
应用服务中间件 Linux nginx
linux nginx域名证书到期,拿着客户给的新证书文件在nginx中对证书进行替换
业务场景: 📕1.找到原证书位置,可在nginx 配置文件中查找到 🖥️2.找到位置后将原文件名字 加上.old (需要更换两个文件 一个.pem 一个.key) 🔖3.将新证书文件放在原目录,并重命名为原证书文件名称 📌4.cd到sbin目录 reload nginx 📇5.查询是否替换成功 🧣6、最后的话 业务场景: 域名证书到期,拿着客户给的新证书文件在nginx中对证书进行替换
163 0
|
12月前
|
监控 负载均衡 算法
Nginx底层原理:一文解析Nginx为什么并发数可以达到3w!
Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 Nginx 为什么这么快!
|
12月前
|
监控 Cloud Native 网络协议
《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——1 某客户nginx ingress偶发性出现4xx or 5xx(上)
《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——1 某客户nginx ingress偶发性出现4xx or 5xx(上)
|
12月前
|
Cloud Native Java 应用服务中间件
《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——1 某客户nginx ingress偶发性出现4xx or 5xx(下)
《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——1. 某客户nginx ingress偶发性出现4xx or 5xx(下)
|
存储 网络协议 应用服务中间件
Nginx限制并发连接和并发请求数配置
Nginx限制并发连接和并发请求数配置
711 0
|
缓存 监控 算法
nginx并发怎么看?负载怎么看?
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
nginx并发怎么看?负载怎么看?