在使用NGINX构建的Web服务器上设置负载均衡功能

首先,

This submission is a sequel to the previous submission. The source code and configuration files are indicated as differences, so the explanation of the underlying work will be omitted in this submission. Please refer to the following.

本投稿是前一篇投稿的续篇。源代码和配置文件以差异表示,因此本投稿将省略关于基本作品的说明。请参考以下内容。

 

目标

了解NGINX的负载均衡功能的概要,并能够进行配置。

背景 – Background

在参与的系统中,几乎必然会采用负载均衡器的配置,但由于没有基础设施建设经验,因此想要亲自体验一下搭建过程。由于之前已经发布了使用NGINX构建Web服务器的文章,因此考虑是否可以利用该源代码来获取知识,于是产生了搭建和发布的想法。

负载均衡器是一种设备或软件,用于在多台服务器之间分配网络流量,以实现更好的性能和可靠性。

我们所说的是负载均衡功能。
通过进行负载均衡,可以获得以下的优势。

    • サーバリソース使用率の最適化

 

    • スループットの最大化

 

    • レイテンシーの低減

 

    耐障害性の向上

NGINX的负载均衡功能提供了以下几种分布方式。

    • round-robin

 

    • リクエストをノード1つ1つに対し順番振り分けます。

 

    • least-connected

 

    • リクエストをアクティブ、かつ、接続数が最も少ないノードに振り分けます。

 

    • ip-hash

 

    クライアントのIPアドレスと接続先ノードを紐付け、クライアントのリクエストを常に同じノードへ振り分けます。

关于分配,还提供了详细的设置。详细信息请参考官方文档。

 

整体形象

image.png

环境。

操作系统:macOS Monterey 12.5
设备:MacBook Air(13英寸,2018款,Retina显示屏)
处理器:1.6GHz 双核Intel Core i5

已安装了Docker桌面版。

% brew list --version | grep docker
docker 4.11.1,84025

这次的文件 de

 

内容 – natively paraphrased in Chinese could be “信息” xī), “资料” (zī , or “内容” .

从现在开始,我们将以版本v1的标签为基础,进行修改部分的解释。

 

如果想要自己操作,请在克隆仓库后,检出本帖所描述的已反映修订内容的v2标签,然后根据环境调整nginx-server/nginx.conf中分发到的IP地址,之后按照步骤即可运行。

创建或修改Dockerfile。

请对下列内容进行中文本地化,只需要一种选择:

NGINX

由于迁移至docker-compose.xml中,已经将端口指定删除。
原本是通过将配置文件放入docker-compose.xml所在的目录进行挂载,但现在改为进行文件复制。(任选一种方式,但我选择了这种方式)。
配置文件的说明将在后述。

FROM nginx:latest

- EXPOSE 80
- 
- RUN rm -rf /etc/nginx/conf.d
+ RUN rm -f /etc/nginx/conf.d/*
+ COPY conf.d/nginx.conf /etc/nginx/conf.d
+ COPY nginx.conf /etc/nginx

汤姆猫-1

由于迁移到docker-compose.xml文件中,已删除了对端口的指定。

FROM tomcat:latest

- EXPOSE 8080

Tomcat-2 – 汤姆猫2

我已经将Tomcat配置中默认的端口8080修改为8081。
虽然也有复制编辑过的文件的选项,但我选择使用sed来完成。

FROM tomcat:latest

RUN sed -i 's/Connector port="8080"/Connector port="8081"/' /usr/local/tomcat/conf/server.xml

汤姆猫-3

我已经像Tomcat-2一样将端口修改为8082。

FROM tomcat:latest

RUN sed -i 's/Connector port="8080"/Connector port="8082"/' /usr/local/tomcat/conf/server.xml

修改NGINX配置

上游应用将在负载均衡器中进行分配。请根据环境来修改IP地址。除了分配目标之外,如果没有特别指定,将使用轮询方式进行分配。本次设置将使用轮询方式。

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream apps {
        server 192.168.x.x:8080;
        server 192.168.x.x:8081;
        server 192.168.x.x:8082;
    }

    include /etc/nginx/conf.d/*.conf;
}

为了实现请求的分散,我们将修改URL的直接设定,在nginx-server/nginx.conf中定义分散的目标。

server {
    listen 80;
    server_name localhost;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
-       proxy_pass http://192.168.x.x:8080;
+       proxy_pass http://apps;
        # proxy_pass http://host.docker.internal:8080;
    }
}

为每个应用程序准备不同的内容。

为tomcat-server-1、2、3分别准备内容。
为了能够知道访问了哪个节点,我们会改变节点的编号。
以下是tomcat-server-1应用程序内容的示例。括号中的编号将分别变化。

<h1>hello sample.html (1)</h1>

对docker-compose.yml进行修改

我会针对每个服务进行解释。

    • nginx-server

 

    • NGINXのDockerfileにて設定ファイルをコピーするように修正したため、ボリュームに指定していた設定ファイルが配置されているディレクトリconf.dを外してます。

 

    • ポートの指定は本ファイルの定義に集約するようにしたため80ポートの指定を追加しています。

 

    • tomcat-server-1,2,3

 

    基本的には同じ構成となります。特に説明を入れるところはないので、ソース差分のみ掲載とします。
version: "3"
services:
    nginx-server:
        build:
            context: ./nginx-server
        volumes:
-           - ./nginx-server/conf.d:/etc/nginx/conf.d
            - ./nginx-server/log:/var/log/nginx
+       expose:
+           - 80
        ports:
            - 80:80

-   tomcat-server:
+   tomcat-server-1:
        build:
-           context: ./tomcat-server
+           context: ./tomcat-server1
        volumes:
-           - ./tomcat-server/webapps:/usr/local/tomcat/webapps
-           - ./tomcat-server/log:/usr/local/tomcat/logs
+           - ./tomcat-server1/webapps:/usr/local/tomcat/webapps
+           - ./tomcat-server1/log:/usr/local/tomcat/logs
+       expose:
+           - 8080
        ports:
            - 8080:8080
+   tomcat-server-2:
+       build:
+           context: ./tomcat-server2
+       volumes:
+           - ./tomcat-server2/webapps:/usr/local/tomcat/webapps
+           - ./tomcat-server2/log:/usr/local/tomcat/logs
+       expose:
+           - 8081
+       ports:
+           - 8081:8081
+
+   tomcat-server-3:
+       build:
+           context: ./tomcat-server3
+       volumes:
+           - ./tomcat-server3/webapps:/usr/local/tomcat/webapps
+           - ./tomcat-server3/log:/usr/local/tomcat/logs
+       expose:
+           - 8082
+       ports:
+           - 8082:8082

构建容器

% docker-compose build

启动容器

% docker-compose up -d

执行结果

image.png

结束容器的启动

% docker-compose down

最後

我在业务中构建的可能更为高级,但构建负载均衡器的目标已经实现。

我在想的问题是,这次分发目标是3个节点,因此通过修改配置文件来解决了问题。但是,如果考虑到大量访问并构建大量节点的情况,如何有效地为每个节点设置独特的配置(例如端口)呢?我在想是否可以使用循环处理或变量等逻辑来实现,如果有最佳实践的方式,我希望将其作为今后要解决的问题。

广告
将在 10 秒后关闭
bannerAds