首先,您提到您有两台使用 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,但我强烈建议将其容器化。
要直接在您的发行版上安装它,只需运行:
sudo apt-get install haproxy
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 卸载,甚至使用身份验证方法作为客户端证书或基本身份验证;但这超出了当前问题的范围。