ALB目标组使用HTTP/2时健康检查失败问题排查请求
排查ALB HTTP/2目标组健康检查失败的步骤
针对你遇到的问题,以下是具体的排查方向,按优先级排序:
1. 确认目标组与健康检查的协议配置匹配
- 检查目标组的协议版本是否明确设置为
HTTP/2,同时健康检查的协议也要选择HTTP/2(ALB默认会匹配,但需手动确认,避免配置遗漏) - 如果目标组是明文HTTP(非HTTPS),后端容器必须支持
h2c(明文HTTP/2)协议——ALB的HTTP/2目标组不会自动做协议转换,若后端只支持HTTP/1.1,健康检查必然失败 - 验证健康检查端口与容器实际监听端口一致:比如容器在
8080端口监听h2c,目标组健康检查端口不能设为443(除非容器配置了TLS证书并监听443)
2. 验证容器的HTTP/2服务可用性
直接在容器所在的EC2/ECS实例上,用curl测试HTTP/2请求,确认服务本身能正常响应:
- 明文h2c测试:
curl -v --http2 http://localhost:[容器端口]/[健康检查路径] - TLS加密HTTP/2测试:
curl -v --http2 https://localhost:[容器端口]/[健康检查路径]
如果测试失败,说明容器的Web服务器未正确启用HTTP/2:- Nginx:需在监听端口配置中添加
http2 on;(TLS场景)或listen [端口] http2;(h2c场景),同时确保OpenSSL版本支持ALPN(1.0.2及以上) - Spring Boot:需在配置文件中开启
server.http2.enabled=true,明文场景额外添加server.http2.h2c-enabled=true - 其他Web服务器:参照官方文档确认HTTP/2启用配置
- Nginx:需在监听端口配置中添加
3. 检查网络与安全配置
- 安全组:确认ALB的安全组允许访问容器监听端口,目标实例的安全组允许ALB安全组的入站流量
- NACL:如果使用VPC网络ACL,需确保入站/出站规则允许ALB与目标实例之间的端口通信(包括健康检查端口)
- ALB类型:若ALB是HTTPS型,需确认目标容器的TLS配置有效(证书未过期、域名匹配),否则ALB无法建立HTTP/2连接
4. 核对健康检查的路径与响应规则
- 确认健康检查路径正确:比如容器的健康端点是
/healthz,目标组不能设为/(若/返回非2xx状态码) - 检查预期响应码范围:如果健康端点固定返回
200,不要用默认的200-399范围,避免因其他非预期码触发检查失败 - 调整健康检查超时/间隔:若容器启动或响应较慢,可适当调大超时时间(比如从5秒改为10秒)、延长间隔,避免误判
5. 日志排查
- 开启ALB访问日志,查看健康检查请求的详细记录:日志会包含请求方法、路径、响应码、错误类型(如
connection_timeout、protocol_error) - 查看容器的Web服务器日志或实例系统日志,确认是否收到ALB的健康检查请求,以及是否有协议不兼容、连接被拒绝等错误信息
补充:关于HTTP/2转HTTP/1.1时的net::ERR_HTTP2_PROTOCOL_ERROR
这个错误并非ALB与目标组的兼容性问题,而是后端返回的响应不符合HTTP规范,导致ALB在将HTTP/1.1响应转换为HTTP/2响应时触发协议错误。常见原因包括:
- 响应头存在非法字符或格式错误(比如换行符不规范)
- 响应内容长度与
Content-Length头不匹配 - 后端返回了无效的HTTP状态码
禁用HTTP/2后,浏览器对HTTP/1.1的兼容性更宽松,所以能正常显示原始错误。
内容的提问来源于stack exchange,提问作者Farooqi Afridi
相关产品推荐
相关产品推荐

