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;
}
}