多副本、高可用与并发故障排除
本指南旨在解决在多副本环境(如 Kubernetes、Docker Swarm)中部署 Open WebUI,或通过使用多 Worker (UVICORN_WORKERS > 1) 来提升并发处理能力时遇到的常见问题。
如果您是首次搭建扩容部署方案,建议从扩容 Open WebUI 指南开始,获取逐步的操作演示。
核心要求核对清单
在对具体错误进行排障之前,请确保您的部署满足以下针对多副本设置的绝对要求。遗漏其中任何一项都会导致系统不稳定、登录循环或数据丢失。
- 共享 Secret Key: 所有副本上的
WEBUI_SECRET_KEY必须完全一致。 - 外部数据库: 您必须使用外部 PostgreSQL 数据库(参见
DATABASE_URL)。SQLite 不支持多实例部署。 - 针对 WebSocket 使用 Redis: 必须配置
ENABLE_WEBSOCKET_SUPPORT=True和WEBSOCKET_MANAGER=redis,并配以有效的WEBSOCKET_REDIS_URL。 - 共享存储: 共享的持久化卷(如果可能的话,推荐使用 RWX / ReadWriteMany,或者确保所有副本都映射到同一个底层的
data/存储上)对于 RAG(上传文件/向量)以及生成的图像至关重要。 - 外部向量数据库(必需): 默认的 ChromaDB 使用本地基于 SQLite 的
PersistentClient,这在多 Worker 或多副本部署中是不安全的。SQLite 连接并不是 fork 安全的,多个进程并发写入会立即使 Worker 进程崩溃。您必须通过VECTOR_DB选用专用的外部向量数据库(例如 PGVector, MariaDB Vector, Milvus, Qdrant),或者将 ChromaDB 作为独立的 HTTP 服务器运行。 - 数据库会话共享(可选): 对于资源充足的 PostgreSQL 部署,可以考虑启用
DATABASE_ENABLE_SESSION_SHARING=True以提升高并发下的性能。
常见问题
1. 登录循环 / 401 Unauthorized(未授权)错误
症状:
- 您成功登录了系统,但点击下一步操作时便被登出。
- 登录后,浏览器控制台中立即显示 "Unauthorized" 或 "401" 错误。
- 日志中出现 "Error decrypting tokens"。
原因:
各个副本正在使用不同的 WEBUI_SECRET_KEY。当副本 A 签发了会话 Token (JWT) 时,副本 B 会将其拒绝,因为它无法使用自己不同的密钥去验证该 Token 的签名。
解决方案:
在所有后端副本上,将 WEBUI_SECRET_KEY 环境变量设置为相同的强随机字符串。
# Kubernetes/Compose 中的配置示例
env:
- name: WEBUI_SECRET_KEY
value: "your-super-secure-static-key-here"