容器内curl发现curl: (1) Received HTTP/0.9 when not allowed

问题

docker-compose内多个service,相互curl调用提示:容器内curl发现 curl: (1) Received HTTP/0.9 when not allowed。

你在容器内执行:

1
curl http://192.168.10.22:8080

返回:

1
curl: (1) Received HTTP/0.9 when not allowed

这是一个非常典型的 请求到了非 HTTP 协议服务端口服务端返回了不规范的响应 的问题。

分析

进过分析是协议老版本curl不支持,新版本的是curl是没问题。

1. 尝试 curl 加详细输出看头部

1
curl -v http://192.168.10.22:8080

可能会看到如下信息:

*   Trying 192.168.10.22:8080...
* Connected to 192.168.10.22 (192.168.10.22) port 8080
> GET / HTTP/1.1
> Host: 192.168.10.22
> User-Agent: curl/7.85.0
> Accept: */*
* Received HTTP/0.9 when not allowed

这意味着目标返回的不是标准 HTTP 协议格式。


2.更强诊断方式(推荐)

如果你有 Wireshark/tcpdump 权限,可以抓包看看服务返回的是什么原始数据。

也可以用 nc(netcat)测试:

1
echo -e "GET / HTTP/1.1\r\nHost: 192.168.10.22\r\n\r\n" | nc 192.168.10.22 8080

3.总结判断

情况 说明
服务是 Redis、MySQL、gRPC 等非 HTTP 协议 你 curl 的端口错误,应换端口或换协议
服务返回非标准 HTTP 响应(如少了头部) 服务端配置问题,建议排查 Nginx/后端逻辑
curl 报 HTTP/0.9,不允许 curl 默认限制了老协议

4. 高版本curl工具容器

比如快速测试网络连通性,可以拉一个只含 curl 的容器运行:

1
docker run --rm -it curlimages/curl http://192.168.10.22:8080

或者进入容器:

1
2
3
4
docker run --rm -it curlimages/curl /bin/sh

# 检查curl版本
curl --version

curlimages/curl 是官方轻量 curl 镜像,支持各种平台,适合网络调试。