backend 服务尝试连接 qdrant 容器,但失败了,返回 502 Bad Gateway 问题排查
遇到的问题是:
backend 报错:502 Bad Gateway 来自 Qdrant
→ 导致接口 `/api/chat` 返回 500 Internal Server Error
并且日志中提示:
QDRANT_URL=== http://qdrant:6333
✅ 问题分析
这个错误的根本原因是:
你的 backend 服务尝试连接 qdrant 容器,但失败了,返回 502 Bad Gateway。
502 是网关错误,意味着请求到达了目标地址(qdrant),但是 qdrant 自己内部没能正常处理,可能根本没起来或者端口挂了。
✅ 核心排查思路
现在的 Docker 服务大概率是通过 docker-compose.yml
启动的,我们要排查 Qdrant 是否正常启动:
① 检查 Qdrant 服务是否正在运行:
docker ps --filter "name=qdrant"
应该看到类似:
CONTAINER ID IMAGE NAME ... STATUS
abc123 qdrant/qdrant qdrant ... Up ...
如果没有 Up
,说明没启动成功。
② 查看 Qdrant 容器的启动日志:
docker-compose logs qdrant
看是否有类似错误:
- Bind failed
- Permission denied
- Port already in use
- Panic 等异常
③ 验证 Qdrant 是否可以被访问:
进入 backend
容器内,使用 curl 测试:
docker exec -it backend sh
apk add curl # 如果没有 curl# 测试连接 qdrant 的接口
curl http://qdrant:6333/collections
预期返回应该是 JSON(即使没有 collection 也会有一个空结构)。如果返回的是空的或超时,说明 qdrant 没起来或不能访问。
返回:
ubuntu@VM-96-14-ubuntu:~/rag-saas$ curl http://localhost:6333/collections
{"result":{"collections":[]},"status":"ok","time":9.408e-6}
ubuntu@VM-96-14-ubuntu:~/rag-saas$ curl http://159.75.85.9:6333/collections
{"result":{"collections":[]},"status":"ok","time":3.616e-6}
发的两个 curl
请求都返回了有效结果,说明:
- 🟢 Qdrant 服务在本地(
localhost:6333
)运行正常。 - 🟢 Qdrant 服务也已经成功通过公网 IP 对外暴露(
159.75.85.9:6333
)。 - ✅ 当前没有任何 collection(即还没创建向量集合),一切清爽、干净!
但是我现在的架构如下:
- 我本地代码(rag-saas) 是通过 poetry run generate 来向 Qdrant 插入向量数据的,generate 脚本是项目中
pyproject.toml
定义的一个命令; - Qdrant 服务 是运行在 Docker 容器中的(通过 docker-compose up 启动);
- 我希望在云服务器上也完成向量插入的工作,但Qdrant 宿主机不再重复安装依赖,也不想装这么多,因为我空间小。
如果不想在云服务器上安装 poetry
,但又想执行 poetry run generate
的等效功能。
以下是pyproject.toml
配置:
[tool.poetry.scripts]
generate = "app.api.chat.engine.generate:generate_datasource"
说明 generate
其实只是运行了一个 Python 函数:
# 路径:app/api/chat/engine/generate.py
# 函数名:generate_datasource()
问题的原因是:qdrant中没有插入任何数据,没有生成qdrant实例。
解决办法
其实完全可以在 backend
容器中(另外一个容器,已经安装了程序运行所需的各种库和包依赖) 执行 generate_datasource()
的命令,而且这样做反而是最推荐的方式之一,因为:
✅ 优点
- 容器里已经安装好依赖(如 FastAPI、qdrant-client 等),不需要你在宿主机再装。
- 环境一致性更好,不会出现“我本地能跑,云服务器跑不了”的问题。
- 容器和宿主机解耦,节省宿主机空间。
✅ 操作步骤(以容器名为 backend
为例)
sudo docker exec -it backend bash
表示以交互方式(interactive)进入名为 backend 的正在运行的 Docker 容器的命令行环境
然后:
find . -name generate.py
以下截图是没有进入任何容器的路径信息展示:
sudo docker exec -it backend bash
表示以交互方式(interactive)进入名为 backend 的正在运行的 Docker 容器的命令行环境
以下截图是进入backend Docker 容器
之后的路径信息展示:
从这个输出:
/app
/app/app
可以看出你代码的根目录是 /app
,而且代码包是 /app/app
,也就是说你模块的路径像这样:
app.api.chat.engine.generate
✅ 现在你可以执行以下命令来运行 generate_datasource()
:
python -c "from app.api.chat.engine.generate import generate_datasource; generate_datasource()"
🔁 操作流程完整示例(假设容器名为 backend
):
✅ 方法一:进入容器后执行
sudo docker exec -it backend bash
cd /app
python -c "from app.api.chat.engine.generate import generate_datasource; generate_datasource()"
✅ 方法二:一行命令直接运行(推荐)
sudo docker exec backend python -c "from app.api.chat.engine.generate import generate_datasource; generate_datasource()"
🧠 温馨提示
如果你运行时报错类似 ModuleNotFoundError: No module named 'app'
,说明 Python 的工作目录不对。
这时候你可以把 PYTHONPATH
加进去:
sudo docker exec backend bash -c "cd /app && PYTHONPATH=. python -c 'from app.api.chat.engine.generate import generate_datasource; generate_datasource()'"
或者:
sudo docker exec backend env PYTHONPATH=/app python -c "from app.api.chat.engine.generate import generate_datasource; generate_datasource()"