容器内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 | docker run --rm -it curlimages/curl /bin/sh |
curlimages/curl是官方轻量 curl 镜像,支持各种平台,适合网络调试。