zoukankan      html  css  js  c++  java
  • Nginx知多少系列之(六)Linux下.NET Core项目负载均衡

    目录

    1.前言

    2.安装

    3.配置文件详解

    4.工作原理

    5.Linux下托管.NET Core项目

    6.Linux下.NET Core项目负载均衡

    7.负载均衡策略详解

    8.加权轮询(round robin)策略剖析

    9.IP哈希(ip hash)策略剖析

    10.最少连接(least_conn)策略剖析

    11.随机(random)策略剖析

    12.URL哈希(url hash)策略剖析

    13.响应时间(fair)第三方模块详解

    14.Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)

    15.Linux下.NET Core项目Nginx+Keepalived高可用(双主模式)

    16.Linux下.NET Core项目LVS+Keepalived+Nginx高可用集群

    17.构建静态服务器

    18.日志分析

    19.优化策略

    20.总结

     

    在上一篇文章我们已经讲过如何使用Nginx托管.NET Core项目,那么接下来我们就要介绍如何使用Nginx作为负载均衡。这里之前是用了两台服务器作为讲解的,后面更新为三台上游服务器,只是内容有所变化,方法是不变的,特此说明下。

    1.什么是负载均衡?

    Load balancing,即负载均衡,是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。

    2.有什么作用?

    ①、解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);

    ②、提供故障转移,实现高可用;

    ③、通过添加或减少服务器数量,提供网站伸缩性(扩展性);

    ⑤、安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)

    3.为什么使用Nginx来做负载均衡?

    在前一篇文章,我们只是单机部署站点,程序猿A很开心的把站点部署上线了,客户使用了一段时间也没有发现什么问题,突然有一天访问不了,程序猿A一看,哦豁,服务器挂了,让我来重启下服务器,重启之后他很开心的告诉客户,系统已经可以访问啦。同时心里庆幸在上班时间出现问题,万一半夜或者在路上,那客户不得急死咯。程序猿A就想了,这可是概率事件啊,我也不知道它什么时候发神经或者经常性的给我来故障,那我不得经常被老板拿去祭天咯。程序猿A到最后也没有解决这个故障问题,当然后面也没有发生故障,随着客户越来越多,突然某天某个点系统突然很卡甚至返回访问不了,程序猿A去看了下,发现服务器并没有故障,但是就是访问不了。这个时候程序猿A不解决问题就不行了,不解决客户就会经常访问不了,久之这个系统就没法用了,即使老板天天拿程序猿A去祭天也无济于事。

    上面这个故事其实就是因为单机部署发生的单点故障,导致系统无法访问。还有就是并发鸭梨,导致系统处理能力下降甚至访问不了。那这个时候我们就把系统部署在多台服务器上,当一台挂了,另外一台也可以照常使用,而多台服务器就需要Nginx作为代理服务器,所有的请求先进入Nginx,Nginx在根据具体的规则把请求转发到具体的服务器上。

    4.怎么做?

    首先我们还是按照上一篇文章介绍的,部署三台.NET Core站点。但是我们要做为这两个.NET Core做一些区分,这样能更好的看出我们访问的是哪台服务器。我们按照《.NET Core项目部署到Linux(Centos7)(三)创建.NET Core API项目》,然后找到WeatherForecastController修改Get方法,增加ServerName区分具体访问的是哪一个站点。如下图

    三台服务器的IP分别为192.168.157.132、192.168.157.133、192.168.157.138(这里的IP根据具体环境变化),我们修改ServerName为“.Net Core Nginx Server 1”,发布到132这台服务器上。然后修改ServerName为“.Net Core Nginx Server 2”,发布到133这台服务器上。最后修改ServerName为“.Net Core Nginx Server 3”,发布到138这台服务器上。发布完之后,我们在Postman验证下效果。《.NET Core项目部署到Linux(Centos7)(六)发布.NET Core 项目到Linux》

    这样我们单独去访问这三台服务器站点都是正常的,但是这样我们是无法做负载均衡的,用户只能访问一个站点,因为只能公布一个入口,那么下面我们就部署Nginx负载均衡服务器,用它来把用户的请求转发到这两个站点的其中一个。

    我们先新建一个虚拟机,然后用yum安装Nginx,《Nginx知多少系列之(二)安装》 ,安装后如下图

    #测试Nginx安装是否成功
    curl http://localhost

     

    这一台服务器是192.168.157.134,我们按照前面介绍的为Nginx开机自启动以及开放对应的防火墙端口。

    接下来我们就要做负载均衡配置了。

    #进入nginx目录
    cd /etc/nginx
    
    #编辑nginx.conf
    sudo vim nginx.conf
    
    #按i进入插入模式
    
    #注释下面的内容
    
    #    server {
    #        listen       80 default_server;
    #        listen       [::]:80 default_server;
    #        server_name  _;
    #        root         /usr/share/nginx/html;
    #
    #        # Load configuration files for the default server block.
    #        include /etc/nginx/default.d/*.conf;
    #
    #        location / {
    #        }
    #
    #        error_page 404 /404.html;
    #            location = /40x.html {
    #        }
    #
    #        error_page 500 502 503 504 /50x.html;
    #            location = /50x.html {
    #        }
    #    }
    
    #编辑完后按Esc,然后:wq保存退出

    负载均衡需要使用upstream模块,所以我们首先需要在Http块里的全局位置定义一组服务器,我们在使用yum安装的nginx在nginx.conf里会定义了include /etc/nginx/conf.d/*.conf,这里说明了包含了conf.d文件夹下面以.conf为结尾的配置文件。因为include是定义在全局的,所以在conf配置文件里也可以定义全局的内容。

    #进入conf.d目录
    cd /etc/nginx/conf.d
    
    #创建upstream.conf文件
    sudo touch upstream.conf
    
    #编辑upstream.conf文件
    sudo vim upstream.conf
    
    #按i进入插入模式
    
    #输入下面的配置内容
    
    upstream netCoreDemo  {
        server 192.168.157.132;
        server 192.168.157.133;
        server 192.168.157.138;
    }  
     
    server {
        listen   80; 
        location / {
          proxy_pass  http://netCoreDemo;
        }
    }
    
    #按Esc,然后:wq保存退出
    
    #重启Nginx
    sudo nginx -s reload

    配置负载均衡就是这么简单哦,当然下面我们还会介绍负载均衡的策略。不过我们先来验证下效果吧,有图有真相。

    哦豁,看到效果了么,第一次访问是在132的站点,第二次访问是在133的站点,第三次访问的是在138的站点,以此类推下去。简单的负载均衡已经实现了。这里的策略我们没有做更改,在Nginx里默认的方式是轮询,每个请求按照时间顺序轮流分配到不同的后端服务器。

     下一篇文章将会详细的讲解Nginx负载均衡的策略,目前暂不包含商业策略的讲解。

  • 相关阅读:
    BT协议分析(1)—1.0协议
    Qt线程(2) QThread中使用WorkObject
    新浪微博的开放平台官方文档太粗略,记:仿大平台来实现
    58同城 骗子太多
    代码实现业务经验(程序员的核心能力)
    gitbash 本地文件提交为一个新的项目 到 gitlab
    Spring 核心容器 IOC
    spring AOP 理解
    java不返回某些字段,包括 null
    CentOS7安装 Redis5 单实例
  • 原文地址:https://www.cnblogs.com/jayjiang/p/12700782.html
Copyright © 2011-2022 走看看