nginx的限流和网关gatway限流详解

 更新时间:2024年08月13日 17:10:42   作者:咕噜咕噜da  
这篇文章主要介绍了nginx的限流和网关gatway限流,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.场景描述

例如网站首页采取二级缓存操作,减少对数据库和redis的压力,但是遇到恶意请求还是不能有效的缓解压力,限流就能起到保护措施的作用了

2.nginx限流

nginx提供了两种限流方案:

  • 控制请求速率
  • 控制并发连接数

3.控制速率

nginx常用控制速率的方式之一就是采用漏桶算法

3.1漏桶算法实现控制速率限流

概述:漏桶算法思想就是水(请求)滴入漏桶漏桶里,漏桶以一定速率出水(响应速率),当水滴入的速率过大时会溢出漏桶(访问速率大于响应速率),然后就拒绝请求,漏桶算法能强转限制数据的传输速率

配置示例

在nginx的nginx.conf配置文件

http{
limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;
...
	server{
		...
			location / {
			  limit_req zone=myRateLimit; burst=5; 
			 }
		 }
	}
}

具体配置示例

修改/usr/local/openresty/nginx/conf/nginx.conf:

#user nobody; 
user root root; 
worker_processes 1;
 #error_log logs/error.log; 
 #error_log logs/error.log notice; 
 #error_log logs/error.log info;
 #pid logs/nginx.pid; 
 events { 
 	worker_connections 1024; 
 }
 http {
 include mime.types; 
 default_type application/octet‐stream; 
 #log_format main '$remote_addr ‐ $remote_user [$time_local] "$request" ' 
 # '$status $body_bytes_sent "$http_referer" ' 
 # '"$http_user_agent" "$http_x_forwarded_for"'; 
 #access_log logs/access.log main; sendfile on; 
 #tcp_nopush on; #keepalive_timeout 0; 
 keepalive_timeout 65; 
 #gzip on; 
 limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s; 
 server { 
 	listen 8081;
 	server_name localhost; 
 	charset utf‐8; 
 	location / { 
 		limit_req zone=myRateLimit; 
 		root html; 
 		index index.html index.htm; 
 	} 
	} 
}

需要关注以下配置

limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s; 
server { 
	listen 8081;
	server_name localhost; 
	charset utf‐8; 
	location / { 
	limit_req zone=myRateLimit; 
	root html; 
	index index.html index.htm; 
	} 
} 
}

说明:

  • 1.binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流
  • 2.zone=myRateLimit:10m :表示能存储的访问IP的地址,1M能存储16000ip地址的访问信息,10M可以存储16W IP地址访问信息
  • 3.rate用于设置最大访问速率,rate=2r/s 表示每秒能处理2个请求,也就是每500毫秒处理一次请求,若1s内再有请求就会被拒绝
  • 4.location /:拦截的请求,表示location下所有的请求

3.2突发性限流

场景:当正常流量突然增大,超出的请求将被拒绝,无法处理突发流量,可以结合burst参数

server { 
location / {
 limit_req zone=myRateLimit burst=5; 
 root html; 
 index index.html index.htm; 
 } 
 }

burst: 会将超出的5个请求放入队列中,按照处理速率处理,会一个个进行处理.

但是会造成请求的等待时间过长,为了解决这个问题,可以加关键字 nodelay,就会一次性的处理这些请求如

server { 
location / {
 limit_req zone=myRateLimit burst=5  nodelay; 
 root html; 
 index index.html index.htm; 
 } 
 }

nginx实现限流的总结

nginx限流采用的算法是漏桶算法,水滴入到漏桶中,再按一定速率流出,当滴入的速率大于流出的速率,就会水溢出,也就是请求速率大于处理速率的时候就会拒绝请求。

具体的做法是 在nginx.conf文件中 配置rate 处理速率,配置漏桶能存储的最大存储量,1m能存储16000个IP地址的访问信息 

burst: nodelay 能处理突发性请求

