You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向AWS ALB发请求遇400错误,健康检查失败求助

问题分析与修正方案

一、Python POST请求的400错误原因及修正

你的Python代码存在两个关键HTTP格式错误:

  1. HTTP头部行存在前导空格
    定义headers时,每一行前面的四个空格会被当作头部名称的一部分,违反HTTP规范,导致ALB无法正确解析请求,必须移除所有前导空格。
  2. HTTP头部与Body的分隔符不规范
    HTTP协议要求头部结束后必须用\r\n\r\n(两个CRLF)分隔头部和Body,原代码中的换行格式不符合标准,且前导空格进一步破坏了分隔逻辑。
  3. 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规范,缺少必要的响应头部和正确的结束分隔符:

  1. 仅发送响应行,无任何头部
    HTTP响应必须包含至少一个头部(如Content-Length: 0),否则ALB无法识别为有效响应。
  2. 响应结束无空行分隔
    响应行之后需要先发送头部,再用\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:24:08