Nginx(二)限流
一、Nginx 限流
-
什么是限流
限度客户端的申请数达到服务器就是限流。
-
条件
- nginx 服务器
- 我的项目实例【以查问商品为例,启动两个实例,端口:5000\5001】
- 应用 jemter 压测
-
Nginx 实现限流
-
条件
-
限流定义
# 命令 主机名称变量 限流的空间用来存储申请量的 limit_conn_zone $server_name zone=perserver:10m;
-
应用限流 在反向代理中增加配置
limit_conn perserver 1; #只容许一条申请到这个反向代理服务器
nginx.conf 整体配置代码如下:
-
worker_processes 1; events {worker_connections 1024;} http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #限流定义 limit_conn_zone $server_name zone=perserver:10m; server { listen 80; server_name localhost; error_page 500 502 503 504 /50x.html; location = /50x.html {root html;} #代理 location / { limit_conn perserver 1; proxy_pass http://Demo.Application; } } #负载平衡(分流配置)upstream Demo.Application{ least_conn; server localhost:5000; server localhost:5001; } }
-
-
我的项目我的项目实例
-
新建控制器
代码如下:
[Route("api/[controller]")] [ApiController] public class ProductController : ControllerBase { /// <summary> /// 获取商品数据 /// </summary> /// <returns></returns> [HttpGet] public IActionResult Get() {List<Product> list = new List<Product>() {new Product(){ Name="手机", Price = 1000 }, new Product(){ Name="笔记本电脑", Price = 5000 }, new Product() { Name="电视机", Price = 5000 } }; System.Console.WriteLine("查问商品"); return Ok(list); } }
新建一个 实体数据模型,代码如下:
public class Product { /// <summary> /// 主键 /// </summary> public Guid Id {get; set;} = Guid.NewGuid(); /// <summary> /// 名称 /// </summary> public string Name {get; set;} /// <summary> /// 价格 /// </summary> public decimal Price {get; set;} }
启动两个实例(5000/5001),如图:
[外链图片转存失败, 源站可能有防盗链机制, 倡议将图片
启动 nginx,命令如下:nginx.exe
-
-
- Jmter 工具
链接:https://pan.baidu.com/s/1chveNMju5jv5kOYvR8DL1A
提取码:h0gg
-
限流原理
-
限流原理图
当客户端发送申请到 nginx 服务其中,nginx 会将申请存储到 10m 的空间中,同时反向代理依据限流的配置,到空间中取并发申请,在调用代理解决并发申请;同时这中央有几个解决申请的状态:解决中,解决胜利和解决失败;解决中:后端代理还没有解决实现从空间取的并发申请,则会将请客户端发送过去的申请,全副回绝返回;
解决实现:后端代理曾经实现从空间取的并发申请,则再到空间中取并发申请,再交给后端代理解决申请;
执行完 Jemter 的后果如下:
比方以查问商品为例,当客户端发送申请到 nginx 中,nginx 会将申请存储到空间中,反向代理会依据限量配置数量(例如:配置的并发量为:2)到空间中取 2 个并发的申请,交给代理服务器解决申请,同时反向代理再会到空间中取 2 个并发的申请,交给代理服务器,如果代理服务上一次的申请没有解决实现,则会将该取 2 个的申请回绝返回;同时反向代理再会到空间中取 2 个并发的申请,如果第一次的申请解决实现 1 个,则会将从空间取的 2 个申请中取 1 个交个代理服务解决,另一个回绝返回;同时反向代理再会到空间中取 2 个并发的申请,如果第一次的申请解决实现,则会将取 2 个并发申请再交给代理服务器解决,……… 直到解决实现。用计数器的算法来实现的。
缺点:
-
可能导致失常的客户端不能应用 解决方案:用客户端限流
长处:
- 节约资源
-
-
-
客户端限流
-
条件
- 定义客户端限流
limit_conn_zone $binary_remote_addr zone=perserver:10m;
- 应用限流
limit_conn perserver 1;
-
原理
执行原理和限流的基本上原理一样。
-
-
平滑限流
-
条件
-
定义平滑限流
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #rate:速率 1 秒钟取 1 个,剩下的申请全副回绝返回
-
应用平滑限流
limit_req zone=one burst=3 nodelay; #burst : 突发 nodelay 突发: 延时 加上 nodelay 突发的申请不须要 Token
二、Nginx Https
-
-
-
配置 HTTPS
-
条件
-
配置虚拟主机
http{ server { listen 4425 ssl; server_name localhost; ssl_certificate #证书文件门路 ssl_certificate_key #证书文件门路 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; location / {proxy_pass http://Demo.Application;} } }
-
重定向
# 在 http 模块中增加重定向配置 server{if ($scheme =http){return 301 https://$host:4435$request_uri;} }
-
-