編輯器中的「失去與伺服器的連線」+ Plesk 反向代理後的「無效來源」WebSocket 錯誤

大家好,

我正在通過 Docker Compose 在 Plesk (Ubuntu 20.04, Plesk Obsidian 18.0.78) 上自託管 n8n,以 nginx 作為 Docker 前面的反向代理。

設定:

  • n8n 官方 Docker 映像 (n8nio/n8n)
  • 反向代理:Plesk 的 nginx (代理到 Apache,然後代理到 Docker 容器的 5678 埠)
  • 域名:擁有自己 SSL 的子域名 (透過 Plesk 使用 Let’s Encrypt)

已設定的環境變數:
N8N_HOST=bot.publicides.com
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://bot.publicides.com/
N8N_SECURE_COOKIE=false
N8N_TRUST_PROXY=true
N8N_PROXY_HOPS=2
N8N_PUSH_BACKEND=sse
N8N_EDITOR_BASE_URL=https://bot.publicides.com/

已新增的 Nginx 其他指令:
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
proxy_set_header Host $host;
proxy_pass_request_headers on;

問題:
任何即時編輯器操作 (執行前一個節點、測試此觸發器,甚至只是開啟執行選項卡) 都失敗,在 UI 中顯示「工作流程執行時出現問題 — 與伺服器的連線已中斷」。

Docker 日誌顯示此重複出現的錯誤:

Origin header 與預期的來源不相符。(Origin: “undefined” → “N/A”,預期:“undefined” → “undefined”,協議:“undefined”)
ResponseError: Invalid origin!
at Push.handleRequest (/usr/local/lib/node_modules/n8n/src/push/index.ts:157:10)
at /usr/local/lib/node_modules/n8n/src/push/index.ts:112:17
at Layer.handleRequest (…router/lib/layer.js:152:17)

at /usr/local/lib/node_modules/n8n/src/auth/auth.service.ts:158:18

我已排除的項目:

  • 伺服器資源正常 (RAM ~72% 使用但有充足空間,CPU 低,磁碟使用率低)
  • 不是瀏覽器/快取問題 — 在無痕模式、不同瀏覽器、不同裝置和行動數據而非 WiFi 中出現相同錯誤
  • Docker 容器已啟動且健康狀態良好 (docker ps 確認「Up」)
  • Webhooks 工作正常 — 手動 curl POST 到生產 webhook URL 傳回 {“message”:“Webhook call received”},工作流程端到端執行正確 (透過目標 Google Sheet 被更新確認)
  • 域名未透過 Cloudflare 代理 (僅限 DNS / 灰雲)

因此,透過 webhook 的實際工作流程執行完美運作 — 僅有即時編輯器的 WebSocket/SSE push 連線失敗,似乎因為 nginx 和 n8n 的驗證服務之間某處的 Origin 標頭不相符而被拒絕。

有人在 Plesk 的 nginx 設定中遇到過這個特定的「Invalid origin」push 錯誤嗎?是否需要額外的環境變數或 nginx 指令來正確轉發/設定 push 端點的 Origin 標頭?

預先謝謝!

@Alcides_Home_360_Bel 歡迎!
n8n 1.87+ 在推送端點(/rest/push)上添加了嚴格的 Origin 檢查,而你的日誌顯示 Origin、Expected 和 Protocol 都是「undefined」,這表示 Origin 標頭在到達 n8n 之前被剝離,所以檢查會拒絕推送連線,而沒有此類檢查的 Webhook 則繼續工作。像 N8N_DISABLE_ORIGIN_CHECK 這樣的環境變數開關被廣泛報告在標頭已經消失後無法工作,所以真正的解決方案是在最接近 n8n 的代理跳轉點注入帶有方案的 Origin 標頭。
在你的 Plesk 鏈中,那個跳轉點是 Apache,而不是前端 nginx。另一位 Plesk 使用者只在 nginx 指令中設置了 Origin,但仍然看到「Origin: undefined」,因為中間的 Apache 層會丟棄它。所以在 Apache 指令中設置它(網站和域名、Apache 和 nginx 設置、額外 Apache 指令),使用 mod_headers:
見此:

使用 https://bot.publicides.com 作為值,並且也添加 RequestHeader set X-Forwarded-Proto "https",因為你的日誌也顯示 Protocol 未定義。保持 N8N_PUSH_BACKEND=sse 是可以的;檢查適用於 SSE 和 WebSocket,所以單獨使用 SSE 不會跳過它。
如果你不想觸及 Apache,在相同的 Apache 和 nginx 設置中取消勾選「代理模式」,這樣 nginx 就會直接代理到容器,然後你現有的 nginx 塊加上 proxy_set_header Origin https://bot.publicides.com; 會直接到達 n8n。