nginx限流 |
您所在的位置:网站首页 › 天翼云盘限流吗 › nginx限流 |
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 |