T O P

[资源分享]     Nginx负载均衡算法

  • By - 楼主

  • 2019-09-24 10:25:42
  • Nginx负载均衡算法

    1、反向代理

    关于代理

    说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;

    此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;

    正向代理

    说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理

    在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!

    上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
    在这里插入图片描述

    反向代理

    明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用nginx进行反向代理实现的,并且通过封装nginx和其他的组件之后起了个高大上的名字:Tengine,有兴趣的童鞋可以访问Tengine的官网查看具体的信息:http://tengine.taobao.org/

    那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图:

    在这里插入图片描述

    通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色

    反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!

    项目场景

    通常情况下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器。具体的拓扑图如下:
    在这里插入图片描述

    2. 负载均衡

    我们已经明确了所谓代理服务器的概念,那么接下来,nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?

    这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量

    请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则

    所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。

    负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制
    在这里插入图片描述

    3、Nginx的几种负载均衡算法:

    1. 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响。

      即每两次请求,将下一次的请求分发给下一个服务器

    2. weight:指定轮询权重,weight值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况。

    3. ip_hash:每个请求按访问IP的哈希结果分配,这样每个访客固定访问一个后端服务器,可以有效的解决动态网页存在的session共享问题。

    4. fair(第三方):更智能的一个负载均衡算法,此算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。如果想要使用此调度算法,需要Nginx的upstream_fair模块。

    5. url_hash(第三方):按访问URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端缓存服务器的效率。如果想要使用此调度算法,需要Nginx的hash软件包。

    upstream模块还能够为每一个上游服务器设置状态值,这些状态值的含义分别例如以下:

    1. 在http节点下,添加upstream节点。

      upstream linuxidc {
      server 10.0.6.108:7080;
      server 10.0.0.85:8980;
      }

    2. 将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称,即“

      http://linuxidc”.

      location / {
      root html;
      index index.html index.htm;
      proxy_pass http://linuxidc;
      }

    3. 负载均衡初步完成了。

      upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,

      如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。

    轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除 配置如下:
        upstream img_relay {
            server 127.0.0.1:8027;
            server 127.0.0.1:8028;
        }
    
    但缺点是:可靠性低和负载分配不均衡。适用于图片服务器集群和纯静态页面服务器集群。
    
    除此之外,upstream还有其它的分配策略,分别如下:
    

    weight(权重)

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如下所示,10.0.0.88的访问比率要比10.0.0.77的访问比率高一倍。
    upstream linuxidc{ 
          server 10.0.0.77 weight=5; 
          server 10.0.0.88 weight=10; 
    }
    
    注:如果应用程序有会话控制  则不适应以上2方法  因为此方法不能保证把这次请求和下一次请求发送到同一台机器上 
    

    ip_hash(访问ip)

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
        upstream favresin{ 
              ip_hash; 
              server 10.0.0.10:8080; 
              server 10.0.0.11:8080; 
        }
    

    fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。
     upstream favresin{      
          server 10.0.0.10:8080; 
          server 10.0.0.11:8080; 
          fair; 
    }
    

    url_hash(第三方)

    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
    注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
     upstream resinserver{ 
          server 10.0.0.10:7777; 
          server 10.0.0.11:8888; 
          hash $request_uri; 
          hash_method crc32; 
    }
    

    upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:

    down 表示单前的server暂时不参与负载.
    weight 默认为1.weight越大,负载的权重就越大。
    max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
    fail_timeout : max_fails次失败后,暂停的时间。
    backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
    
    upstream bakend{ #定义负载均衡设备的Ip及设备状态 
          ip_hash; 
          server 10.0.0.11:9090 down; 
          server 10.0.0.11:8080 weight=2; 
          server 10.0.0.11:6060; 
          server 10.0.0.11:7070 backup; 
    }
    

    负载均衡配置

    #这个是需要转发的目标服务器地址以及端口号

    upstream mynginx{
    
        server localhost:8080; #Apache
    
    }
    
     
    
    ## Start www.quancha.cn ##
    
    server {
    
        listen 80;
    
        server_name  localhost;
    
        index  index.html index.htm index.php;
    
     
    
        ## send request back to apache ##
    
        location / {
    
         #需要转发请求的服务器  负载均衡也是如此配置
    
            proxy_pass  http://mynginx;
    
     
    
            #Proxy Settings
    
            proxy_redirect     off;#是否跳转
    
            proxy_set_header   Host             $host; #请求要转发的host
    
            proxy_set_header   X-Real-IP        $remote_addr;#请求的远程地址    这些在浏览器的header都可看,不一一解释
    
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    
            proxy_max_temp_file_size 0;
    
            proxy_connect_timeout      90; #连接前面的服务器超时时间
    
            proxy_send_timeout         90;#请求转发数据报文的超时时间
    
            proxy_read_timeout         90;#读取超时时间
    
            proxy_buffer_size          4k; # 缓冲区的大小
    
            proxy_buffers              4 32k; #
    
            proxy_busy_buffers_size    64k; # #proxy_buffers缓冲区,网页平均在32k以下的
    
            proxy_temp_file_write_size 64k; ##高负荷下缓冲大小(proxy_buffers*2)
    
       }
    
    }
    
    
    
    
    #配置多台服务器(这里只在一台服务器上的不同端口)
    
     upstream mysvr {   
    
        #权重比设置为1  : 3  意思为  用户请求四次服务器,平均访问8082端口3次,8081端口一次,以此达到服务器均衡的作用(高并发)  
    
          server 127.0.0.1:8081 weight=1;
    
          server 127.0.0.1:8082 weight=3;  #热备
    
    }
    
    
    
    
    server {
    
            listen       80;
    
            server_name  localhost;
    
     
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
     
    
         #静态文件,nginx自己处理
    
            location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    
                
    
                #过期30天,静态文件不怎么更新,过期可以设大一点,
    
                #如果频繁更新,则可以设置得小一点。
    
                expires 30d;
    
            }
    
        location  ~^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~为不区分大小写。
    
               #root path;  #根目录
    
               #index vv.txt;  #设置默认页
    
               proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
    
               #deny 127.0.0.1;  #拒绝的ip
    
               #allow 172.18.5.54; #允许的ip           
    
            } 
    
     
    
            location / {
    
                root   html;
    
                index  index.html index.htm;
    
            }
    
    }
    

    Linux系统下安装 Nginx

    1、安装依赖

    yum install gcc
    
    yum install pcre-devel
    
    yum install zlib zlib-devel
    
    yum install openssl openssl-devel
    
    //一键安装上面四个依赖
    yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
    

    2、下载并解压安装包

    cd /usr/local
    
    // 创建一个文件夹
    mkdir nginx
    
    cd nginx
    
    // 下载tar包
    wget http://nginx.org/download/nginx-1.13.7.tar.gz
    
    tar -xvf nginx-1.13.7.tar.gz
    

    3.安装nginx

    //进入nginx目录
    cd /usr/local/nginx/nginx-1.13.7
    
    //执行命令
    ./configure
    
    //执行make命令
    make
    
    //执行make install命令
    make install
    

    4.配置nginx.conf

    # 打开配置文件
    vim /usr/local/nginx/conf/nginx.conf
    

    在这里插入图片描述

    5.启动nginx

    /usr/local/nginx/sbin/nginx -s reload
    
    查看nginx进程是否启动:
    
    ps -ef | grep nginx
    

    6.若想使用外部主机连接上虚拟机访问端口192.168.131.2,需要关闭虚拟机的防火墙:

    centOS6及以前版本使用命令: systemctl stop iptables.service
    
    centOS7关闭防火墙命令: systemctl stop firewalld.service
    
    随后访问该ip即可看到nginx界面。
    

    7.访问服务器ip查看

    安装完成一般常用命令
    
    进入安装目录中,
    
    命令: cd /usr/local/nginx/sbin
    
    启动,关闭,重启,命令:
    
    ./nginx 启动
    
    ./nginx -s stop 关闭
    
    ./nginx -s reload 重启
    

    本帖子中包含资源

    您需要 登录 才可以下载,没有帐号?立即注册