<p>HAProxy 通过 SSL 终止代理 HTTPS 流量,需编译启用 OpenSSL、合并证书与私钥为 PEM 文件、配置 frontend 启用 ssl 绑定并重定向 HTTP,backend 转发明文 HTTP 并添加 X-Forwarded-* 头。</p>

HAProxy 代理 HTTPS 流量并卸载 SSL(即 SSL 终止),核心是让 HAProxy 在前端解密 HTTPS 请求,转为明文 HTTP 转发给后端服务器。这种方式能显著降低后端 Web 服务器的 CPU 压力,统一管理证书,也便于基于 HTTP 头、路径等做精细路由。
确认 HAProxy 支持 OpenSSL
SSL 终止要求 HAProxy 编译时启用了 OpenSSL 支持。运行以下命令验证:
-
haproxy -vv —— 查看编译参数,确认含
USE_OPENSSL=1 -
ldd $(which haproxy) | grep ssl —— 应输出类似
libssl.so.10 => /lib64/libssl.so.10
若无 OpenSSL 支持,需重新编译:下载源码后执行 make TARGET=linux26 USE_OPENSSL=1 ADDLIB=-lz && make install(TARGET 根据 uname -r 输出调整,如 5.10+ 可用 linux-glibc)。
准备证书 PEM 文件
HAProxy 要求证书与私钥合并为单个 PEM 文件,且必须包含完整证书链(如有中间 CA):
- 将域名证书(
domain.crt)、私钥(domain.key)及中间证书(ca-bundle.crt)按顺序拼接: cat domain.crt ca-bundle.crt domain.key > /etc/haproxy/ssl/domain.pem- 设置严格权限:
chmod 600 /etc/haproxy/ssl/domain.pem,仅 root 可读
配置 frontend 实现 SSL 终止
在 /etc/haproxy/haproxy.cfg 中定义 HTTPS 前端,关键点如下:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 使用
mode http(非 tcp),才能解析 HTTP 层信息(如 Host、Path) -
bind *:443 ssl crt /etc/haproxy/ssl/domain.pem—— 指定 PEM 路径 - 添加重定向规则,强制 HTTP 流量跳转 HTTPS:
redirect scheme https if !{ ssl_fc }(放在 frontend 内) - 建议添加头信息,告知后端原始协议:
http-request set-header X-Forwarded-Proto https
示例片段:
frontend https_front
bind *:443 ssl crt /etc/haproxy/ssl/domain.pem
http-request set-header X-Forwarded-Proto https
redirect scheme https if !{ ssl_fc }
default_backend web_servers
配置 backend 转发明文 HTTP
后端服务器只需监听 HTTP(如 80 端口),无需配置 SSL:
-
mode http必须与 frontend 一致 - 可启用健康检查(
check)和会话保持(如cookie SERVERID insert) - 若后端需识别客户端真实 IP,确保 HAProxy 添加
X-Forwarded-For头:option forwardfor
示例:
backend web_servers
mode http
option forwardfor
balance roundrobin
server app1 10.0.1.10:80 check
server app2 10.0.1.11:80 check
配置完成后,执行 haproxy -f /etc/haproxy/haproxy.cfg -c 校验语法,再 systemctl reload haproxy 生效。不复杂但容易忽略权限和 PEM 合并顺序。

















