Nginx作为负载均衡服务

作者: tangll | 来源:发表于2018-06-12 17:45 被阅读13次

    一、介绍

    负载均衡

    单位时间内一台服务器的访问量过大将会使服务器的压力变大,压力难以承受时甚至会导致服务器崩溃。
    负载均衡服务就是为了避免这样的事情发生。
    负载均衡就是通过建立一个服务器群,当用户访问资源时先通过一个中间服务器将这次的访问引到服务器群里压力较小服务器去访问。
    使用这样的方式就可以平衡了服务器的压力,充分发挥了服务器群的性能。

    Nginx负载均衡

    负载均衡可以通过负载均衡网络硬件设备和web服务器软件来实现,使用硬件设备的成本比较高,所以我们一般首选web服务器软件来实现负载均衡服务。
    Nginx便可以实现作为负载均衡的服务。此文介绍Nginx作为负载均衡服务的策略和配置方法,简单演示部分配置的场景。
    Nginx作为负载均衡服务是通过Nginx反向代理配置来实现的
    可以提前了解一下上一篇博客:Nginx正向代理与反向代理


    二、Nginx负载均衡服务配置语法

    1、upstream

    Nginx负载均衡服务需要通过Nginx的upstream模块来实现

    upstream upstreamname{
      server1...
      server2...
      server3...
      ...
    }
    

    需要注意的是upstream是要写在http节点下

    2、配置反向代理

    在server节点下location里通过proxy_pass配置反向代理

    server {
        location / { 
            proxy_pass: http://upstreamname; 
        }
    }
    
    3、简单配置场景演示

    接下来登录到服务器进行简单的配置演示。
    我准备了两台服务器A和B
    我将使用A服务器作为后端服务器的演示,B作为负载均衡中间服务器。
    在A服务器/etc/nginx/conf.d下我新建了3个server对应监听8001,8002,8003端口:

    server {
        listen       8001;
        server_name  localhost;
        location / {
            root   /opt/app/code1;
            index  index.html index.htm;
        }
    }
    
    server {
        listen       8002;
        server_name  localhost;
        location / {
            root   /opt/app/code2;
            index  index.html index.htm;
        }
    }
    
    server {
        listen       8003;
        server_name  localhost;
        location / {
            root   /opt/app/code3;
            index  index.html index.htm;
        }
    }
    

    并在/opt/app/下新建了3个不同样式的页面code1,code2,code3
    code1

    <html>
    <head>
        <meta charset="utf-8">
        <title>server1</title>
    </head>
    <body style="background-color:blue;">
        <h1>this is server1</h1>
    </body>
    </html>
    

    code2

    <html>
    <head>
        <meta charset="utf-8">
        <title>server1</title>
    </head>
    <body style="background-color:green;">
        <h1>this is server2</h1>
    </body>
    </html>
    

    code3

    <html>
    <head>
        <meta charset="utf-8">
        <title>server1</title>
    </head>
    <body style="background-color:red;">
        <h1>this is server3</h1>
    </body>
    </html>
    

    配置到这此时我访问三个端口的服务将对应不同的页面:
    server1:http://112.74.33.216:8001 this is server1
    server2:http://112.74.33.216:8002 this is server2
    server3:http://112.74.33.216:8003 this is server3
    准备好了3个服务,我们开始配置负载均衡,用一个地址代理到3个不同的服务上。
    登录到B服务器/etc/nginx/conf.d下新建upstream.conf配置如下:

    #配置upstream
    upstream tangll{
        server 112.74.33.216:8001;
        server 112.74.33.216:8002;
        server 112.74.33.216:8003;
    }
    server {
        listen       80;
        server_name  localhost;
        resolver  8.8.8.8;
    
        location / {
            #设置代理转发
            proxy_pass http://tangll;
        }
    }
    

    配置好了之后reload nginx
    我们访问B服务器地址:http://47.92.83.44
    结果如下:

    server1
    刷新后:
    server2
    再次刷新:
    server3
    反复刷新后发现访问此同样的地址访问的服务已经可以引入不同的服务器。
    以上便完成了Nginx负载均衡配置。
    由上我们还会发现每次的刷新都会按顺序访问server1,server2,server3的服务资源。其实这是Nginx作为负载均衡服务的默认调度策略:轮询。
    此策略下访问的请求将会按时间顺序逐一分配到不同的后端服务器。

    接下来我们将介绍Ngxin作为负载均衡服务的不同调度策略。


    三、Nginx作为负载均衡服务的几种调度策略

    1、轮询

    按时间顺序逐一分配到不同的后端服务器
    轮询是作为Nginx负载均衡的默认调度策略
    上文中已经给出演示

    2、加权轮询

    weight值越大,分配到的访问几率越高
    加权轮询策略既是在轮询的基础上指定轮询的几率
    weight越大,访问比率越大
    例如上文中的轮询策略修改如下:

    upstream tangll{
        server 112.74.33.216:8001 weight=1;
        server 112.74.33.216:8002 weight=2;
        server 112.74.33.216:8003 weight=7;
    }
    

    则server1,server2,server3被访问的概率分别为10%,20%,70%

    3、 ip_hash

    每个请求按访问IP的hash结果分配,这样来自同一个IP的固定访问一个后端服务器

    轮询策略会有这样一个弊端,每次访问的服务可能都是不一样的,那么导致一些场景下会出现问题。像登录的cookie信息验证场景下就会出现问题,所以我们可以指定同一个ip固定访问一个后端服务器来避免这样的问题。
    ip_hash的配置如下:

    upstream tangll{
        ip_hash;
        server 112.74.33.216:8001;
        server 112.74.33.216:8002;
        server 112.74.33.216:8003;
    }
    
    4、 url_hash

    按照访问的URL的hash结果来分配请求,使每个URL定向到同一个后端服务器

    在ip_hash策略下还会有一些弊端,例如在服务器缓存的场景下在服务器群中可能会对应不同的服务器缓存了不同的内容。所以我们需要让相同的url下使他去访问同一个服务器的内容。
    url_hash配置如下:

    upstream tangll{
        hash $request_uri;
        server 112.74.33.216:8001;
        server 112.74.33.216:8002;
        server 112.74.33.216:8003;
    }
    
    5、least_conn

    最少连接数,哪个机器连接数少就分发给它

    6、fair

    根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压力小的优先会分配。

    7、hash关键数值

    可以利用hash自定义的KEY来进行hash调度
    例如可以通过url中特定的KEY来调度指定的服务器

    四、总结和补充

    总结:

    Nginx使用upstream和反向代理原理可以实现负载均衡服务,使服务器群充分发挥性能,避免单位时间内单个服务器由于访问量过大而崩溃的问题。
    使用不同的调度策略可为不同的场景下搭建负载均衡服务。

    补充:upstream模块下的server参数
    • weight
      默认为1,在加权轮询策略下用到:
    upstream tangll{
        server 112.74.33.216:8001 weight=1;
        server 112.74.33.216:8002 weight=2;
        server 112.74.33.216:8003 weight=7;
    }
    
    • down 当前的server暂时不参与负载均衡
    upstream tangll{
        server 112.74.33.216:8001 down;
        server 112.74.33.216:8002;
        server 112.74.33.216:8003;
    }
    

    标识server1为无效状态,不会分配请求给他

    • backup 预留的备份服务器
    upstream tangll{
        server 112.74.33.216:8001 backup;
        server 112.74.33.216:8002;
        server 112.74.33.216:8003;
    }
    

    标识server1作为备份服务器
    在请求server2,和server3都无法访问时才去访问server1

    • max_fails 允许请求失败的次数
    • fail_timeout 经过max_fails失败后,服务暂停的时间
    upstream tangll{
        server 112.74.33.216:8001 max_fails=2 fail_timeout=10s;
        server 112.74.33.216:8002;
        server 112.74.33.216:8003;
    }
    

    在server1请求失败达到2次的10秒后将不会再分配请求给它

    • max_conns 限制最大的接受连接数
    upstream tangll{
        server 112.74.33.216:8001 max_conns=100;
        server 112.74.33.216:8002;
        server 112.74.33.216:8003;
    }
    

    最多给server1分配100个请求,超过100个请求将不会再请求它。

    相关文章

      网友评论

        本文标题:Nginx作为负载均衡服务

        本文链接:https://www.haomeiwen.com/subject/fqfreftx.html