我们在亚马逊上有一个负载均衡器,可以平衡4台服务器。 当向负载均衡器发送特定HTTP请求时,我得到Http错误代码400。 但是当我直接向每个服务器发送相同的请求时,我得到了Http 200 OK。 使用平衡器时,其他请求工作正常。
任何想法?
感谢。
答案 0 :(得分:5)
不知道这对你有帮助,但我遇到了类似的问题。我正在使用jMeter,当通过AWS负载均衡器访问我的实例时,我总是得到:HTTP / 1.1 400 BAD_REQUEST。 经过大量的调试后,我发现我发送的是一个空标题(没有名称,没有值),因为我在jMeter中的HTTP标头管理器中有一个空行。所以,我认为,AWS ELB会进行一些标头检查,并返回HTTP 400,即使很难,我也没有任何问题直接向我的实例提出相同的请求。我不知道这是否会对你有所帮助,但你应该仔细检查你的标题是否有类似这样的愚蠢错误:D
答案 1 :(得分:2)
I had a similar problem to this, and it was caused by ALB not accepting HTTP methods that are in lower case.
GET http://myhost.com/foo -> HTTP 200
get http://myhost.com/foo -> HTTP 400
答案 2 :(得分:0)
400显示错误的请求..您确定您没有向ELB发送任何恶意请求吗?您是否正确配置了ELB,即将端口映射(ELB侦听端口80)到服务器上的正确端口(可能是tomcat上的端口8080)
另外,我建议您检查ELB上的选项卡实例。并确保所有4台服务器都显示为“In Service”。
答案 3 :(得分:0)
在我看来,这是标题问题。
ELB-HealthChecker正在向我的Web服务器发送健康检查请求,nginx回复了400。
问题是ELB-HealthChecker没有发送带有请求的标头。 根据您的网络服务器的配置,这可能会返回400错误代码。
要检查是否存在这种情况,请使用curl复制“ no headers”请求:
curl -I -H 'User-Agent:' -H 'Accept:' -H 'Host:' http://yourservice/health/
解决方案是配置nginx端点,无论请求标头是否存在,该端点都将返回200:
location = /health/ { return 200; }
答案 4 :(得分:0)
在我的例子中,我的端口 443 的目标组使用的是 HTTP 协议而不是 HTTPs,我得到了“客户端使用 HTTP 连接到 HTTPS 服务器”