n8n 工作流界面持续显示 "Connection lost" 的核心原因是 Nginx 未正确配置 WebSocket 支持或 Origin 头验证失败 ,尤其在公网部署且使用非标准端口(如非 443/80)时,n8n 1.87+ 版本对 Origin 头的校验更严格,需显式设置 不带端口号的 Origin 值。以下是具体解决方案:
一、关键问题定位
1. WebSocket 连接未启用
n8n 工作流编辑器依赖 WebSocket 实时通信(如调试日志流),若 Nginx 未透传相关协议头,会导致连接中断。
典型错误表现:
- 浏览器控制台报错
WebSocket connection to 'wss://...' failed。 - 网络请求中显示
Invalid origin!错误(常见于 n8n 1.87+ 版本)。
2. Origin 头校验失败(高发原因)
当公网访问域名包含非标准端口 (如 https://your-domain.com:8443)时:
- n8n 会校验请求头中的
Origin是否与配置的域名完全匹配 (不含端口号)。 - 若 Nginx 未显式设置
Origin头,或动态使用$host(含端口),则校验失败。
二、Nginx 配置修正步骤
1. 基础 WebSocket 支持配置
在 Nginx 的 location / 块中必须包含以下指令:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
- 作用:启用 WebSocket 协议升级,确保实时通信正常。
- 错误配置后果:前端无法建立长连接,持续触发 "Connection lost"。
2. 关键:修复 Origin 头校验问题
场景:使用非标准端口(如 8443)访问
需硬编码 Host 和 Origin 头 ,禁止使用 $host 动态变量:
proxy_set_header Host your-domain.com; # 不带端口号
proxy_set_header Origin https://your-domain.com; # 必须为 HTTPS 且不带端口号
- 为什么必须硬编码?
n8n 1.87+ 版本会严格比对Origin与内部配置的域名(通过N8N_HOST环境变量定义),若请求中的Origin包含端口号(如https://your-domain.com:8443),而 n8n 配置的域名不含端口,则校验失败。 - 错误示例 :
proxy_set_header Origin $scheme://$host;→ 会携带端口号,导致校验失败。
场景:标准 HTTPS 端口(443)
仍需显式设置:
proxy_set_header Host your-domain.com;
proxy_set_header Origin https://your-domain.com; # 不带端口号
三、完整 Nginx 配置示例
server {
listen 443 ssl http2;
server_name your-domain.com; # 替换为实际域名
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
proxy_pass http://127.0.0.1:5678; # 指向 n8n 容器/服务地址
proxy_set_header Host your-domain.com; # 硬编码域名(无端口)
proxy_set_header Origin https://your-domain.com; # 硬编码 HTTPS 域名(无端口)
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;
# WebSocket 必备配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
重点检查项:
Host和Origin头必须不带端口号,即使实际通过非标准端口访问。Origin值必须与 n8n 的N8N_HOST环境变量完全一致 (例如N8N_HOST=your-domain.com)。
四、其他必要验证
1. n8n 环境变量检查
确保以下环境变量已正确设置:
N8N_HOST=your-domain.com(不带协议和端口)N8N_PROTOCOL=httpsWEBHOOK_URL=https://your-domain.com/(结尾必须带斜杠)
2. 服务端日志排查
若问题仍存在,检查 n8n 日志中的关键错误:
docker logs n8n-container-name | grep -i "origin\|websocket"
- 若出现
Origin header does NOT match,说明 Origin 头配置错误。 - 若出现
WebSocket connection closed,需复查 Nginx 的 WebSocket 头配置。
五、常见误区
- 仅配置
proxy_set_header Host $host不够 :
$host会携带端口号(如your-domain.com:8443),而 n8n 要求 Origin 必须无端口。 - 误用
X-Forwarded-Port替代 Origin :
X-Forwarded-Port仅用于协议识别,不影响 Origin 校验。 - 忽略 n8n 版本差异 :
1.87 以下版本可能无需显式设置 Origin,但 1.87+ 版本必须严格匹配。
按上述配置修正后,WebSocket 连接将正常建立,工作流编辑器的 "Connection lost" 错误会消失。若仍存在问题,请优先检查 Origin 头值是否与 N8N_HOST 完全一致。