在当下互联网高并发时代中,项目往往会遇到需要限制客户端连接的需求。我们熟知的 Nginx 就提供了有这样的功能,可以简单的实现对客户端请求频率,并发连接和传输速度的限制….

Nginx 限流

Nginx为我们提供了请求限制模块(ngx_http_limit_req_module)、基于令牌桶算法的流量限制模块(ngx_stream_limit_conn_module),可以方便的控制令牌速率,自定义调节限流,实现基本的限流控制…

请求限制

请求限制的功能来自于 ngx_http_limit_req_module 模块。使用它需要首先在 http 配置段中定义限制的参照标准和状态缓存区大小。

limit_req_zone 只能配置在 http 范围内;

$binary_remote_addr 表示客户端请求的IP地址;

mylimit 自己定义的变量名;

rate 请求频率,每秒允许多少请求;

limit_req 与 limit_req_zone 对应,burst 表示缓存住的请求数,也就是任务队列。

下面的配置就是定义了使用客户端的 IP 作为参照依据,并使用一个 10M 大小的状态缓存区。结尾的 rate=1r/s 表示针对每个 IP 的请求每秒只接受一次。

10M 的状态缓存空间够不够用呢?官方给出的答案是 1M 的缓存空间可以在 32 位的系统中服务 3.2 万 IP 地址,在 64 位的系统中可以服务 1.6 万 IP 地址,所以需要自己看情况调整。如果状态缓存耗光,后面所有的请求都会收到 503(Service Temporarily Unavailable) 错误。

脚本代码

123456789101112
# 定义了一个 mylimit 缓冲区(容器),请求频率为每秒 1 个请求(nr/s)limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;server {   listen  70;   location / { # nodelay 不延迟处理 # burst 是配置超额处理,可简单理解为队列机制 # 上面配置同一个 IP 没秒只能发送一次请求(1r/s),这里配置了缓存3个请求,就意味着同一秒内只能允许 4 个任务响应成功,其它任务请求则失败(503错误) limit_req zone=mylimit burst=3 nodelay; proxy_pass http://localhost:7070; }}

测试代码

为了方便此处提供 JAVA、AB 两种测试代码..

123
# -n 即指定压力测试总共的执行次数# -c 即指定的并发数ab -n 5 -c 5 http://192.168.0.133:70/index
123456789101112131415161718192021222324252627
package com.battcn.limiting;

import org.springframework.http.ResponseEntity;import org.springframework.web.client.RestTemplate;

import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;

/** * @author Levin * @since 2018/7/27 0027 */public class NginxLimiterTest {

 public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService service = Executors.newFixedThreadPool(5); for (int i = 0; i < 6; i++) { CompletableFuture.supplyAsync(() -> { final ResponseEntity<String> entity = new RestTemplate().getForEntity("http://192.168.0.133:70/index", String.class); return entity.getBody(); }, service).thenAccept(System.out::println); } service.shutdown(); }}

测试日志

此处提供 AB 测试结果 JAVA 的日志就不贴了,5个请求其中一个请求是有问题的,出问题的那个就是被拒绝请求的…

123456789
[root@localhost myconf]# ab -n 5 -c 5 http://192.168.0.133:70/indexDocument Path:          /indexDocument Length:        34 bytes

Concurrency Level: 5Time taken for tests: 0.002 secondsComplete requests: 5Failed requests: 1 (Connect: 0, Receive: 0, Length: 1, Exceptions: 0)

并发限制

Nginx 并发限制的功能来自于 ngx_http_limit_conn_module 模块,跟请求配置一样,使用它之前,需要先定义参照标准和状态缓存区。

limit_conn_zone 只能配置在 http 范围内;

$binary_remote_addr 表示客户端请求的IP地址;

myconn 自己定义的变量名(缓冲区);

limit_rate 限制传输速度

limit_conn 与 limit_conn_zone 对应,限制网络连接数

下面的配置就是定义了使用客户端的 IP 作为参照依据,并使用一个 10M 大小的状态缓存区。限定了每个IP只允许建立一个请求连接,同时传输的速度最大为 1024KB

脚本代码

123456789101112
# 定义了一个 myconn 缓冲区(容器)limit_conn_zone $binary_remote_addr zone=myconn:10m;server {    listen  70;   location / { # 每个 IP 只允许一个连接 limit_conn myconn 1; # 限制传输速度(如果有N个并发连接,则是 N * limit_rate) limit_rate 1024k; proxy_pass http://localhost:7070; }}

说点什么

请求限流方面自己写一个简单的 Spring Boot 程序部署到服务器配置好 Nginx 映射即可,并发限流弄一个大文件下载,或者让自己服务接口在内部休眠一定时间就能测试出效果….

参考文献

  • ngx_http_limit_req_module http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
  • ngx_http_limit_conn_module http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
  • ngx_http_core_module http://nginx.org/en/docs/http/ngx_http_core_module.html

