写点什么

Nginx 反向代理(二)

作者:@@神农
  • 2022 年 3 月 15 日
  • 本文字数:2692 字

    阅读完需:约 9 分钟

一、Nginx 限流

  1. 什么是限流

  2. 限制客户端的请求数到达服务器就是限流。

  3. 条件

  4. nginx 服务器

  5. 项目实例【以查询商品为例,启动两个实例 ,端口:5000\5001】

  6. 使用 jemter 压测

  7. Nginx 实现限流

  8. 条件

  9. 限流定义


          # 命令           主机名称变量  限流的空间用来存储请求量的           limit_conn_zone $server_name zone=perserver:10m;
复制代码


   2. 使用限流  在反向代理中添加配置    
复制代码


          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),如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片![在这里插入图片描述](https://img-blog.csdnimg.cn/71e3a0bb9522489d93bb2aa59add260f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
复制代码



启动 nginx ,命令如下:


       nginx.exe
复制代码



 - Jmter工具 
链接:https://pan.baidu.com/s/1chveNMju5jv5kOYvR8DL1A 提取码:h0gg
复制代码
  1. 限流原理

  2. 限流原理


当客户端发送请求到 nginx 服务其中,nginx 会将请求存储到 10m 的空间中,同时反向代理根据限流的配置,到空间中取并发请求,在调用代理处理并发请求;同时这地方有几个处理请求的状态:处理中,处理成功和处理失败;处理中:后端代理还没有处理完成从空间取的并发请求,则会将请客户端发送过来的请求,全部拒绝返回;

处理完成:后端代理已经完成从空间取的并发请求,则再到空间中取并发请求,再交给后端代理处理请求;


执行完 Jemter 的结果如下:



比如以查询商品为例,当客户端发送请求到 nginx 中,nginx 会将请求存储到空间中,反向代理会根据限量配置数量(例如:配置的并发量为:2)到空间中取 2 个并发的请求,交给代理服务器处理请求,同时反向代理再会到空间中取 2 个并发的请求,交给代理服务器,如果代理服务上一次的请求没有处理完成,则会将该取 2 个的请求拒绝返回;同时反向代理再会到空间中取 2 个并发的请求,如果第一次的请求处理完成 1 个,则会将从空间取的 2 个请求中取 1 个交个代理服务处理,另一个拒绝返回;同时反向代理再会到空间中取 2 个并发的请求,如果第一次的请求处理完成,则会将取 2 个并发请求再交给代理服务器处理,......... 直到处理完成。

用计数器的算法来实现的。


缺陷:


  • 可能导致正常的客户端不能使用 解决方案:用客户端限流


优点:


  • 节约资源


  1. 客户端限流

  2. 条件

  3. 定义客户端限流


         limit_conn_zone $binary_remote_addr zone=perserver:10m;
复制代码


 - 使用限流
复制代码


        limit_conn perserver 1;
复制代码


  • 原理

  • 执行原理和限流的基本上原理一样。


  1. 平滑限流

  2. 条件

  3. 定义平滑限流


       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;        }      } 
复制代码


发布于: 刚刚阅读数: 3
用户头像

@@神农

关注

还未添加个人签名 2022.03.14 加入

还未添加个人简介

评论

发布
暂无评论
Nginx 反向代理(二)_@@神农_InfoQ写作平台