Haproxy


Haproxy概念

Haproxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

Haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。

Haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。

并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

企业版提供了额外的功能,如 WAF (Web Application Firewall )、应用程序加速、高级 DDoS 保护、高级健康检查等等。

Haproxy有8种负载均衡算法(balance),分别如下:

1.balance roundrobin # 轮询,软负载均衡基本都具备这种算法

2.balance static-rr # 根据权重,建议使用

3.balance leastconn # 最少连接者先处理,建议使用

4.balance source # 根据请求源IP,建议使用

5.balance uri # 根据请求的URI

6.balance url_param,# 根据请求的URl参数'balance url_param' requires an URL parameter name

7.balance hdr(name) # 根据HTTP请求头来锁定每一次HTTP请求

8.balance rdp-cookie(name) # 根据据cookie(name)来锁定并哈希每一次TCP请求

实验准备

要实际演示 HAProxy,至少需要三个 Linux 系统。其中一个将充当 HAProxy 负载均衡器,而其余的将充当 web 服务器。

IP Address Hostname
192.168.8.23 haproxy
192.168.8.22 web1
192.168.8.21 web2

(第 1 步) 安装 HAProxy 负载均衡器

第一步是在 Ubuntu 上安装 HAProxy,Ubuntu 软件库默认提供 HAProxy。

sudo apt update
sudo apt show haproxy

default-haproxy-version-ubuntu-22-04

安装haproxy

sudo apt install -y haproxy

安装完成后,确认 HAProxy 的版本,如图所示。

haproxy -v

Haproxy-version-ubuntu-22-04

安装后,HAProxy 服务默认启动,监听 TCP 端口 80。如果需要验证 HAProxy 是否正在运行,请执行命令

sudo systemctl status haproxy

Haproxy-Status-Ubuntu-Linux

建议将服务随系统自动启动,请执行命令

sudo systemctl enable haproxy

(第 2 步) 配置 HAProxy

下一步是配置 Haproxy,用以在两个 Web 服务器之间均匀分配流量。Haproxy 的配置文件为 /etc/haproxy/haproxy.cfg

在对文件进行更改之前,首先做一个备份。

sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bk

然后使用文本编辑器打开文件。

sudo vim /etc/haproxy/haproxy.cfg

Haproxy 配置文件由以下几个部分组成

  • global: 它包含处理性能调优和安全性的系统范围设置。
  • defaults: 此部分包含无需额外定制即可正常工作的设置。这些设置包括超时和错误报告配置。
  • frontend and backend: 此部分定义前端和后端设置。对于前端,我们将 HAProxy 服务器定义为前端,它将向后端服务器 (web 服务器) 分发请求。我们还将 HAProxy 设置为使用轮询负载均衡标准来分配流量。
  • listen: 这是一个可选设置,使您能够启用 HAProxy 统计信息的监控。

现在定义前端和后端设置

frontend test
   bind 192.168.8.23:80
   stats uri /haproxy?stats
   default_backend web-servers

backend web-servers
    balance roundrobin
    server web1 192.168.8.21:80
    server web2 192.168.8.22:80

在这里,我们已经将 HAProxy 服务器和 web 服务器节点配置为监听端口 80。请确保用您的设置替换 HAProxy 和 web 服务器的 IP 地址。

为了能够在浏览器中查看 HAProxy 统计信息,添加以下侦听部分。

listen stats
   bind *:8080
   stats enable
   stats uri /
   stats refresh 5s
   stats realm Haproxy\ Statistics
   stats auth test:root123

stats auth 指令为登录用户指定用户名和密码,以便在浏览器上查看统计信息。

image-20241114144936344

保存更改并退出配置文件,重新加载设置需要重启 haproxy 服务。

sudo systemctl restart haproxy

接下来编辑 /etc/hosts 文件

定义 haproxy 主服务器和 web 服务器的主机名和 IP 地址

192.168.8.23 haproxy
192.168.8.21 web1
192.168.8.22 web2

保存修改并退出

(第 3 步) 配置 Web Servers

在这一步中,我们将配置其余的 Linux 系统,它们是 web 服务器。

请登录到各 web 服务器,安装 Apache web (或者Nginx)服务器包。

sudo apt update
sudo apt install -y apache2

接下来,验证 Apache 是否在每个服务器上运行。

sudo systemctl status apache2

然后设置 apache2 服务随系统启动

sudo systemctl enable apache2

接下来,修改每个 web 服务器的 index.html 文件。

对 Web Server 1 做如下操作:

切换到 root 用户

sudo su

然后执行如下命令

# echo "<H1>Hello! This is webserver1: 192.168.8.21 </H1>" > /var/www/html/index.html

对 Web Server 2 做如下操作:

切换到 root 用户

$ sudo su

然后执行如下命令

# echo "<H1>Hello! This is webserver2: 192.168.8.22 </H1>" > /var/www/html/index.html

接下来,配置 /etc /hosts 文件。

sudo vim /etc/hosts

向每个节点添加 HAProxy 条目

192.168.8.23 haproxy

保存更改并退出配置文件

确保能够从每个 web 服务器节点 ping 通 HAProxy 服务器。

注意: 如果 web 服务器上启用了 80 端口,请确保操作系统防火墙允许 80 端口。

(第 4 步) 测试 HAProxy 负载均衡

到目前为止,我们已经成功地配置了 HAProxy 和两个后端 web 服务器。要测试您的配置是否按预期工作,请访问 HAProxy 服务器的 IP 地址。

http://192.168.8.23

当您第一次浏览时,您应该看到第一个 web 服务器的网页

在刷新后,您应该看到第二个 web 服务器的网页

这表 HAProxy 服务器通过 Round robin 算法将传入的 web 流量分布在两个 web 服务器上,从而出色地完成了负载平衡工作。

此外,您可以使用 curl 命令使用下面的 do-while 循环测试

$ while true; do curl 192.168.8.23; sleep 1; done

要查看监控统计信息,请访问以下地址

http://192.168.8.23:8080/stats

您将需要进行身份验证,因此请按照步骤 2 中指定的方式提供详细信息。

HAproxy-GUI-Login-Page

您将看到下面的页面,其中包含关于 HAProxy 服务器性能的统计数据。

Haproxy-Stats-Ubuntu-Linux