【问题标题】:Using HAProxy load balancer with apache web server将 HAProxy 负载平衡器与 apache Web 服务器一起使用
【发布时间】:2021-09-06 20:04:50
【问题描述】:

我试图在我的网络服务器前设置一个负载平衡器,以将请求重定向到任何一台机器。我知道 Nginx 本身可以做到这一点。但我想使用 HAProxy 负载均衡器。我在云上有 2 台机器为网站提供服务,独立使用各个机器的 IP 地址。现在我想要一个负载均衡器,它首先接收请求,然后将其转发到我的两台具有相同 django 代码的机器中的任何一台,基本上我想让我的系统分布式。

我怎样才能达到同样的效果?

【问题讨论】:

    标签: apache nginx server haproxy distributed-system


    【解决方案1】:

    首先,您提到您有两台使用 Apache 作为 Web 服务器的服务器,它们为 Django 应用程序提供服务。我假设您为此使用mod_wsgi,并且您已经在端口 80 中公开了您的应用程序。

    假设这些机器 A 和 B 具有以下 IP:

    • A -> XX.XX.XX.XX
    • B -> YY.YY.YY.YY

    现在您想在前面放置另一台机器作为负载均衡器和 HAProxy,为了便于理解,我们将这台机器称为 LB,IP ZZ.ZZ.ZZ.ZZ。

    Haproxy 安装

    由于您没有提及您希望如何在您的 LB 机器中部署 HAProxy,我将假设您正在使用带有 Docker 的容器化解决方案。

    为什么?因为这将允许您在不停机的情况下升级您的 HAProxy 版本并刷新您的配置,再加上 Docker 提供的可扩展性,以防您希望在未来增加您的架构。

    为此,您只需要 LB-Machine 中的 HAProxy。我们将定义一个 Compose 文件,但由于我们将其作为 Swarm 运行,因此您不需要安装 Compose。

    HAProxy 的当前 LTS 版本是 2.4.7,因此我们将使用该版本中的 alpine 图像。为了防止将来出现任何可能的安全问题,因为他们会更改该标签中的图像,我们还将指定摘要以具有尽可能确定的版本。

    好吧,让我们创建一个简单的docker-compose.yml,其中将包含我们的配置:

    version: '3.8'
    
    services:
      haproxy:
        image: haproxy:2.4.7-alpine@sha256:7c7003821ca706d6db8b93516a22f08922fb4bf86f7a7baff081f55512844607
        ports:
          - "80:80"
        deploy:
          replicas: 1
          update_config:
            delay: 1s
            parallelism: 1
            order: start-first
            failure_action: rollback
        configs:
          - source: haproxy.cfg
            target: /usr/local/etc/haproxy/haproxy.cfg
            mode: 0440
    
    configs:
      haproxy.cfg:
        file: ./haproxy.cfg
        name: haproxy.cfg-${TIMESTAMP}
    

    我们可以将这个 Compose 文件保存在我们的 LB 机器上的任何位置,比如/srv/docker/haproxy。

    如果您想完全避免使用 Docker,您可以通过包管理系统安装 HAProxy,但我强烈建议将其容器化。

    要直接在您的发行版上安装它,只需运行:

    • Ubuntu 17.04+
    sudo apt-get install haproxy
    
    • Fedora 26+
    sudo yum install haproxy
    

    Haproxy 配置

    如果你只是想要一个简单的负载平衡,你可以通过以下基本配置来做到这一点:

    defaults
      log     stdout  format raw  local0 info
      mode    http
      option  httplog
      option  dontlognull
      timeout connect 5s
      timeout client  10s
      timeout server  10s
    
    frontend http-in
      bind *:80
      default_backend web_servers
    
    backend web_servers
      balance roundrobin
      option  forwardfor
      server  machineA XX.XX.XX.XX:80 check
      server  machineB YY.YY.YY.YY:80 check
    

    要在 HAProxy 上设置该配置,您只需要:

    • 在 Docker 中,使用名称 haproxy.cfg 将其存储在您的 docker-compose.yml 所在的同一目录中。
    • 如果您直接在您的发行版上安装了 HAProxy,请修改 /etc/haproxy/haproxy.cfg 下的文件并添加之前的配置。

    使用此配置,当您访问 ZZ.ZZ.ZZ.ZZ 时,请求将被转发到您的一台机器,A 或 B,这将是负责响应。

    部署

    为了在 Docker 中部署我们之前的配置,我们首先需要启动一个 Swarm 集群。为此,我们可以简单地执行命令:

    docker swarm init
    

    然后,为了部署我们的服务,我们只需要从 docker-compose.yml 和 haproxy.cfg 文件所在的同一文件夹中运行以下命令:

    TIMESTAMP=$(date +%s) docker stack deploy -c docker-compose.yml haproxy
    

    每次我们对配置(haproxy.cfg 文件)进行更改时,我们只需要运行之前的命令即可。

    此外,使用 HAProxy,我们可以进行更复杂的配置,例如根据请求路径选择服务器、使用 HTTPS、在负载均衡器中执行 SSL 卸载,甚至使用身份验证方法作为客户端证书或基本身份验证;但这超出了当前问题的范围。

    【讨论】:

      【解决方案2】:

      此示例假设您有 2 台机器 M1 和 M2,其中两台机器都为您的 Web 应用程序提供服务,而 M1 充当负载平衡器。

      使用一台机器作为 apache 网络服务器和 HAProxy 服务器来设置 HAProxy。

      因为我们的 Apache Web 服务器将在两台机器上侦听端口 80。 我们将为 HAProxy 设置端口 541,请求将来自 http://YOURIP:541/ 并将由任何一台机器提供服务。

      1. 创建纳米节点

      2. 已安装 xrdp https://linuxize.com/post/how-to-install-xrdp-on-ubuntu-18-04/

      3. 已安装 apache2

      4. 在 M2 主机文件上添加

        HAproxy 192.46.209.80

      5. 在 M1 主机文件上添加

        192.46.209.80 服务器1 192.46.209.82 server2

      6. 按照本教程设置负载平衡器https://linuxhint.com/how-to-install-and-configure-haproxy-load-balancer-in-linux/。在 M1 上安装负载均衡器

      7. 编辑 haproxy 配置文件

        sudo nano /etc/haproxy/haproxy.cfg

      在最后加上这个

      #HAProxy for web servers
      frontend web-frontend
        bind M1 IP:541
        mode http
        default_backend web-backend
      
      backend web-backend
        balance roundrobin
        server server1 M1 IP:80
        server server2 M2 IP:80
      
      1. 两台机器都安装python,关注https://medium.com/saarthi-ai/ec2apachedjango-838e3f6014ab,把虚拟环境和项目放在opt里面

      2. 在 M1 和 M2 中编辑 apache 000-default 配置文件

      <VirtualHost *:80>
              ServerAdmin webmaster@example.com
              DocumentRoot /opt/django/myproject
              ErrorLog ${APACHE_LOG_DIR}/error.log
              CustomLog ${APACHE_LOG_DIR}/access.log combined
              
        <Directory /opt/django/myproject/myproject>
            <Files wsgi.py>
                              Require all granted
                      </Files>
        </Directory>
              WSGIDaemonProcess myproject python-path=/opt/django/myproject python-home=/opt/django/myprojectenv
              WSGIProcessGroup myproject
              WSGIScriptAlias / /opt/django/myproject/myproject/wsgi.py
      
      </VirtualHost>
      
      1. 添加您的视图/网址以区分。

      每当您在后端更改某些内容时,请不要忘记重新启动 apache、django 应用服务器并在需要时重新启动 HAProxy

      sudo service apache2 restart
      sudo systemctl restart haproxy.service
      python manage.py runserver 0.0.0.0:8000
      

      现在使用 M1 的 IP 访问您的服务器,您会发现请求以循环方式提供服务。 您也可以将此 M1 IP 添加为您的域服务提供商中的 A 记录。因此,当我输入“www.yourwebsite.com”时,它会直接进入您的负载均衡器。

      【讨论】:

        猜你喜欢
        • 2013-10-23
        • 2022-01-05
        • 2017-06-12
        • 1970-01-01
        • 2013-03-24
        • 2015-04-01
        • 2014-03-26
        • 1970-01-01
        • 2016-09-11
        相关资源
        最近更新 更多