我们在亚马逊上有一个负载均衡器,可以平衡 4 台服务器。当向负载均衡器发送特定的 HTTP 请求时,我得到 Http 错误代码 400。但是当我直接向每台服务器发送相同的请求时,我得到 Http 200 OK。使用平衡器时,其他请求工作正常。
有任何想法吗?
谢谢。
我们在亚马逊上有一个负载均衡器,可以平衡 4 台服务器。当向负载均衡器发送特定的 HTTP 请求时,我得到 Http 错误代码 400。但是当我直接向每台服务器发送相同的请求时,我得到 Http 200 OK。使用平衡器时,其他请求工作正常。
有任何想法吗?
谢谢。
不知道这是否会帮助你,但我遇到了类似的问题。我使用的是 jMeter,当通过 AWS 负载均衡器访问我的实例时,我总是会得到:HTTP/1.1 400 BAD_REQUEST。经过大量调试后,我发现我正在发送一个空标头(没有名称也没有值),因为我在 jMeter 的 HTTP 标头管理器中有一个空行。因此,我认为,AWS ELB 会检查一些标头,并返回 HTTP 400,即使直接向我的实例发出相同的请求,我也没有遇到任何问题。我不知道这是否会帮助你,但你应该仔细检查你的标题是否有像这样的愚蠢错误:D
我遇到了类似的问题,这是由于 ALB 不接受小写的 HTTP 方法引起的。
GET http://myhost.com/foo -> HTTP 200
get http://myhost.com/foo -> HTTP 400
就我而言,这是标题问题。
ELB-HealthChecker 正在向我的 Web 服务器发送健康检查请求,而 nginx 回复了 400。
问题是 ELB-HealthChecker 没有随请求发送标头。根据您的网络服务器的配置,这可能会返回 400 错误代码。
要检查是否是这种情况,请使用 curl 复制“no headers”请求:
curl -I -H 'User-Agent:' -H 'Accept:' -H 'Host:' http://yourservice/health/
解决方案是配置将返回 200 的 nginx 端点,而不管请求标头是否存在:
location = /health/ { return 200; }
在我的情况下,我的端口 443 的目标组使用 HTTP 协议而不是 HTTPS,我得到“客户端使用 HTTP 连接到 HTTPS 服务器”