backend 服务尝试连接 qdrant 容器,但失败了,返回 502 Bad Gateway 问题排查

发布于:2025-06-06 ⋅ 阅读:(21) ⋅ 点赞:(0)

遇到的问题是:

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() 的命令,而且这样做反而是最推荐的方式之一,因为:


✅ 优点

  1. 容器里已经安装好依赖(如 FastAPI、qdrant-client 等),不需要你在宿主机再装。
  2. 环境一致性更好,不会出现“我本地能跑,云服务器跑不了”的问题。
  3. 容器和宿主机解耦,节省宿主机空间。

✅ 操作步骤(以容器名为 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()"

网站公告

今日签到

点亮在社区的每一天
去签到