2026 OpenClaw 生產向反代與 TLS:
Nginx/Caddy 下 WebSocket、子路徑與 Gateway 的 502/握手失敗分診清單

約 16 分鐘閱讀 · MACCOME

Gateway 在容器裡「看起來正常」,一掛到 Nginx/Caddy 後面就出現 502、WebSocket 握手失敗或無限重導向? 本文鎖定入口反代 + TLS 終止 + WebSocket 升級這一層,與《Docker 網路分診》互補:前者管封包與封包之間誰看得見誰,本篇管瀏覽器到 Gateway 的 HTTP/1.1 升級鏈路與路徑是否正確。你將拿到六類高頻誤區、兩張拓撲/症狀對照表、可複製設定片段、六步上線 Runbook,以及三條應寫進值班的硬指標。讀完能先判斷該改 Upgrade 頭還是該回去查上游 127.0.0.1:18789

反代層最常見的六個誤區(為什麼「curl 上游通」仍可能 502)

  1. 只設了 proxy_pass 卻沒升 HTTP/1.1 與 Upgrade:瀏覽器走 WebSocket 時邊緣回 400/502,日誌卻像「Gateway 掛了」。
  2. 子路徑雙寫前綴:反代剝離了 /openclaw,應用仍依根路徑產生絕對 URL,導致靜態資源與 WS 路徑分裂。
  3. 把 HTTP/2 與 WS 混在同一監聽卻不驗證 ALPN:部分組合下需為 WS 獨立 server 或顯式回落 HTTP/1.1,否則握手表現為偶發失敗。
  4. proxy_read_timeout 過短:長推理或通道訊息突發時連線被邊緣靜默掐斷,用戶端重連風暴誤傷上游。
  5. 憑證鏈不完整卻只修了瀏覽器警示:某些自動化用戶端校驗更嚴,表現為「桌面 CLI 通、Web UI 偶發失敗」。
  6. CDN 預設快取或短閒置逾時:控制面 WebSocket 被中間層當普通 GET 快取或提前斷開,症狀像隨機掉線。

下面用拓撲表把「同機反代/獨立反代機/子網域/子路徑」的取捨壓平,再進入 Header 檢查表與分症狀矩陣。

拓撲選型:同機、獨立機、子路徑與子網域如何影響排障

同機反代(Nginx/Caddy 與 Gateway 同宿主機)排障路徑最短:curl -v http://127.0.0.1:18789 即可驗證上游。獨立反代機多一跳,需同步核對安全群組、內網 DNS 與 TLS SNI。子網域方案通常避免路徑剝離與 Cookie Path 的糾纏;子路徑適合統一網域策略,但必須在反代與 OpenClaw 基址設定兩側只剝一次前綴,並用瀏覽器開發者工具確認 WS URL 是否仍指向預期 wss:// 路徑。

實務上建議在變更單裡強制附兩張擷圖:一張是瀏覽器網址列最終落點,一張是 Network 面板裡 WebSocket 握手的 Request URL。沒有這兩張圖時,審查很容易把問題誤判為「模型逾時」或「通道 OAuth」,進而在錯誤平面浪費發布時間。若你同時在跑企業 HTTPS 代理,記得區分「辦公網瀏覽器」與「資料中心反代機」兩條路徑——前者可能注入 PAC,後者通常直連,症狀不一致是常態而非異常。

HTTP/2 在邊緣監聽、上游仍走 HTTP/1.1 WebSocket 的組合在 2026 年仍非常普遍:關鍵是確認從用戶端到反代從反代到 Gateway兩段裡,哪一段允許升級。不要在未抓包的情況下同時開啟「強制 H2」與「自訂 WS 路徑改寫」,否則排障會退化成玄學。

