nginx限流

您所在的位置:网站首页 天翼云盘限流吗 nginx限流

nginx限流

2024-03-09 12:15| 来源: 网络整理| 查看: 265

1. 简介

Nginx 的限流主要是两种方式:限制访问频率和限制并发连接数。

Nginx 按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。

Nginx 官方版本限制 IP 的连接和并发分别有两个模块:

1、limit_req_zone:用来限制单位时间内的请求数,即速率限制。

2、limit_conn_zone:用来限制同一时间连接数,即并发限制。

 

2. limit_req_zone

该模块可以设置对于某个请求 URI 的请求频率限制。这种方式旨在防止大量请求打到后端服务导致负载过高,从而提高网站稳定性和可靠性。

使用语法:limit_req_zone key zone rate

示例:limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=10r/s;

key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。

zone:定义共享内存区来存储访问信息, zone=myRateLimit:10m 表示一个大小为 10M,名字为 myRateLimit 的内存区域。1M 能存储 16000 IP 地址的访问信息,10M 可以存储 16W IP 地址访问信息。

rate: 用于设置最大访问速率,rate=10r/s 表示每秒最多处理 10 个请求。

注:Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每 100 毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续 100 毫秒内又有请求到达,将拒绝处理该请求。

 

使用语法:limit_req zone burst [nodelay]

limit_req zone=myRateLimit burst=5 nodelay;

zone:设置使用哪个配置区域来做限制,与上面 limit_req_zone 里的name对应。

burst=5,设置一个大小为5的缓冲区,当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。

nodelay,如果设置了该参数,超过访问频次 且 缓冲区也满了 时,拒绝并返回503,如果没有设置,则所有请求会等待排队。

limit_req_log_level info [notice | warn | error]; 日志级别设置,默认为error,一般使用默认即可。

limit_req_status code; 设置拒绝请求的返回值,默认为503,只能设置 400 到 599 之间。

 

速率限制实例:

http {    # 定义限流策略    limit_req_zone $binary_remote_addr zone=rateLimit:10m rate=1r/s;    # 搜索服务的虚拟主机    server {        location / {            # 使用限流策略            limit_req zone=rateLimit burst=5 nodelay;            proxy_pass https://www.baidu.com;        }    }}

测试结果:

20个成功6个,这是因为1r/s +(burst=5)。

取消burst再次测试,只成功1个,因为1r/s

在原配置基础上修改rate为10r/s,成功15个=10r/s+(burst=5)。

失败的状态码为503

3. limit_conn_zone

该模块可以设置对于某个请求 URI 的并发连接数限制。这种方式旨在防止某些请求占用过多连接资源,导致其他请求无法正常处理。

使用语法:limit_conn_zone key zone

key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。

zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为 10M,名字为 myRateLimit 的内存区域。

 

limit_conn_log_level info [notice | warn | error]; 日志级别设置,默认为error,一般使用默认即可。

limit_conn_status code; 设置拒绝请求的返回值,默认为503,只能设置 400 到 599 之间。

并发限制实例

http {    # 定义并发限制策略    limit_conn_zone $binary_remote_addr zone=perip:10m;    limit_conn_zone $server_name zone=perserver:10m;    # 搜索服务的虚拟主机    server {        location / {            # 对应的 key 是 $binary_remote_addr,表示限制单个 IP 同时最多能持有 1 个连接。            limit_conn perip 1;            # 对应的 key 是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。注意,只有当 request header 被后端 server 处理后,这个连接才进行计数。            limit_conn perserver 10;            proxy_pass https://www.baidu.com;        }    }}

 

50个样本只成功1个,因为单个IP最多同时能持有1个连接。

删除单个IP持有连接限制,测试server的并发限制。

可以看到成功10个,与server最大并发连接10个相同。

并发连接失败的状态码也是默认的503。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3