# 运维控制台静态托管 + 反代网关 API(一个 URL 同时给前端与 /api)。 # WebSocket 升级:nginx 默认会吃掉 Upgrade/Connection 头,被代理的 WS 永远握手不成功 # (现象:HTTP 接口全好,只有 WS 报 ws error)。语音会话 /api/v1/voice/stream 与 # 本地执行器 /api/v1/local/runner 都走 WS,必须显式转发。 # 用 map 而非写死 "upgrade":普通请求带上 Connection: upgrade 会干扰 keepalive。 map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; # SPA 路由:找不到文件回退 index.html(前端路由接管)。 location / { try_files $uri $uri/ /index.html; } # 网关 API:反代到 compose 网络内的 gateway 服务。 location /api/ { proxy_pass http://gateway:8080; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # WebSocket(语音会话 / 本地执行器):不转发这两个头则握手必失败。 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # SSE(token 流 / 执行轨迹):关闭缓冲 + 长超时,否则流式会被攒住/断开。 proxy_buffering off; proxy_cache off; proxy_read_timeout 1h; proxy_send_timeout 1h; } # 健康/指标直通(运维探活)。 location = /healthz { proxy_pass http://gateway:8080; } location = /readyz { proxy_pass http://gateway:8080; } }