拓撲適用維運收益典型坑
同機反代 + 回環上游單台 VPS/遠端 Mac 常駐本機 curl 即可分診;TLS 與行程同日誌卷誤綁 0.0.0.0 放大暴露面,需防火牆兜底
獨立反代機多後端、藍綠、WAF 前置邊緣與運算池解耦;憑證集中續期內網路由、SNI、健康檢查目標易漂移
子網域WS 與站點主域分離路徑語意清晰;CDN 規則好寫多憑證與 HSTS 策略要單獨審查
子路徑單入口品牌網域使用者記憶成本低前綴剝離、重導迴圈、資源根路徑錯位

Nginx 與 Caddy:WebSocket 必要 Header 與逾時對照

無論選哪種實作,邊緣都要保證:升級到 HTTP/1.1、透傳或重建 Connection: upgradeUpgrade: websocket,並為長連線設定大於模型最慢分位的讀逾時。下表用於 Code Review 勾選。

另有一條易忽略:反代緩衝。對一般 API 開啟 proxy_buffering 可能提升吞吐,但對串流回應或長保持連線有時會引入額外延遲甚至截斷感知;若你用了串流通道或類 SSE 行為,要在 staging 用真實負載壓一遍再開預設緩衝。

檢查項Nginx 要點Caddy 要點
協定版本proxy_http_version 1.1;reverse_proxy 預設 HTTP/1.1;留意顯式 transport
Upgrade 鏈Upgrade $http_upgrade; Connection "upgrade";多數場景自動處理;自訂需 header_up
Host 與原始用戶端 IPproxy_set_header Host $host;X-Forwarded-*header_up Host {host};信任反代 hops
長連線proxy_read_timeoutsend_timeouttransport http { read_timeout ... }(版本語法以文件為準)
大請求體client_max_body_sizerequest_body 限制類指令
nginx
# 片段:反代到本機 Gateway(埠號依你的部署為準,示例 18789)
location / {
  proxy_pass http://127.0.0.1:18789;
  proxy_http_version 1.1;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_read_timeout 3600s;
  proxy_send_timeout 3600s;
}
Caddyfile
# 片段:TLS 自動 + 反代 WebSocket 上游
openclaw.example.com {
    reverse_proxy 127.0.0.1:18789 {
        header_up Host {host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
    }
}
info

提示:改設定後先用 curl -v -H "Connection: Upgrade" -H "Upgrade: websocket" http://127.0.0.1:18789/ 在上游側驗證握手語意,再測公網 wss://;否則會在 TLS 與反代兩層之間來回甩鍋。

分症狀矩陣:502、413、101 失敗、重導向與憑證

把症狀對應到「邊緣/上游/應用設定」三類,避免一上來就重建容器。若表格指向容器網路,請回到《Docker 網路分診》;若通道已通但 Slack/Telegram 不回,請對照《通道接入排查》。

遇到「僅生產環境重現、預發完全正常」時,優先比對三處 diff:憑證鏈是否同一 CA、CDN/WAF 規則集版本、以及反代 mapif 裡是否對特定 User-Agent 走了分支。很多 502 其實是邊緣規則誤殺,與 OpenClaw 版本無關。

現象優先懷疑驗證動作
502 Bad Gateway上游未監聽、防火牆、錯誤 socket 族反代機 curl 上游;看 error.log 的 upstream timed out/refused
413 Request Entity Too Large邊緣 client_max_body_size 過小調大並 reload;同步 CDN/WAF 側限制
WS 非 101Upgrade 遺失、路徑被改寫、http→https 跳轉打斷瀏覽器 Network 裡看握手回應碼;對照 location 順序與 return 301
重導迴圈X-Forwarded-Proto 未設卻強制 https暫時關閉邊緣 HSTS 試驗;補全 forwarded 頭
憑證警示/部分用戶端失敗鏈不完整、錯誤 SNI、混用 IP 憑證openssl s_client -servername 拉鏈;校時 NTP

六步 Runbook:從試點網域到可值班的生產入口

  1. 凍結 URL 方案:寫清對外 https:// 基址、是否子路徑、WS 是否與 HTTP 同 host。
  2. 本機探活:在反代機上直連回環上游,確認 OpenClaw 行程與埠與文件一致(示例 18789)。
  3. 最小 Nginx/Caddy 片段:先只反代健康檢查路徑,再放開全站;每步可回滾。
  4. 抓一條完整 WS 會話:用瀏覽器與 CLI 各驗證一次,日誌對齊 request_id(若有)。
  5. 疊安全:IP 允許清單、限流、WAF 自訂規則;與《Docker 生產 Runbook》中的權杖策略對齊。
  6. 觀測基線:記錄上游 P95、每分鐘 WS 重連次數、憑證剩餘天數,寫入告警閾值。
  7. 發布回滾演練:在維護窗內做一次「只回滾反代設定、不回滾映像」的練習,確保值班文件裡有一條可執行命令序列而不是口頭描述。

三條應寫進 Grafana/值班手冊的硬指標

  1. 上游 RTT P95:從反代 worker 到 127.0.0.1:18789 或內網 VIP,獨立於公網延遲,便於判斷「慢在邊緣還是慢在 Gateway」。
  2. WebSocket 非正常關閉率:按分鐘聚合,突增常與逾時、發布、或模型側 429 相關,應與 provider 路由篇對照。
  3. 憑證剩餘有效期:小於 14 天觸發工單;Let's Encrypt 與商業 CA 的續期失敗要在 staging 先演練。

若你已接入集中日誌,請把「反代 access 5xx 率」與「Gateway 應用日誌錯誤率」做雙軸對齊:只有一側飆升時,責任邊界一目了然,也方便在復盤會上用資料而不是體感說話。

為什麼「只在筆電上跑 Gateway」難扛生產入口與長期自動化

個人裝置上的反代實驗可以快速驗證設定片段,但休眠、VPN 切換與家庭寬頻入站不穩定會把 TLS 與憑證續期變成手工活;團隊也無法對 502 率做可合約化的 SLO。把反代 + 常駐 Gateway放到可 7×24 的專用主機(例如租用的 Apple Silicon 遠端 Mac 或受控 VPS),才能把限流、憑證與日誌留存做成標準變更,而不是「誰筆電還醒著誰就是維運」。一旦入口穩定,OpenClaw 與 CI、簽名流水線的聯動才談得上可稽核、可交接。

純自建反代棧還要持續跟進 OpenSSL、Nginx 與系統 CVE;對於要把 OpenClaw 與 CI、簽名、多通道機器人長期綁在一起的團隊,穩定獨佔算力 + 清楚地區/租期往往比反覆折騰家用出口更省總帳。MACCOME 的 Mac 雲主機提供多地區節點與可預期的租期檔位,適合作為「TLS 終止背後的那台乾淨常駐機」:先把《三平台安裝與選型》裡的目錄與權限邊界落地,再依 租賃價格 與區域頁把執行層託管到合約化環境——新加坡東京首爾香港維吉尼亞矽谷——邊緣反代只負責入口策略與觀測。

連線、工作階段與通道類問題也可在 協助中心 依關鍵字檢索;需要圖形化排錯時,仍可結合遠端桌面策略與站內 SSH/VNC 類文章規劃視窗。

常見問題

502 時先查反代還是查 Docker?

先在反代機上 curl 回環上游;不通再回《Docker 網路分診》。需要方案比對時見 Mac mini 租賃價格

子路徑和子網域怎麼選?

子網域通常少踩剝離坑;子路徑需兩側基址一致。安裝入口仍建議從 三平台安裝指南 對齊版本。

CDN 後面 WS 掉線?

關快取、拉長閒置逾時,或為控制面子網域繞過 CDN。通道側異常請對照 Slack/Discord/Telegram 排查篇

日誌與工單去哪裡?

企業變更可走 協助中心 工單,避免在生產群丟半張 Nginx 設定。