网关gatway实现限流

使用场景:限制客户端访问服务端微服务的流量

gatway是采用令牌桶算法实现限流的,配置加入令牌的速率,和令牌桶能放入的最大令牌数量,只有请求获得了令牌才能访问,没有获得令牌就会拒绝访问,令牌桶算法是基于redis实现的,默认使用redis的RateLimter限流算法实现的

具体步骤:

  • 1.添加依赖
  • 2.在启动类中定义方法返回对象 KeyResolver
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }

    /**
     * 通过KeyResolver来指定限流的Key
     * @return
     */
    @Bean
    public KeyResolver ipKeyResolver() {
        return new KeyResolver() {
            @Override
            public Mono<String> resolve(ServerWebExchange exchange) {
                return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
            }
        };
    }
}
  • 3.在配置中声明令牌产生的速率,令牌桶的大小
 filters:
            - StripPrefix= 1
            - name: RequestRateLimiter #请求数限流 名字不能随便写
              args:
                key-resolver: "#{@ipKeyResolver}"
                redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率
                redis-rate-limiter.burstCapacity: 1 #令牌桶总容量

步骤总结

首先引入依赖,在springboot启动类中,指定限流的限流指标,通过@Bean交由IOC管理,例如声明一个ipKeyResolver,以ip作为限流的指标。

在配置文件中,配置令牌桶每秒填充的速率和令牌桶总容量,限流的指标。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Nginx配置前端http缓存的实现

    Nginx配置前端http缓存的实现

    本文介绍了使用Nginx配置前端HTTP缓存,通过合理配置缓存策略,可以有效地提升前端资源的加载速度,减少服务器负载,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • 使用systemctl方式管理nginx方式

    使用systemctl方式管理nginx方式

    这篇文章主要介绍了使用systemctl方式管理nginx方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • 详解如何设置Nginx实现内外网端口映射

    详解如何设置Nginx实现内外网端口映射

    在 Nginx 中实现内外网端口映射是一种常见的做法,本文详细介绍如何设置 Nginx 实现内外网端口映射,有需要的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • 基于Nginx禁止指定IP、国外IP访问我的网站

    基于Nginx禁止指定IP、国外IP访问我的网站

    这篇文章主要介绍了用Nginx禁止指定IP、国外IP访问我的网站,想要实现这个功能方法有很多种,这里基于 Nginx 的 ngx_http_geoip2 模块来禁止国外 IP 访问网站,需要的朋友可以参考下
    2022-05-05
  • Web技术与Nginx网站环境部署教程

    Web技术与Nginx网站环境部署教程

    这篇文章主要介绍了Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • nginx刷新页面出现404解决方案(亲测有效)

    nginx刷新页面出现404解决方案(亲测有效)

    本文主要介绍了nginx刷新页面出现404解决方案,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • nginx反向代理时如何保持长连接

    nginx反向代理时如何保持长连接

    如果我们使用了nginx去作为反向代理或者负载均衡,从客户端过来的长连接请求就会被转换成短连接发送给服务器端。为了支持长连接,我们需要在nginx服务器上做一些配置。
    2020-10-10
  • Nginx大并发优化实战

    Nginx大并发优化实战

    这篇文章主要介绍了Nginx大并发优化实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南

    详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南

    Nginx是一种服务器软件,也是一种高性能的http和反向代理服务器,本篇文章主要介绍了Nginx + Tomcat 反向代理 负载均衡 集群 部署指南,有兴趣的可以了解一下。
    2016-12-12
  • Nginx配置文件提权的实战指南

    Nginx配置文件提权的实战指南

    在现代 Linux 系统中,nginx 通常作为 Web 服务的核心组件运行,其支持的模块化配置、灵活的路径设置以及多样的文件解析能力,本文结合一次真实场景,给大家介绍如何通过配置文件完成提权操作进行深入剖析,需要的朋友可以参考下
    2025-09-09

最新评论