向AWS ALB发请求遇400错误,健康检查失败求助
问题分析与修正方案
一、Python POST请求的400错误原因及修正
你的Python代码存在两个关键HTTP格式错误:
- HTTP头部行存在前导空格
定义headers时,每一行前面的四个空格会被当作头部名称的一部分,违反HTTP规范,导致ALB无法正确解析请求,必须移除所有前导空格。 - HTTP头部与Body的分隔符不规范
HTTP协议要求头部结束后必须用\r\n\r\n(两个CRLF)分隔头部和Body,原代码中的换行格式不符合标准,且前导空格进一步破坏了分隔逻辑。 - Content-Type设置不符合数据格式
发送JSON数据时,应设置为application/json而非text/plain,虽不是400的直接触发原因,但符合HTTP规范。
修正后的Python代码:
import socket import json headers = """\ POST / HTTP/1.1 Content-Type: {content_type} Content-Length: {content_length} Host: {host} Connection: close """ post_dict = {"totalPartitionCount": 3} body = json.dumps(post_dict).encode("utf-8") header_bytes = headers.format( content_type="application/json", content_length=len(body), host=f"{albAddr}:8080" ).encode('utf-8') payload = header_bytes + body s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((albAddr, 8080)) s.sendall(payload) # 后续接收响应逻辑...
二、Java健康检查响应失败的原因及修正
你的Java健康检查响应不符合HTTP规范,缺少必要的响应头部和正确的结束分隔符:
- 仅发送响应行,无任何头部
HTTP响应必须包含至少一个头部(如Content-Length: 0),否则ALB无法识别为有效响应。 - 响应结束无空行分隔
响应行之后需要先发送头部,再用\r\n\r\n结束头部部分(即使没有Body内容)。
修正后的Java代码:
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class HealthCheckServer { public static void main(String[] args) throws IOException { ServerSocket s = new ServerSocket(8081); while (true) { Socket sock = s.accept(); System.out.println("Sending Status OK..."); // 标准HTTP响应结构:响应行 + 头部 + 空行结束 String httpResponse = "HTTP/1.1 200 OK\r\n" + "Content-Length: 0\r\n" + "Connection: close\r\n" + "\r\n"; byte[] out = httpResponse.getBytes(StandardCharsets.UTF_8); try { sock.getOutputStream().write(out); sock.getOutputStream().flush(); // 确保数据完全发送 } catch (IOException e) { System.out.println("Error in Writing Health Check Response"); } System.out.println("OK status sent."); sock.close(); } } }
额外说明
结合你提供的AWS健康检查配置(路径/、端口8081),修正后的Java响应完全符合ALB对健康检查的HTTP格式要求,可解决健康检查失败问题。
内容的提问来源于stack exchange,提问作者carsona
相关产品推荐
相关产品推荐

