用 Nginx 做 OpenClaw 的反向代理时,如果不配置 WebSocket 支持,实时功能会失效。这个坑我踩了两次了。
症状
- 普通的 API 调用正常
- 但实时对话没反应,或者断断续续
- 浏览器 Console 报 WebSocket 连接失败
原因
OpenClaw 的实时功能用了 WebSocket,但 Nginx 默认不代理 WebSocket。
正确的 Nginx 配置
server {
listen 443 ssl http2;
server_name ai.example.com;
ssl_certificate /etc/ssl/certs/ai.example.com.crt;
ssl_certificate_key /etc/ssl/private/ai.example.com.key;
location / {
proxy_pass http://127.0.0.1:18789;
proxy_http_version 1.1;
# WebSocket 支持 - 关键!
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 标准头
proxy_set_header Host $host;
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;
# 超时设置
proxy_read_timeout 86400; # WebSocket 长连接
proxy_send_timeout 86400;
}
}
关键是那三行 WebSocket 配置,少一行都不行。
额外建议
proxy_read_timeout要设大,WebSocket 是长连接- 如果用 Cloudflare,需要在 Network 设置里启用 WebSocket
- 如果用 CDN,确认 CDN 支持 WebSocket Pass-through