将 HAProxy 负载均衡器与 apache 网络服务器一起使用
Using HAProxy load balancer with apache web server
我试图在我的网络服务器前设置一个负载平衡器,以将请求重定向到任何一台机器。我知道 Nginx 本身可以做到这一点。但我想同样使用 HAProxy 负载均衡器。我在云上有 2 台机器为网站提供服务,独立使用各个机器的 IP 地址。现在我想要一个负载均衡器,它将首先接收请求,然后将其转发到我的任何具有相同 django 代码的两台机器中,基本上我想让我的系统分布式。
我怎样才能达到同样的效果?
首先,您提到您有两台使用 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-Machine 中部署 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-Machine 的任何位置,假设在 /srv/docker/haproxy
.
下
如果您想完全避免 Docker,您可以通过包管理系统安装 HAProxy,但我强烈建议将其容器化。
要直接在您的发行版上安装它,只需 运行:
- Ubuntu 17.04+
sudo apt-get install haproxy
- 软呢帽 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 台机器 M1 和 M2,两台机器都为您的 Web 应用程序提供服务,而 M1 充当负载均衡器。
使用一台机器作为 apache 网络服务器和 HAProxy 服务器设置 HAProxy。
因为我们的 Apache Web 服务器将在两台机器上侦听端口 80。
我们将为 HAProxy 设置端口 541,请求将到达 http://YOURIP:541/ 并将由任何一台机器提供服务。
创建纳米节点
已安装 xrdp https://linuxize.com/post/how-to-install-xrdp-on-ubuntu-18-04/
已安装 apache2
在 M2 主机文件上添加
HA代理192.46.209.80
在 M1 主机文件上添加
192.46.209.80 服务器 1
192.46.209.82 服务器 2
按照本教程设置负载平衡器 https://linuxhint.com/how-to-install-and-configure-haproxy-load-balancer-in-linux/。在 M1
上安装负载均衡器
编辑 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
在两台机器上安装python,按照https://medium.com/saarthi-ai/ec2apachedjango-838e3f6014ab,将虚拟环境和项目放在opt
里面
编辑 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>
- 添加您的 views/urls 进行区分。
每当您在后端更改某些内容时,请不要忘记重新启动 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”时,它会直接进入您的负载均衡器。
我试图在我的网络服务器前设置一个负载平衡器,以将请求重定向到任何一台机器。我知道 Nginx 本身可以做到这一点。但我想同样使用 HAProxy 负载均衡器。我在云上有 2 台机器为网站提供服务,独立使用各个机器的 IP 地址。现在我想要一个负载均衡器,它将首先接收请求,然后将其转发到我的任何具有相同 django 代码的两台机器中,基本上我想让我的系统分布式。
我怎样才能达到同样的效果?
首先,您提到您有两台使用 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-Machine 中部署 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-Machine 的任何位置,假设在 /srv/docker/haproxy
.
如果您想完全避免 Docker,您可以通过包管理系统安装 HAProxy,但我强烈建议将其容器化。
要直接在您的发行版上安装它,只需 运行:
- Ubuntu 17.04+
sudo apt-get install haproxy
- 软呢帽 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 台机器 M1 和 M2,两台机器都为您的 Web 应用程序提供服务,而 M1 充当负载均衡器。
使用一台机器作为 apache 网络服务器和 HAProxy 服务器设置 HAProxy。
因为我们的 Apache Web 服务器将在两台机器上侦听端口 80。 我们将为 HAProxy 设置端口 541,请求将到达 http://YOURIP:541/ 并将由任何一台机器提供服务。
创建纳米节点
已安装 xrdp https://linuxize.com/post/how-to-install-xrdp-on-ubuntu-18-04/
已安装 apache2
在 M2 主机文件上添加
HA代理192.46.209.80
在 M1 主机文件上添加
192.46.209.80 服务器 1 192.46.209.82 服务器 2
按照本教程设置负载平衡器 https://linuxhint.com/how-to-install-and-configure-haproxy-load-balancer-in-linux/。在 M1
上安装负载均衡器编辑 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
在两台机器上安装python,按照https://medium.com/saarthi-ai/ec2apachedjango-838e3f6014ab,将虚拟环境和项目放在opt
里面编辑 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>
- 添加您的 views/urls 进行区分。
每当您在后端更改某些内容时,请不要忘记重新启动 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”时,它会直接进入您的负载均衡器。