写点什么

Nginx 反向代理(一)

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

    阅读完需:约 16 分钟

网关中间件 Nginx


一、Nginx 核心概念
  • 什么是 Nginx?

  • Nginx 是高性能的 HTTP 和反向代理的服务器同时也是邮件代理服务器。

  • 官方地址:https://nginx.org/

  • 什么是反向代理服务器

  • 没有 Nginx 之前我们的请求是从客户端直接到后端服务,后端服务器响应后直接返回客户端,如图:



现在是 Nginx 代理后端服务器来接收客户端发送的请求,这就是 Nginx 的反向代理,如图:


二、Nginx 的应用场景
  • 应用场景

  • Nginx 主要应用在集群系统中。

三、Nginx 项目落地
  • 查询商品为例落地,启动两个实例,一个端口号:5000,另一个端口号为:5001,如图:



  • 查询商品的项目新建一个 API 控制器【ProductController】,代码如下:


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


  • 新建一个商品领域模型类【Product】,代码如下:


       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 使用的是 Windows 版为例,后期会出 Linux 版本,Windows 使用的版本是:nginx-1.20.0,

  • 百度网盘盘下载地址:

  • 链接:https://pan.baidu.com/s/1IZ-GWD3Al_QwqsJ-is9HqA 提取码:g2wt

  • 添加配置文件信息

  • 修改 Nginx 配置文件信息 (nginx.conf),配置文件文件路径:\nginx-1.20.0\conf


    server {            listen       80;            server_name  localhost;                          error_page   500 502 503 504  /50x.html;            location = /50x.html {                root   html;            }              #代理             location / {             proxy_pass  http://Demo.Application;         }         }         #负载均衡(分流配置)      upstream Demo.Application{          server localhost:5000;          server localhost:5001;      }
复制代码


  • 启动 Nginx

  • 先进入 Nginx 根目录下


    cd nginx根目录下
复制代码



  • 启动命令


    nginx.exe
复制代码



  • 请求代理服务器,如图:



​ 刷新了三次请求 Nginx 服务器,请求结果,如图





四、Nginx 的运行原理
  • Nginx 是模块化设计,里面包括很多模块,其中核心模块:邮件模块、HTTP 模块、事件模块

  • 如图:


  • 配置文件

  • 全局模块和事件模块 【核心模块】


        #全局模块        #user  nobody;        worker_processes  1;                #error_log  logs/error.log;        #error_log  logs/error.log  notice;        #error_log  logs/error.log  info;                #pid        logs/nginx.pid;                #事件模块  每一个请求,就是一个事件        events {            worker_connections  1024;        }
复制代码


    -   HTTP模块
复制代码


            http {                include       mime.types;                default_type  application/octet-stream;                            #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                #                  '$status $body_bytes_sent "$http_referer" '                #                  '"$http_user_agent" "$http_x_forwarded_for"';                            #access_log  logs/access.log  main;                            sendfile        on;                #tcp_nopush     on;                            #keepalive_timeout  0;                keepalive_timeout  65;                            #gzip  on;                            server {                    listen       80;                    server_name  localhost;                                #charset koi8-r;                                #access_log  logs/host.access.log  main;                                #location / {                        #root   html;                        #index  index.html index.htm;                    #}                                #error_page  404              /404.html;                                # redirect server error pages to the static page /50x.html                    #                    error_page   500 502 503 504  /50x.html;                    location = /50x.html {                        root   html;                    }                                # proxy the PHP scripts to Apache listening on 127.0.0.1:80                    #                    #location ~ \.php$ {                    #    proxy_pass   http://127.0.0.1;                    #}                                 #代理                     location / {                     proxy_pass  http://Demo.Application;                 }                    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000                    #                    #location ~ \.php$ {                    #    root           html;                    #    fastcgi_pass   127.0.0.1:9000;                    #    fastcgi_index  index.php;                    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;                    #    include        fastcgi_params;                    #}                                # deny access to .htaccess files, if Apache's document root                    # concurs with nginx's one                    #                    #location ~ /\.ht {                    #    deny  all;                    #}                }                            #负载均衡(分流配置)              upstream Demo.Application{                  server localhost:5000;                server localhost:5001;              }                # another virtual host using mix of IP-, name-, and port-based configuration                #                #server {                #    listen       8000;                #    listen       somename:8080;                #    server_name  somename  alias  another.alias;                            #    location / {                #        root   html;                #        index  index.html index.htm;                #    }                #}                                        # HTTPS server                #                #server {                #    listen       443 ssl;                #    server_name  localhost;                            #    ssl_certificate      cert.pem;                #    ssl_certificate_key  cert.key;                            #    ssl_session_cache    shared:SSL:1m;                #    ssl_session_timeout  5m;                            #    ssl_ciphers  HIGH:!aNULL:!MD5;                #    ssl_prefer_server_ciphers  on;                            #    location / {                #        root   html;                #        index  index.html index.htm;                #    }                #}                        }
复制代码


  • 通信过程 多进程模型

  • 如图:


  • ​ 查看任务管理器有两个 Nginx 进程,一个是主进程,另一个是工作进程,主进程的作用:接收客户端发送过来的请求,然后主进程将请求给工作进程,工作进程负责和后端服务器连接。

  • 优点:

  • 高效的利用 CPU 资源

  • 其中的某个进程宕机了,可以分配个其他进程

  • 这个进程的数量可以在 nginx 配置文件中配置,代码如下:


    #配置nginx进程数量    worker_processes  1;
复制代码


  • 工作进程如何与后端服务器建立连接?

  • 是靠事件驱动(消息驱动)建立连接,如图:



优点:
1. 节约资源2. 提升并发能力
复制代码


  • HTTP 虚拟主机,配置文件中的 sever 就是虚拟主机

  • 配置多个虚拟主机,可以代理多个应用。

  • 反向代理

  • 对应用代理就是反向代理。

  • 作用:

  • 为了负载均衡

  • 后端服务的安全性得到了保障,因为是暴露的 nginx 代理服务器的地址。

五、Nginx 的负载均衡
  • 作用:

  • 将访问流量均分到指定的后端服务实例。

  • 配置文件代码,如下


      #负载均衡(分流配置)      upstream Demo.Application{          server localhost:5000;        server localhost:5001;      }
复制代码


  • 负载均衡算法 均分流量

  • 轮询算法 默认算法

  • 缺陷:

  • 请求堆积,会堆积一些请求在性能差的服务器上。

  • 方案:最小活跃数算法

  • 最小活跃数算法【自动识别请求能力 推荐】

  • 条件

  • least_conn;

  • 配置代码如下:


          upstream Demo.Application{              least_conn;                server localhost:5000;            server localhost:5001;          }
复制代码


    -   原理:        -   通过请求量来实现的 通过字典工具实现            -   记录请求量            -   判断请求量            -   根据请求了的累计大小,在动态决定转发到哪个实例-   哈希一致性算法        条件:        ​ ip_hash        配置代码如下:
复制代码


        upstream Demo.Application{              ip_hash;                server localhost:5000;            server localhost:5001;          }
复制代码


    ​ 优点:        ​ 可以解决缓存命中率下降的问题。        如果项目中的数据有缓存,用哈希一致性算法,如果项目数据没有缓存那么就用最小活跃数算法。        ​ 原理:        ​ 根据IP地址,基于hash算法然后取模得到的。
复制代码


  • 负载均衡失败重试

  • 条件

  • max_fails=2 fail_timeout=10s;

  • 代码如下:


        upstream Demo.Application{              ip_hash;                server localhost:5000 max_fails=2 fail_timeout=10s;            server localhost:5001 max_fails=2 fail_timeout=10s;          }
复制代码


    如果5000由于某种原因宕机了,会重试2次并且失败超时的时间为10s,之后还是不能处理请求,则会转发到5001实例。
复制代码


  • 备机

  • 条件

  • backup

  • 代码如下


        upstream Demo.Application{                server localhost:5000 max_fails=2 fail_timeout=10s;            server localhost:5002 backup;          }
复制代码


    如果5000与5001实例由于某种原因都宕机了,那么请求会到 5002 来处理请求。【5002为备用实例,如果5000和5001 没有宕机,则不会访问5002】        一致性哈希算法不支持备机。
复制代码


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

@@神农

关注

还未添加个人签名 2022.03.14 加入

还未添加个人简介

评论

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