AI / 自動化 2026年5月6日

2026-05-06 OpenClaw 雙閘道連接埠OPENCLAW_STATE_DIRnginx 上游灰度租用 Apple Silicon 雲端 Mac,香港/東京/首爾/新加坡/美國

MacXCode 技術團隊 2026年5月6日 約 24 分鐘閱讀

不少團隊希望在同一台租用的 Mac mini M4上並行兩套 OpenClaw 閘道:一套正式、一套灰度模型白名單,或 staging 與正式 Webhook 簽章輪替節奏不同。若做錯——連接埠重複、共用 ~/.openclaw、nginx 權重在請求中途跳動——會出現看似「模型掛了」的502 風暴,實則全是管線問題。本 2026-05-06 指南依序說明互不衝突的回環連接埠、彼此獨立的 OPENCLAW_STATE_DIR 目錄樹、帶 slow_startnginx upstream,以及健康探測,讓你在香港、東京、首爾、新加坡、美國機房 drain 流量而不靠 SSH 臨場發揮。銜接 nginx 反向代理與 Webhook 入口健康探測與就緒launchd 環境變數優先順序,並在多倉讀盤情境配合 檔案工具與分塊紀律,避免兩套助理踩同一工作副本。

什麼時候值得為複雜度買單

預算允許時優先第二台 Mac作旁路——見 定價 評估 witness 節點。若財務堅持單機,雙閘道仍有價值:

  • 模型白名單在受監管流量與試驗流量之間必須硬隔離。
  • Webhook 簽章金鑰在 staging 與 prod 輪替週期不同。
  • 無法做 CPU pinning,但仍希望灰度與正式工作階段的爆炸半徑分開。
數字錨點:48 小時灰度權重保持 5–12%;錯誤預算持續綠燈後再依 10% 階梯上調。

拓撲:並排 active/active 與主備

並排 active/active 適合你能隨機化客戶端或完全掌控 nginx 權重的情境;主備適合需要確定性除錯、同一時間只有一套閘道對共用 git 鏡像做重度寫入的團隊。把選擇與 launchctl 標籤寫進同一份 README,避免交接時口頭傳說。

模式 優點 代價
Active / active 吞吐高;可在真實並發下 soak 需要冪等 Webhook 與去重副作用
Primary / standby 日誌較簡單;回滾路徑短 備機閒置 CPU,除非跑合成探測

連接埠、綁定位址與 launchd 標籤

不要只靠一次 lsof「猜連接埠」——寫進 plist 與 nginx。範例(依你的語意化版本調整):

export OPENCLAW_GATEWAY_PORT_PRIMARY=18789 export OPENCLAW_GATEWAY_PORT_CANARY=18890

兩套都綁定 127.0.0.1,公網 0.0.0.0:443 交給 nginx。若灰度綁 ::1 而 upstream 只寫 IPv4,會出現「幽靈連線重設」——位址族策略請對齊 出站 DNS/TLS 韌性 一文。

狀態目錄:為何禁止共用 ~/.openclaw

每套閘道需要獨立 OPENCLAW_STATE_DIR(例如 /var/lib/openclaw-prod/var/lib/openclaw-canary)。共享主目錄會在其中一套輪替 API key 時污染工作階段與快取。若 launchd 用同一 UID 跑兩套作業,也必須目錄隔離——不要共享 sqlite 或工作階段根。

備份提示:在改 nginx 權重前快照兩套狀態目錄;回滾通常是 rsync + launchctl kickstart,而不是重裝故事。

nginx upstream:權重、slow_start、max_fails

反向代理指南 複製已驗證的 server 區塊,再複製 upstream:

upstream openclaw_primary { server 127.0.0.1:18789 max_fails=3 fail_timeout=20s; } upstream openclaw_canary { server 127.0.0.1:18890 max_fails=1 fail_timeout=10s slow_start=30s; }

