HAproxy
HAProxy 是一个免费、非常快速、可靠的解决方案,为 TCP 和 HTTP 应用提供高可用性、负载均衡和代理服务。它特别适合流量非常大的网站,并为世界上许多访问量最大的网站提供支持。多年来,它已成为事实上的标准开源负载均衡器,现已包含在大多数主流 Linux 发行版中,并且通常在云平台中作为默认部署。
安装
运行
启用 haproxy.service。可以通过以 root 身份重新加载 haproxy.service 来实时重新加载 HAProxy 的配置。
配置
在 /etc/haproxy/haproxy.cfg 中有一个示例配置文件。根据您的需求进行编辑,然后启动 haproxy.service。
通用配置
ACLs
HAProxy 支持 ACL(访问控制列表),可用于测试条件并根据测试结果执行给定操作。典型的 ACL 如下所示:
/etc/haproxy/haproxy.cfg
acl photo_page path_beg /photos
在这种情况下,如果用户的请求路径以 /photos 开头,则匹配 ACL。
后端
在 HAProxy 术语中,**后端 (backends)** 是将接收转发请求的服务器或一组服务器。后端可以基于多种负载均衡算法进行负载均衡,包括:
- 轮询 (Round-robin)
- 静态轮询(也称为加权轮询)
- 最少连接 (Least connections)
示例如下的后端配置可能如下所示:
/etc/haproxy/haproxy.cfg
backend http-in balance roundrobin server s1 web1.example.com:80 check server s2 web2.example.com:80 check
前端
**前端 (Frontends)** 用于定义如何将请求转发到后端。它们包括以下内容:
- IP 地址和端口
- ACLs
use_backend规则
健康检查 (Health checks)
当一个后端使用 check 选项声明时,HAProxy 会在启动和预定间隔检查后端是否可用于处理转发的请求。如果后端未能通过健康检查,它将被移出轮换,直到它再次被视为健康(即通过健康检查)。
默认情况下,HAProxy 会尝试与后端建立 TCP 连接来确定健康状况。
如果大量后端使用 check 选项声明,HAProxy 会在启动时查询所有后端,这可能会延迟启动时间。
与 systemd 一起日志记录
要配置 HAproxy 使用 systemd 的 /dev/log 兼容套接字,请在您的配置文件中的 global 部分添加以下内容。
log /dev/log local0 info
如果您在全局配置中使用 chroot 选项,则需要将套接字绑定到 chroot 环境中。
为此,我们将使用一个 systemd.mount(5) 单元。使用以下命令生成单元名称:
# systemd-escape --suffix=mount --path /var/lib/haproxy/dev/log
我们希望在 journald 启动后立即将 /dev/log 挂载到 chroot 中。创建一个替换单元文件:
/etc/systemd/system/var-lib-haproxy-dev-log.mount
[Unit] Requires=systemd-journald.service Description=/Expose Systemd Log for HAProxy [Mount] What=/dev/log Where=/var/lib/haproxy/dev/log Type=none Options=bind
创建挂载文件后,是时候扩展原始服务单元,使其正确挂载所有内容了。为 haproxy.service 使用一个drop-in 文件并添加:
/etc/systemd/system/haproxy.service.d/override.conf
[Unit] Requires=var-lib-haproxy-dev-log.mount
执行 TLS/SSL 终止
要使用 haproxy 作为 TLS 终止器,您需要在 frontend 部分中设置:
bind :80 bind :443 ssl crt /path/to/combined/cert
cat certificate-full-chain certificate-private-key > combined-cert。bind :443 行的末尾添加 alpn h2,http/1.1。HTTP 重定向到 HTTPS
在您的 frontend 部分设置:
redirect scheme https code 301 if !{ ssl_fc }
类似虚拟主机的配置
假设您有两个后端:foo 和 bar,每个后端都只应处理特定域的请求。为了在您的 frontend 部分实现此目的,您可以配置:
use_backend foo-backend if { hdr(host) -i foo.example.com || hdr(host) -i www.foo.example.com }
use_backend bar-backend if { hdr(host) -i bar.example.com || hdr(host) -i www.bar.example.com }