连接错误
本页汇总了常见连接问题、成因以及对应的解决方法。
🔐 HTTPS、TLS、CORS 与 WebSocket 问题
如果你在使用反向代理或 HTTPS 时遇到 Open WebUI 连接异常,问题通常与 CORS、TLS、WebSocket 或 cookie 配置不正确有关。下面是推荐的排查方式。
常见症状
如果你看到以下现象,很可能就是这一类问题:
- 聊天中返回空响应,例如
"{}" - 出现类似
"Unexpected token 'd', "data: {"id"... is not valid JSON"的错误 - 流式输出时 Markdown 显示混乱(例如可见的
##、**、格式断裂)——参见 流式响应损坏 - 浏览器控制台出现 WebSocket 连接失败
- CLI 日志中出现 WebSocket 连接失败
- 登录异常或会话问题
- 浏览器开发者工具中出现 CORS 错误
- 通过 HTTPS 访问时出现 mixed content 警告
HTTPS 与反向代理所需配置
关键环境变量
当你把 Open WebUI 放在启用了 HTTPS 的反向代理后面时,必须正确配置这些设置:
# 在首次启动前把它设为你的真实域名(OAuth/SSO 和正常运行都需要)
WEBUI_URL=https://your-open-webui-domain.com
# 如果你已经启动过 Open WebUI 也不用担心,仍然可以在管理面板中修改
# CORS 配置——对 WebSocket 功能至关重要
# 包含用户可能访问你实例的所有方式
# 请把所有 IP、hostname、domain,以及访问 Open WebUI 的协议与端口都包含进去
# 例如 localhost、127.0.0.1、0.0.0.0、你的服务器/电脑 IP、公网域名,并区分 http/https 和正确端口
CORS_ALLOW_ORIGIN="https://yourdomain.com;http://yourdomain.com;https://yourip;http://localhost:3000"
# HTTPS 下的 cookie 安全设置
# 如果不使用 HTTPS,请关闭
WEBUI_SESSION_COOKIE_SECURE=true
WEBUI_AUTH_COOKIE_SECURE=true
# 对于 OAuth/SSO,通常需要用 'lax'(strict 可能破坏 OAuth 回调)
WEBUI_SESSION_COOKIE_SAME_SITE=lax
WEBUI_AUTH_COOKIE_SAME_SITE=lax
# WebSocket 支持(如果使用 Redis)
# 如果你在正确配置以上所有内容后仍然遇到 websocket 问题,可以尝试关闭 ENABLE_WEBSOCKET_SUPPORT
# 但这不推荐用于生产,也不属于官方支持方案
# 理想做法仍然是让反向代理提供正确的 websocket 支持
ENABLE_WEBSOCKET_SUPPORT=true
WEBSOCKET_MANAGER=redis
WEBSOCKET_REDIS_URL=redis://redis:6379/1WEBUI_URL 配置说明
在使用 OAuth/SSO 之前,必须先正确设置 WEBUI_URL。由于它是持久化配置变量,只能通过以下方式修改:
- 临时设置
ENABLE_PERSISTENT_CONFIG=false - 在 管理面板 > 设置 > WebUI URL 中修改
- 在首次启动前就正确设置
CORS 配置说明
CORS_ALLOW_ORIGIN 对 WebSocket 尤其关键。如果日志中出现 "https://yourdomain.com is not an accepted origin" 或 "http://127.0.0.1:3000 is not an accepted origin",就说明该 URL 需要加入配置。多个来源使用分号分隔,并且要覆盖用户访问实例的每一种方式(域名、IP、localhost 等)。
反向代理 / SSL/TLS 配置
有关反向代理和 TLS 的具体搭建方式,请查看 相关教程。
WebSocket 故障排查
Open WebUI v0.5.0 及更高版本需要 WebSocket 支持。如果 WebSocket 不能正常工作:
- 检查反向代理配置——确认
Upgrade和Connection头已正确设置 - 确认 CORS 设置——WebSocket 连接同样遵守 CORS 策略
- 查看浏览器控制台——检查具体的 WebSocket 连接错误
- 测试直连——尝试绕过代理直接连接 Open WebUI,以隔离问题来源
- 检查 HTTP/2 与 WebSocket 的兼容问题——某些代理(如 HAProxy 3.x)默认启用 HTTP/2。如果代理使用 HTTP/2 连接客户端,而后端/应用没有正确支持 RFC 8441(WebSockets over H2),实例可能会“卡住”或不响应。
- HAProxy 修复方式:在配置中加入
option h2-workaround-bogus-websocket-clients,或强制后端连接使用 HTTP/1.1。 - Nginx 修复方式:确认 location 块中使用了
proxy_http_version 1.1;(Open WebUI 的多数 Nginx 示例默认如此)。
- HAProxy 修复方式:在配置中加入
多实例部署中,请为 WebSocket 管理配置 Redis:
ENABLE_WEBSOCKET_SUPPORT=true
WEBSOCKET_MANAGER=redis
WEBSOCKET_REDIS_URL=redis://redis:6379/1关于 Redis 配置细节,请参阅 Redis WebSocket Support。完整的多实例扩缩容实践请参阅 Scaling Open WebUI。如果你在多副本场景中遇到特定的 WebSocket 403 错误,请参见 扩缩容与高可用故障排查。
测试你的配置
要验证配置是否正常:
- 检查 HTTPS:访问你的域名,确认浏览器能识别有效证书且没有警告
- 测试 WebSocket:打开浏览器开发者工具,进入 Network 标签,筛选
WS,确认 WebSocket 连接建立成功 - 验证 CORS:检查控制台是否还有 CORS 相关错误
- 测试功能:发送一条消息,确认流式输出正常工作
快速修复清单
- ✓ 在启用 OAuth 前把
WEBUI_URL设为真实 HTTPS 域名 - ✓ 在
CORS_ALLOW_ORIGIN中配置所有可能的访问 URL - ✓ 在 HTTPS 下启用
WEBUI_SESSION_COOKIE_SECURE=true - ✓ 在反向代理中加入 WebSocket 所需头
- ✓ 在 SSL 配置中使用 TLSv1.2 或 TLSv1.3
- ✓ 正确设置反向代理中的
X-Forwarded-Proto - ✓ 配置 HTTP 到 HTTPS 重定向
- ✓ 配置 Let's Encrypt 自动续签
- ✓ 对 SSE 流式输出关闭 proxy buffering(见下文)
📝 Markdown 乱码 / 流式响应损坏
如果流式响应时出现 Markdown 渲染错乱(例如可见 ##、** 或格式断裂),但关闭流式输出后又恢复正常,这通常是 nginx proxy buffering 导致的。
常见症状
- 响应中直接显示原始 Markdown token(
##、**、###) - 粗体标记位置异常(例如
** Control:**而不是**Control:**) - 响应中随机缺词或缺段落
- 关闭流式输出后格式恢复正常
原因:Nginx 代理缓冲
启用 nginx 的 proxy buffering 后,SSE(Server-Sent Events)流会被任意重新分块。这样会把 Markdown token 从中间切开——例如 **bold** 被拆成 ** + bold + **,导致 Markdown 解析失败。
解决方案:关闭代理缓冲
在 Open WebUI 的 nginx location 块中加入以下配置:
location / {
proxy_pass http://your-open-webui-upstream;
# 关键:为 SSE 流关闭缓冲
proxy_buffering off;
proxy_cache off;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 标准代理头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}关闭代理缓冲通常也会明显提升流式速度,因为响应会逐字节直接发送给客户端,而不是被 nginx 延迟缓冲。
其他反向代理
- HAProxy:确保没有为 SSE endpoint 启用
option http-buffer-request - Traefik:检查压缩/缓冲相关 middleware 设置
- Caddy:默认通常能正确处理 SSE,但如果用了缓冲插件,也请检查
🌐 前端连接与后端连接(localhost 混淆)
Open WebUI 中有些功能提供两种配置方式:一种是用户/直连(由浏览器发起),另一种是管理员/全局(由后端发起)。它们处在完全不同的网络层级,所以同一个 URL 可能在一种方式下能用,在另一种方式下却失败。
核心规则
| 请求来源 | localhost 的含义 | 谁在使用 |
|---|---|---|
| 浏览器(客户端) | 运行浏览器的那台机器 | User Tool Servers、用户配置的终端、Direct Connections |
| 后端(服务端) | 运行 Open WebUI 的机器/容器 | Global Tool Servers、管理员配置的终端、Ollama 连接 |
为什么同一个 URL 可能一边可用、一边失败
当你把 https://myserver.com/api 添加为用户/直连连接时,URL 是由浏览器解析并直接访问的;而当你把同一个 URL 添加为管理员/全局连接时,则由 Open WebUI 后端去解析该主机名。在 Docker 容器里,这个域名甚至可能会被解析到 127.0.0.1,从而直接绕过你的反向代理。
常见症状:
- 用户侧连接正常,但管理员配置的连接报 502 Bad Gateway
- 后端日志中出现
Connect call failed ('127.0.0.1', ...) - 全局 tool server 连接超时
修复方式: 对于后端/管理员连接,请使用后端实际可达的内部 URL:
- Docker service 名称(例如
http://open-terminal:8000) host.docker.internal(从 Docker 内部访问宿主机)- 内网 IP(例如
http://192.168.1.50:8000)
这适用于 Open WebUI 中所有由后端代理的连接,不仅仅是 Open Terminal。包括 Tool Server connections、Open Terminal admin connections 以及 Ollama/OpenAI API endpoints 都遵循同样的规律。
连接 Ollama 服务器
让 Open WebUI 访问 Ollama
如果 Open WebUI 无法访问 Ollama,通常是因为 Ollama 只监听了 127.0.0.1(localhost)。请按下面修复:
- 设置
OLLAMA_HOST=0.0.0.0,让 Ollama 监听所有网络接口 - 确认该变量已在你的部署环境中生效(systemd、Docker、shell profile 等)
- 重启 Ollama 使变更生效
重启后再打开 WebUI 验证连通性。更详细说明见 Ollama 文档。
Docker 中的连接错误
如果 Docker 中的 Open WebUI 无法连接宿主机上的 Ollama:
-
调整网络设置: 在 Docker 命令中使用
--network=host,让容器直接加入宿主机网络。 -
注意端口变化: 使用 host 网络后,WebUI 的内部端口会从 3000 变成 8080。
示例 Docker 命令:
docker run -d --network=host -v open-webui:/app/backend/data -e OLLAMA_BASE_URL=http://127.0.0.1:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main运行后,WebUI 应可通过 http://localhost:8080 访问。
⏱️ 模型列表加载问题(UI 很慢 / endpoint 不可达)
如果 Open WebUI 加载模型需要很久,或者模型选择器一直转圈,常见原因是你在连接配置中保存了不可达或非常慢的 API endpoint。
常见症状
- 模型选择器长时间显示加载状态
/api/models返回500 Internal Server Error- 打开 Settings 时 UI 明显卡顿
- Docker/服务器日志出现:
Connection error: Cannot connect to host...
原因:endpoint 不可达
当你配置多个 Ollama 或 OpenAI base URL(用于负载均衡或冗余)时,Open WebUI 会尝试从所有已配置 endpoint 拉取模型列表。只要其中任何一个 endpoint 不可达,系统就会一直等到超时后才返回结果。
默认情况下,Open WebUI 对每个不可达 endpoint 会等待 10 秒。坏 endpoint 越多,等待时间叠加越明显。
方案 1:缩短超时时间
通过 AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST 调低模型列表请求超时:
# 把模型列表抓取的超时时间(秒)设短一些,让不可达 endpoint 更快失败
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST=3