【网络工程】HAProxy 工程:高级配置、ACL 与运维

💡 原文中文,约19300字,阅读约需46分钟。
📝

内容提要

HAProxy是专为负载均衡和代理设计的开源软件,配置分global、defaults、frontend、backend等段,支持TCP/HTTP模式。其ACL规则引擎强大,支持路径、Header、IP等多条件匹配。健康检查灵活,Runtime API可动态管理服务器,多线程模型提升性能,支持SSL终止和HTTP/2。相比Nginx,HAProxy在代理场景功能更深,适合大规模零停机运维。

🔎

延伸解读

HAProxy 与 Nginx 的定位差异

HAProxy 从设计之初就专注于代理和负载均衡,不提供静态文件服务,而 Nginx 则兼具 Web 服务器和反向代理功能。在纯代理场景下,HAProxy 提供了 Nginx 不具备的高级特性,如 Runtime API 动态管理、更细粒度的健康检查和更强大的 ACL 规则引擎。选择 HAProxy 还是 Nginx,取决于是否需要 Web 服务器功能,以及是否依赖这些高级代理特性。

Runtime API 实现零停机运维

HAProxy 的 Runtime API 允许通过 Unix Socket 实时查看和修改配置,无需 reload 即可调整服务器权重、上下线服务器、清除限流状态等。这在大规模部署中意味着零停机运维,例如优雅下线脚本通过 drain 模式停止新连接,等待现有连接完成后再进入维护模式,整个过程不中断服务。

Stick Table 提供灵活限流

HAProxy 的 Stick Table 支持基于 IP、URL、Cookie 等多维度限流,并可自定义计数器,比 Nginx 的 limit_req 更灵活。例如,可以分别按源 IP 和 URI 定义跟踪表,设置不同的速率阈值,实现精细的流量控制。此外,Stick Table 数据可通过 Runtime API 查看和清除,便于运维管理。

多线程模型简化状态共享

HAProxy 从 1.8 版本开始支持多线程,2.x 版本逐渐成熟。与 Nginx 的多进程模型不同,HAProxy 的多线程共享内存空间,Stick Table、统计数据等天然在线程间共享,无需配置共享内存区域。这简化了状态管理,并支持通过 nbthread 和 cpu-map 进行性能调优。

Q&A

HAProxy 和 Nginx 在定位上有什么主要区别?

HAProxy 是专为负载均衡和代理设计的开源软件,不能提供静态文件服务;而 Nginx 是 Web 服务器 + 反向代理。在代理场景中,HAProxy 提供了 Nginx 不具备的高级功能,如 Runtime API 动态管理、更细粒度的健康检查和更强大的 ACL 规则引擎。

HAProxy 的配置主要分为哪几个段?各自的作用是什么?

HAProxy 配置分为四个段:global(进程级配置,如日志、最大连接数、SSL 引擎)、defaults(默认参数,如超时、重试、日志格式)、frontend(监听入口,绑定端口、定义 ACL 规则)、backend(后端服务器池,定义负载均衡策略和健康检查)。此外还有 listen 段,是 frontend 和 backend 的合体,用于简单场景。

HAProxy 的 ACL 规则可以基于哪些条件进行匹配?

HAProxy 的 ACL 规则可以基于多种条件匹配,包括路径(前缀、后缀、正则)、Header(如 User-Agent、Content-Type)、源 IP、HTTP 方法、SSL/TLS 信息(如是否 SSL 连接、ALPN)、Cookie、时间等。

HAProxy 如何实现速率限制?与 Nginx 的 limit_req 相比有什么优势?

HAProxy 通过 Stick Table 实现速率限制,可以基于 IP、URL、Cookie 等多维度进行限制,并支持自定义计数器。相比 Nginx 的 limit_req,Stick Table 提供了更灵活和精确的控制能力。

HAProxy 的健康检查有哪些类型?

HAProxy 支持 TCP 健康检查(如简单的 TCP 连接检查或自定义 TCP 检查序列)、HTTP 健康检查(可检查状态码、响应体等)以及 Agent 健康检查(后端应用主动报告状态,可返回 ready、drain、maint 等指令)。

HAProxy 的 Runtime API 可以实现哪些运维操作?

通过 Runtime API,可以实时查看和修改配置,无需 reload。具体操作包括:查看服务器状态、将服务器设置为维护模式(maint)、排空模式(drain)、恢复(ready)、修改权重、地址、最大连接数,动态添加和删除服务器,查看流量统计、连接数、Stick Table 内容,清除限流计数,禁用/启用前端等。

HAProxy 的多线程模型有什么优势?

HAProxy 从 1.8 版本开始支持多线程,2.x 版本多线程成熟。其优势在于线程间共享内存空间,Stick Table、统计数据等天然共享,无需进程间通信机制,动态配置更新更简单,性能可线性扩展到多核。

HAProxy 如何实现 SSL 终止?

HAProxy 通过配置 frontend 的 bind 指令,指定 SSL 证书和 ALPN 协议来实现 SSL 终止。例如:bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1。支持多证书(SNI 自动选择),并可配置 SSL 重定向、HSTS 等。

HAProxy 的日志中终止状态码 'CD' 和 'SC' 分别代表什么?

终止状态码 'CD' 表示客户端主动关闭连接,常见原因是客户端超时或取消;'SC' 表示服务端关闭连接,常见原因是后端关闭连接。

🏷️

标签

➡️

继续阅读