当前位置: 首页 > 科技观察

原来这么简单

时间:2023-03-14 17:34:35 科技观察

Nginx是现在最流行的负载均衡器之一。面对流量激增的互联网,接口限流也是很有必要的,尤其是高并发场景。Nginx的限流主要有两种方式:限制访问频率和限制并发连接数。1.限制访问频率(正常流量)在Nginx中,我们使用ngx_http_limit_req_module模块来限制请求的访问频率,这是基于漏桶算法的原理实现的。接下来我们使用nginxlimit_req_zone和limit_req来限制单个IP的请求处理速率。语法:limit_req_zonekeyzoneratekey:定义限流对象,binary_remote_addr是一个key,表示根据remote_addr(客户端IP)做限流,binary_的目的是压缩内存占用。zone:定义一块共享内存区域,用于存储访问信息,myRateLimit:10m表示一块大小为10M的内存区域,名称为myRateLimit。1M可以存储16000个IP地址的访问信息,10M可以存储16W个IP地址的访问信息。rate用于设置最大访问速率,rate=10r/s表示每秒最多处理10个请求。Nginx实际上是以毫秒为粒度跟踪请求信息,所以10r/s实际上是极限:每100毫秒处理一个请求。这意味着如果在处理完最后一个请求后的100毫秒内有另一个请求到达,则该请求将被拒绝处理。2.限制访问频率(突发流量)根据上面的配置,当流量突然增加时,超出的请求会被拒绝,无法处理突发流量,那么突发流量怎么处理呢?Nginx提供了burst参数来解决突发流量的问题,它与nodelay参数配合使用。Burst译为burst和burst,表示超过设定的处理速率后,可以处理的额外请求数。burst=20nodelay表示这20个请求立即处理,不能延迟,相当于一个特例。但是,即使这20个突发请求被立即处理,后面的请求也不会被立即处理。burst=20相当于在缓存队列中占用了20个坑。即使处理了请求,这20个位置也只能每100ms释放一次。这样就达到了速率稳定,但是突发流量可以正常处理的效果。3.限制并发连接数。Nginx的ngx_http_limit_conn_module模块提供了限制资源连接数的功能。只需使用limit_conn_zone和limit_conn指令。limit_connperip20:对应的key为$binary_remote_addr,表示单个IP最多同时容纳20个连接。limit_connperserver100:对应的key为$server_name,表示虚拟主机(服务器)同时可以处理的并发连接总数。请注意,只有在请求头被后端服务器处理后才计算连接数。那么,以上的限流方法你都清楚了吗?