转载于:https://www.cnblogs.com/lywJ/p/10715674.html

利用 Nginx 实现限流相关推荐

  1. Nginx:限流、缓存、黑白名单等功能详解!

    Nginx应该是现在最火的web和反向代理服务器,没有之一.她是一款诞生于俄罗斯的高性能web服务器,尤其在高并发情况下,相较Apache,有优异的表现.那除了负载均衡,它还有什么其他的用途呢,具体如 ...

  2. Nginx如何限流?

    作者 | 雪山上的蒲公英 来源 | https://www.cnblogs.com/zjfjava/p/10947264.html 流量限制(rate-limiting),是Nginx中一个非常实用, ...

  3. nginx的限流配置

    本文来说下nginx的限流配置 文章目录 概述 Nginx如何限流 配置基本的限流 处理突发 无延迟的排队 高级配置示例 location包含多limit_req指令 配置相关功能 发送到客户端的错误 ...

  4. Nginx配置限流限连接示例及相关知识汇总

    目录 *Nginx与Tomcat配置 Nginx初始化限流20MB 模板一 模板二 模板三 *Nginx文件上传设置 5MB 10MB 15MB 18MB *Nginx高频接口配置[登录.实时位置.通 ...

  5. 怎么样通过Nginx实现限流?

    作者 | 雪山上的蒲公英 来源 | https://www.cnblogs.com/zjfjava/p/10947264.html 流量限制(rate-limiting),是Nginx中一个非常实用, ...

  6. OpenResty(nginx)限流配置实现

    一般情况下,首页的并发量是比较大的,即使有了多级缓存,如果有大量恶意的请求,也会对系统造成影响.而限流就是保护措施之一. nginx提供两种限流的方式: 一是控制速率 二是控制并发连接数 控制速率 控 ...

  7. Java限流之 —— Sentinel初识

    前言 在之前的篇章中,我们聊到了限流的常用解决方案,基于限流衍生出了一些适合在并发场景下的解决方案,常用的像单机模式下的guawa限流,基于原生的限流算法如漏桶.令牌桶等封装出限流逻辑,redis+l ...

  8. 除了负载均衡,Nginx 还可以做很多:限流、缓存、黑白名单等

    Nginx应该是现在最火的web和反向代理服务器,没有之一.她是一款诞生于俄罗斯的高性能web服务器,尤其在高并发情况下,相较Apache,有优异的表现. 那除了负载均衡,她还有什么其他的用途呢,下面 ...

  9. 除了负载均衡,Nginx还可以做很多,限流、缓存、黑白名单等

    点击上方"朱小厮的博客",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/JY7SVlZf Nginx应该是现在最火的web和 ...

  10. nginx限流健康检查

    Nginx原生限流模块: ngx_http_limit_conn_module模块 根据前端请求域名或ip生成一个key,对于每个key对应的网络连接数进行限制. 配置如下: http模块 serve ...

最新文章

  1. python连接oracle
  2. 一些VR延迟优化方法
  3. selenium自学笔记---ecshop购买脚本 xpath定位元素(下拉框,单选框)
  4. 【Qt】Qt5.12连接MySQl5.7(亲自测试成功)
  5. 判别Linux是CentOs还是Ubuntu的最简单方法
  6. flutter 图解_【Flutter 专题】83 图解自定义 ACEWave 波浪 Widget (一)
  7. PAT乙级(1024 科学计数法)
  8. record.php play.php,record.php
  9. 使用和执行SQL Server Integration Services包的方法
  10. Python进阶(三)单例设计模式
  11. php中paynotify,PayNotifyValidator.php
  12. 如何测一个纸杯_阿薇塔罗——4个吊坠,凭直觉选一个,测你这辈子婚姻状况如何?...
  13. ISO27001认证适用领域及认证流程
  14. CCPC-wannafly Camp Day2 讲课内容总结(杜瑜皓-数据结构)
  15. 期权、期货及其他衍生品 Chapter14 维纳过程与伊藤引理
  16. PHP最高权限的获取
  17. 【C++】优先级队列priority_queue模拟实现仿函数
  18. 如何在 Python 绘图中正常显示中文?(视频教程)
  19. Torch中的benchmarkdeterministic是什么含义?
  20. 信道与信道容量(一)

热门文章

  1. Github使用技巧
  2. mysql存儲過程返回值_java如何获得mysql存储过程的返回值
  3. ICMPv6报文详解
  4. MySQL主从同步(一)——原理详解
  5. 自定义ArrayStack
  6. ubuntu18.04 下安装搜狗输入法
  7. 实时计算在天猫双十一大屏中的应用
  8. 数据库管理工具 Navicat使用教程:导航窗格提示和技巧 - 管理连接
  9. PHP的XML Parser(转)
  10. 推荐:用ogr和PIL把矢量数据转化成栅格图像