用NGINX进行负载平衡
先决条件:基本的Docker和Nodejs知识
在这篇文章中,我将谈论如何控制我们Web应用程序的后台流量。在这个过程中,我将使用负载平衡功能,它是Nginx自己的功能之一。让我们从一个简单的定义开始。
在最简单和最简短的定义中,负载平衡是管理服务器和客户端之间流量的过程。在今天的架构中,有必要在需要时增加服务器的容量。这个过程被称为扩展。有两种不同的方法可用于扩展。增加服务器容量,即成倍增加其内存和速度。增加服务器的数量。
在今天的架构中,第二种选择被更广泛地使用。在这样的架构中,管理流量将是至关重要的。因为来自客户端的请求应该以最适当和最理想的方式分配给服务器,以避免冲突和不使服务器过载。这样一来,一个繁忙的服务器就不会变得繁忙,而另一个服务器也就解决了问题。进行这种操作的结构被称为负载平衡器。
在架构中的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的负载均衡功能在服务器之间进行了一个负载均衡过程.