• 通过 Nginx 实现多机负载均衡


    需求描述

    现有三台配置相同,且处于同一网络中的 CentOS 服务器,需要对这三台服务器进行合理的负载均衡配置,使各服务器的硬件及带宽资源均得到有效利用。

    功能规划

    三台服务器分别用 A、B、C 指代。A 服务器 80 端口上的负载均衡服务,负责将用户的请求分流至三个 Web 应用服务,这三个 Web 应用服务分别运行在本机的 8080 端口及 B、C 服务器的 80 端口。

    服务器用途端口
    A负载均衡80
    AWeb应用8080
    BWeb应用80
    CWeb应用80

    路径规划

    负载均衡服务及 Web 应用服务均通过 Nginx 实现,为了方便开发,这里采用 Docker 来部署三台服务器上的四个 Nginx。

    Nginx 配置及 Dockerfile 部署路径见下表。

    -负载均衡Web应用
    根路径/var/nginx/load-balancer/var/nginx/web-server
    网站配置./conf.d/load-balancer.conf./conf.d/web-server.conf
    Dockerfile./Dockerfile./Dockerfile

    服务配置

    两类服务的基础配置 ,也就是 nginx.conf 文件是相同的。不同之处只是具体的功能设置,在 conf.d 目录下的 conf 文件中体现。

    负载均衡

    用于负载均衡服务的 Nginx 镜像,其配置文件及 Dockerfile 如下所示。

    这里有一个关键点要注意,由于 A 服务器上将会运行两个 Nginx 容器,要想将负载均衡服务的请求导向同一服务器上的 Web 应用服务,就需要把请求发给 Web 应用服务用于 Docker 容器间通信的 IP,而不是 A 服务器的外网 IP 或者局域网 IP,因此这里 upstream 中为 A 服务器上的 Web 应用服务所设置的 IP 为 172.17.0.3。

    1. # 负载均衡服务的配置文件
    2. # load-balancer.conf
    3. upstream servers {
    4.     server 172.17.0.3:8080; # Docker 容器间通信,需用此 IP
    5.     server B;
    6.     server C;
    7. }
    8. server {
    9.     listen       80;
    10.     server\_name  localhost;
    11.     location / {
    12.         proxy\_pass http://servers;
    13.     }
    14. }
    1. # 负载均衡服务的 Dockerfile
    2. FROM nginx:latest
    3. RUN rm /etc/nginx/nginx.conf
    4. RUN rm /etc/nginx/conf.d/default.conf
    5. COPY ./nginx.conf /etc/nginx/nginx.conf
    6. COPY ./conf.d/load-balancer.conf /etc/nginx/conf.d/load-balancer.conf

    Web 应用

    用于 Web 应用服务的 Nginx 镜像,其配置文件及 Dockerfile 如下所示。

    1. # Web应用的配置文件
    2. # load-balancer.conf
    3. server {
    4.     listen       80; # 对于 A 服务器,这里需要改成 8080
    5. # 因为默认的 80 端口已被负载均衡服务占用了
    6.     server\_name  localhost;
    7.     location / {
    8.         root   /usr/share/nginx/html;
    9.         index  index.html index.htm;
    10.     }
    11.     # 公用静态资源
    12.     location /vendor {
    13.         alias /var/www/vendor;
    14.     }
    15.     # 网站路径
    16.     location /website {
    17.         alias /var/www/website;
    18.     }
    19. }
    1. # Web 应用服务的 Dockerfile
    2. FROM nginx:latest
    3. RUN rm /etc/nginx/nginx.conf
    4. RUN rm /etc/nginx/conf.d/default.conf
    5. COPY ./nginx.conf /etc/nginx/nginx.conf
    6. COPY ./conf.d/web-server.conf /etc/nginx/conf.d/web-server.conf

    镜像编译

    完成两类服务的 Nginx 配置文件和 Dockerfile 的编辑之后,就需要编译生成镜像了。

    分别进入负载均衡服务和 Web 应用服务所在的目录,确保 Dockerfile 就在所进入的路径下,然后执行下面的命令,即可编译镜像:

    1. # 负载均衡服务
    2. $ docker build -t load-balancer:1.0.0 .
    3. # Web 应用服务
    4. $ docker build -t web-server:1.0.0 .

    容器启动

    编译好两个 Docker 镜像之后,就需要把它们运行起来了。

    由于 A 服务器上会运行两个 Nginx 镜像,为了方便调试,各自的日志文件需设置不同的路径。

    服务日志文件路径(需手动创建目录)
    负载均衡/var/log/nginx/load-balancer
    Web 应用/var/log/nginx/web-server

    另外 Web 应用需要访问宿主的 /var/www/website 和 /var/www/vendor 这两个路径,所以对于负载均衡服务和 Web 应用服务而言,分别需要挂载 1 个、3 个目录。

    这两个服务的容器启动命令如下:

    1. # 负载均衡服务的启动命令
    2. $ docker run --name load-balancer \
    3. -v /var/log/nginx/load-balancer:/var/log/nginx \
    4. -p 80:80 -d load-balancer:1.0.0
    5. # Web 应用服务的启动命令
    6. $ docker run --name web-server \
    7. -v /var/log/nginx/web-server:/var/log/nginx \
    8. -v /var/www/tspt:/var/www/tspt \
    9. -v /var/www/vendor:/var/www/vendor \
    10. -p 8080:8080 -d web-server:1.0.0

    效果验证

    三台服务器上的四个服务启动成功之后,还需要查看各自的 Nginx 日志,确保负载均衡服务配置成功。在各台服务器上,执行下面的命令,查看 Nginx 日志。

    1. # 查看负载均衡服务的日志
    2. $ tail /var/log/nginx/load-balancer/access.log -f
    3. # 查看 Web 应用服务的日志
    4. $ tail /var/log/nginx/web-server/access.log -f

    如果在本机访问页面,同时看到三台服务器上的 Web 应用服务日志都有新的请求,就说明负载均衡服务配置成功了,OK,大功告成!

  • 相关阅读:
    Linux中间件之源码分析redis的渐进式rehash过程
    前端面试题——CSS 高频
    C语言分支与循环语句
    每天五分钟机器学习:支持向量机如何找到最优分割超平面?
    Leetcode 2101. 引爆最多的炸弹 预处理构图+DFS/BFS
    分享13个游戏源代码总有一个是你想要的
    Ubuntu22.04安装libudev-dev时的Bug
    面试题:打印课程
    视频监控/视频汇聚/视频云存储EasyCVR平台接入华为ivs3800平台提示400报错,该如何解决?
    多线程之Semaphore原理
  • 原文地址:https://blog.csdn.net/qq392465929/article/details/125496612