HAproxy

来自 ArchWiki

HAProxy 是一个免费、非常快速且可靠的解决方案,为 TCP 和基于 HTTP 的应用程序提供高可用性、负载均衡和代理服务。它特别适用于超高流量的网站,并为世界上访问量最大的网站中的相当一部分提供支持。多年来,它已成为事实上的标准开源负载均衡器,现在已与大多数主流 Linux 发行版一起发布,并且通常默认部署在云平台中。

安装

安装 haproxy 软件包。

运行

启用 haproxy.service 服务。HAProxy 的配置可以通过 重新加载 haproxy.service 服务(以 root 权限)进行实时重载。

配置

/etc/haproxy/haproxy.cfg 中提供了一个配置示例。编辑它以满足您的需求,然后启动 haproxy.service 服务。

通用配置

ACLs

HAProxy 支持 ACL,可用于测试条件并根据这些测试的结果执行给定的操作。一个典型的 ACL 可以写成如下形式

/etc/haproxy/haproxy.cfg
acl photo_page path_beg /photos

在这种情况下,如果用户的请求路径以 /photos 开头,则 ACL 匹配。

后端

在 HAProxy 术语中,后端 是将接收转发请求的服务器或服务器集。后端可以基于多种负载均衡算法来平衡负载,包括

  • 轮询
  • 静态轮询(也称为加权轮询)
  • 最少连接

一个后端示例可以写成如下形式

/etc/haproxy/haproxy.cfg
backend http-in
   balance roundrobin
   server s1 web1.example.com:80 check
   server s2 web2.example.com:80 check

前端

前端 用于定义应如何将请求转发到后端。它们由以下部分组成

  • IP 地址和端口
  • ACLs
  • use_backend 规则

健康检查

当使用 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

我们想要将 /dev/log 挂载到 chroot 中,但在 journald 启动之后。创建一个替换单元文件

/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.servicedrop-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
提示: 要添加对 HTTP/2 的支持,请在 bind :443 行的末尾添加 alpn h2,http/1.1
将 HTTP 重定向到 HTTPS

在您的 frontend 部分中设置

redirect scheme https code 301 if !{ ssl_fc }

类似虚拟主机的配置

假设您有两个后端:foobar,并且每个后端都应仅处理特定域的请求。为了在您的 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 }

参见