Haproxy 2.2.3 如何配置不终止SSL的HTTPS健康检查?
HAProxy 不终止SSL的HTTPS健康检查配置修正
问题根因
- 健康检查为HAProxy主动发起的独立连接,无前端客户端请求上下文,
ssl_fc_sni变量无法获取有效值,导致SNI传递异常 - 原健康检查Host头为
google.com,Google对该域名的根请求默认返回301跳转至www.google.com,而原规则仅识别200状态码,因此报错 - 部分server配置逻辑错误:对80明文端口启用
check-ssl、对443端口不启用SSL握手,均会导致校验失败 - frontend指定的后端名与实际定义的后端名不匹配,影响流量转发
修正步骤
1. 健康检查规则调整
二选一即可:
- 匹配正确目标Host,直接返回200:
option httpchk http-check send hdr host www.google.com meth GET uri / ver HTTP/1.1 http-check expect status 200
- 保留原Host,允许301跳转状态:
option httpchk http-check send hdr host google.com meth GET uri / ver HTTP/1.1 http-check expect status 200,301
2. Server参数修正
所有需做HTTPS健康检查的server,统一调整为以下格式,删除冗余错误参数:
server <节点名> <节点IP:业务端口> check inter 15s check port 443 check-ssl check-sni www.google.com
参数说明:
check port 443:健康检查统一发往后端443端口,禁止对80端口启用SSL参数check-ssl:健康检查先完成TLS握手,再发送HTTP检测请求check-sni www.google.com:为健康检查指定固定SNI值,无需引用业务流量变量
3. 后端名称匹配
将frontend中default_backend backend1修改为与实际后端名(当前为Backends)一致,或把后端名改为backend1,避免流量转发失败。
排查说明
- 若仍报301错误:检查Host头是否与测试站点完全一致,避免触发跳转
- 若报SSL握手失败:确认
check port为443,已启用check-ssl且SNI值正确 - 若报连接超时:检查后端443端口网络连通性,防火墙是否放通HAProxy健康检查的源IP
全局已配置ssl-server-verify none,无需额外添加本地证书或CA文件,即可跳过后端证书校验,符合需求。
内容的提问来源于stack exchange,提问作者Tomas Katlauskas
相关产品推荐
相关产品推荐

