Nginx负载均衡

如何处理高并发

Posted by 张晨 on June 27, 2021

介绍

今天给大家讲讲nginx负载均衡应该怎么做。负载均衡不管是后端还是运维,运用的都非常的广泛。大部分的后端同学或者是运维的同学都或多或少的了解或者是深入解剖过负载均衡。

其实负载均衡它的方式有很多哈,有七层负载均衡和四层负载均衡之分。有硬件的负载均衡服务器,还有软件的。今天我们要讲的就是软件的,并且是nginx的负载均衡。

为什么要使用负载均衡

现在很多大型网站他们都需要考虑一个并发的问题。就是流量突然间很高,那这可咋整啦。一台机扛不住,我们就用两台机呗。两台机扛不住我们就用三台机。直到能够抗住为止。所以,我们就需要配置一个负载均衡,来分发流量,给每台服务器平均消耗一点流量过去,分担任务。

为什么选择Nginx

但是为啥nginx做负载均衡这么火热啦?其实具体的我也不知道。因为我没有具体求证过其他web软件做负载均衡的效果。下面给大家讲讲别人说为什么推荐nginx做负载均衡。

nginx抗并发,抗并发的主要原因是它使用了epoll模型参考文献。它可以在高并发的情况下,重复利用IO减少系统的压力。

Nginx负载均衡的方式

Nginx提供了几种负载均衡的方式,让我们选择。分别是

  • 轮询 (round-robin)

就是遍历你配置的每一台服务器,这种情况一般都是你后端的每一台服务器的配置和压力都是一样的。可以这样子设置。

  • 加权轮询

就是后端的每一个服务地址都是有一个权重值,主要是如果后端的服务器的配置不一样,想给某个节点多搞点流量过去,平均一下资源,可以这样搞。我见过的较多的也是这种的。

  • IP 哈希

同一个IP地址会转发到某台固定的服务器上面去。这种适用于某些网站需要维护用户状态的。例如session的维护,如果没有使用分布式的方式解决的话,可以临时用一下这种。

主要是以上三种负载均衡的方案。然后在这三种当中,使用的最多的估计也是第二种权重。因为这种方便灵活一点。

配置步骤

我不会教你怎么安装Nginx啊。可以去网上看看文章,这个比较简单。

你也可以和我一样,直接使用docker。那就一条命令的事了。

docker pull nginx

  1. 使用docker拉取nginx镜像下来

    1
    
    docker pull nginx
    
  2. 在当前目录新建一个conf.d文件夹

    1
    
    mkdir conf.d
    
  3. conf.d文件夹中新增文件www.test.com

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    server {
        listen       80;
        server_name  _;
       
        index        index.php index.html index.htm;
       
        root /data/www;
        location / {
            default_type text/html;
            return 200 'port:80';
            index  index.html index.htm;
        }
       
    }
    
  4. 启动nginx镜像,并且监听80端口。挂载当前目录到指定目录

    1
    
    docker run -d -v $(pwd)/conf.d:/etc/nginx/conf.d -p 80:80 nginx
    
  5. 访问域名,查看访问效果。我们看到了port:80字样就行了

    因为我是使用了域名的。如果没有域名可以使用ip地址加端口访问。

  6. 修改www.test.com配置负载均衡

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    
    upstream backserver {
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
       
    server {
        listen       80;
        server_name  _;
        
        location / {
            proxy_pass http://backserver/;
        }
       
    }
    server {
        listen       8080;
        server_name  _;
          
        location / {
            default_type text/html;
            return 200 'port:8080';
        }
       
    }
       
    server {
        listen       8081;
        server_name  _;
       
        location / {
            default_type text/html;
            return 200 'port:8081';
        }
       
    }
       
    server {
        listen       8082;
        server_name  _;
       
        location / {
            default_type text/html;
            return 200 'port:8082';
        }
       
    }
    
  7. 重启容器docker restart xxxxx

    x表示你刚才启动容器的容器id

  8. 刷新访问看效果。是不是不断循环的显示port:8080port:8081port:8082

    那就说明你配置成功了。你太棒了

上面这个例子是简单得不能再简单的例子了。在生产环境中,一般我们的后端服务器都不是在同一台服务器的。所以就肯定不是127.0.0.1。我只是为了演示,所以直接使用了本机地址。

弊端

  • 单点故障

    虽然我们使用了nginx来做负载均衡,我们也保证不了做负载均衡这台服务器万一挂了怎么办。服务器炸了,你后段有再多的服务器用户也是访问不了。所以,我们一般都是要做到高可用的。可以使用一些lvs这样的技术来解决。我也还没玩过,所以不做评论。

  • 弹性扩容

    因为大部分需要负载均衡的网站都是并发型网站。如果你动态增加了一台服务器。想在nginx这里添加一个后端服务器,好像目前只能手动添加。

未完待续

听说Nginx还有四层负载均衡方案?我也还没玩过。等我玩过了再写篇文章出来。

参考文档