使用 split_clients 或與風險偏好一致的加權 proxy_passproxy_read_timeout 仍要對齊你允許的最長模型往返——拆閘道不會縮短 LLM 延遲。reload 時記得 worker_connectionskeepalive 池是 per-worker:upstream 翻倍卻不抬上限,會在 Webhook 突發重播時頂滿吞吐。能採集 stub_status 就採;否則從 access log 拆上游回應時間——若 reload 後 p95 立刻跳 35%+,多半是 worker 餓死而非 OpenClaw 配錯。TLS 重負載時讓 staging 與 prod 的 cipher 套件一致,避免灰度鏈 accidentally 走更慢路徑。務必把可回滾的 nginx tarball與 OpenClaw 狀態快照放一起;很多人只快照 Node 樹不快照 nginx,兩行 map $http_x_forwarded_proto 筆誤會讓兩套閘道一起 parser fail closed。

健康探測:切流量前先證明兩套都綠

就緒探測 裡的 curl 矩陣分別打到兩個本機連接埠,reload 後再打經 nginx 的路徑。HTTP 狀態、上游連線耗時、TLS 握手耗時分開記日誌,才能區分 nginx 迴歸與 OpenClaw 迴歸。

八步割接清單

  1. 快照 plist、nginx 與兩棵狀態目錄。
  2. 安裝第二套閘道,二進位或 npm pin 與正式完全一致。
  3. 分別在每棵樹跑 openclaw doctor 獨立驗證。
  4. nginx 先把灰度權重設為 0(就緒前黑洞)。
  5. 用 staging 合成 Webhook 重播冒煙。
  6. 把灰度切片調到 5–12%。
  7. 觀察 48h錯誤預算。
  8. 依文件化權重晉升或回滾

逾時、Webhook 重試與重複投遞

雙閘道放大重複投遞風險:若上游在 TCP 閒置視窗內 aggressive 重試,業務必須辨識冪等鍵,並把去重標記落在正確的狀態目錄下。proxy_read_timeout 要與供應商 idle 限制對齊——重試表見 Webhook 投遞與簽章

SLO 訊號 閾值 動作
本機上游連線 p95 > 120 ms(至 localhost) 暫停調權;查 launchd 限流
5xx 占比 > 0.5%(15 分鐘視窗) 灰度權重歸零
佇列積壓 > 200 待處理作業 加第二台 Mac 或降並發,不要疊第三套閘道

SLO:何謂「健康的雙閘道」

把雙閘道當成迷你服務網格:每一跳單獨度量。若正式綠、灰度紅,先修灰度設定,而不是盲調 nginx。對內面板建議每套閘道四條線:程序 RSS、CPU%、nginx 日誌裡的在途 HTTP 數、失敗上游連線數。同權重下若灰度 RSS 比正式偏離 18%+,多半是外掛記憶體外洩或 Node semver 不一致——暫停 rollout,對比兩套 OPENCLAW_STATE_DIRnpm ls --depth=0。跳過這步的團隊常把週末燒在「模型品質回退」上,實際是同一 skill bundle 在灰度被載入了兩次。每季演練整 nginx 掛掉:故意 stop nginx,確認 launchd 仍保活兩套回環閘道,並確認告警能叫到對的人——目標是雙閘道提高可用性,而不是讓 pager 翻倍。

常見問題:TLS、DNS 與金鑰

問題 實務答案(2026-05-06)
兩套閘道要兩套 TLS 憑證嗎? 通常不需要——在 nginx 終止一次 TLS;閘道只走回環。
API key 能共用嗎? 不建議——獨立輪替以縮小爆炸半徑;模式見 閘道升級與回滾

為何裸金屬 Mac mini M4 仍能簡化雙閘道混亂

雙閘道同時壓測 CPU磁碟launchd 台帳。MacXCode 節點上帶 1–2 TB NVMe 的租用 Mac mini M4 讓 nginx→OpenClaw 回環延遲可預期,統一記憶體也足以並行兩套 Node 圖而不搶 nightly xcodebuild 鄰居車道的核心。可預期性才是權重灰度「可度量」的前提。向維運解釋為何需要專用第二節點而非在忙主機上疊第三套閘道時,用 區域定價;需要在新 TLS 信任錨上走 VNC 證據鏈時,用 說明文件VNC 說明。

先加第二台建置機,再疊第三套閘道

港/日/韓/新/美 · SSH/可選 VNC