用NGINX进行负载平衡

先决条件:基本的Docker和Nodejs知识

在这篇文章中,我将谈论如何控制我们Web应用程序的后台流量。在这个过程中,我将使用负载平衡功能,它是Nginx自己的功能之一。让我们从一个简单的定义开始。

在最简单和最简短的定义中,负载平衡是管理服务器和客户端之间流量的过程。在今天的架构中,有必要在需要时增加服务器的容量。这个过程被称为扩展。有两种不同的方法可用于扩展。

  1. 增加服务器容量,即成倍增加其内存和速度。
  2. 增加服务器的数量。

在今天的架构中,第二种选择被更广泛地使用。在这样的架构中,管理流量将是至关重要的。因为来自客户端的请求应该以最适当和最理想的方式分配给服务器,以避免冲突和不使服务器过载。这样一来,一个繁忙的服务器就不会变得繁忙,而另一个服务器也就解决了问题。进行这种操作的结构被称为负载平衡器。

在架构中的4个服务器和客户端之间有一个负载平衡器。这个结构将根据一定的算法将传入的请求转发给服务器,并控制流量。

那么,负载平衡器使用什么算法来控制流量?

负载平衡器使用的算法或方法有多种。这种选择权在开发者手中,可以根据架构和流量选择一种负载平衡方法。下面是这些方法中的几种。

  1. 最少的连接
  2. 基于资源的
  3. 循环赛
  4. IP哈希值

除了这些方法之外,还可以像随机一样进行交通管制。你可以在这里找到上述方法的解释和更多的信息。

由于它将是快速和简单的,我将创建我们的后台项目,它将用nodejs在服务器上运行。我在项目目录中为服务器创建了一个文件夹,并在这个文件夹中用以下命令启动一个node项目。

npm init -y

package.json文件已经创建,现在让我们在服务器文件夹中创建index.js文件。由于我们将创建一个rest api,我将使用node express,所以让我们用以下命令添加必要的库。

npm install express

我们项目目录的最终版本将如下。

现在让我们对index.js文件进行编码。

const express = require("express")

const app = express()

app.get("/", (req,res) => {
      res.send("This is the server's response...")
  })
app.listen(5050,() => {
      console.log("Listening...")
  })

我们已经实现了一个简单的rest api,从5050端口提供服务。为了测试它,你可以用node index.js命令运行它,并从localhost:5050端口访问它。

现在让我们把这个简单的后端应用作为docker容器运行。接下来,我们将虚拟地把这个服务器复制成docker容器,并在nginx.conf文件中为负载平衡做出修改。

让我们在服务器文件夹中创建一个Docker文件。

FROM node:19-alpine

WORKDIR /usr/src/app

COPY package*.json ./
  
  RUN npm install
  
  COPY . .
  
  EXPOSE 5050

CMD [ "node", "index.js" ]

在我们建立Docker文件之前,nginx和我们的虚拟服务器都将在docker上运行。我们需要创建一个共同的网络,使它们能够相互通信。让我们用以下命令创建一个名为loadbalance_net的网络。

docker network create loadbalance_net

现在,让我们通过依次运行以下命令来构建和创建我们的4个虚拟服务器。

docker build -t server .

docker run -p 1010:5050 --name backend_server_1 -d --network loadbalance_net server

docker run -p 2020:5050 --name backend_server_2 -d --network loadbalance_net server

docker run -p 3030:5050 --name backend_server_3 -d --network loadbalance_net server

docker run -p 4040:5050 --name backend_server_4 -d --network loadbalance_net server

我们有4个相同的服务器,可以从1010、2020、3030和4040端口访问。通过打开你的浏览器,你可以从这些端口访问和测试你的后台服务。

这些端口是在docker网络之外开放的端口,所以我们可以从docker之外用这些端口访问这些虚拟服务器。但由于我们的nginx服务器也是一个docker容器,我们将从5050端口访问我们的后端服务器,并使用它们自己的特殊名称,而不是从这些端口。

3- NGINX作为一个负载平衡器

在这篇文章中,我们将使用NGINX作为负载平衡器。(在我之前的文章中,我们使用nginx作为Web服务器,并为react应用提供服务。)

它使用默认的Round Robin算法作为Nginx的负载平衡方法。我们将继续使用这种算法。

首先,我们将在项目中创建一个nginx文件夹,并在其中创建nginx.conf文件。

现在我们来写nginx.conf文件的内容。

upstream backend {
    server backend_server_1:5050;
    server backend_server_3:5050;
    server backend_server_3:5050;
    server backend_server_4:5050;
}
server {
    listen 80;
    include /etc/nginx/mime.types;
    location / {
          proxy_pass http://backend/;
    }
}

通过上游块,我们已经显示了哪些后端服务器可以访问我们的nginx服务器。由于我们没有指定具体的负载均衡算法,它将使用轮回算法。如果我们想让它使用一种不同的算法,我们可以按以下方式指定。

upstream backend {
    least_conn;
    server backend_server_1:5050;
    server backend_server_3:5050;
    server backend_server_3:5050;
    server backend_server_4:5050;
}

我们说过,在上述配置中,我们将使用 least_conn 算法。对于其他选项,只要指定同样的内容就足够了。详细的信息可以在这里找到。

是的,既然我们已经处理了nginx的配置,让我们创建一个Docker文件,创建一个nginx镜像,然后启动负载均衡器从3000端口提供服务。项目目录的最终状态将是这样的。

Nginx Dockerfile。

FROM nginx:stable-alpine

COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

现在是建立nginx Docker文件的时候了。让我们用下面的命令进行构建。

docker build -t nginx_load_balancer .

让我们把我们建立的图像映射到3000端口,并把它纳入我们之前创建的网络中。

docker run -p 3000:80 --name nginx_server -d --network loadbalance_net nginx_load_balancer

在这个过程之后,将有5个容器在运行,情况如下。

所有交易都正常。现在让我们到浏览器中,向localhost:3000发送一个请求

正如你所看到的,我们从我们的后端服务器得到了响应。每次我们刷新页面,它都会使用我们设置的load_balancing算法连接到不同的服务器,但我们没有看到它。为了看到它正在连接到不同的服务器,你可以改变它向服务器发送的响应,然后再测试一下。

综上所述,在这篇文章中,我们使用nginx的负载均衡功能在服务器之间进行了一个负载均衡过程.

展开阅读全文

页面更新:2024-03-06

标签:负载   平衡器   端口   算法   架构   流量   命令   服务器   文件   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top