swoole 4 必须通过 nginx 反向代理接入公网,核心配置三点:swoole 监听 127.0.0.1 内网地址(如端口 9502),nginx 正确透传 upgrade 和 connection 头以支持 websocket 升级,https 下客户端必须使用 wss 协议且 nginx 配置 ssl 并启用强制跳转。

Swoole 4 默认不直接暴露 HTTP 接口给公网,必须通过 Nginx 反向代理接入。关键不是“能不能用”,而是“怎么配才不丢 WebSocket、不跨域、不 502”。核心就三点:Swoole 监听内网、Nginx 做七层转发、HTTPS 下特别注意 Upgrade 头。
确保 Swoole 服务监听正确地址和端口
Swoole 4 的 HTTP/WebSocket 服务器应绑定 127.0.0.1(非 0.0.0.0),端口建议固定(如 9501 或 9502)。不要开启 public 访问,也不要在代码里写 `->start()` 前漏掉 `set(['worker_num' => 4])` 等基础配置。
- WebSocket 场景下,务必启用 `websocket` 协议并监听 TCP 连接,例如:
$server = new Swoole\WebSocket\Server('127.0.0.1', 9502); - HTTP 场景下,使用
Swoole\Http\Server,同样只绑内网地址 - 启动后,在宝塔或服务器上执行
netstat -tuln | grep :9502,确认只有127.0.0.1:9502在 LISTEN 状态
Nginx 基础反向代理配置(含 WebSocket 支持)
在宝塔面板「网站」→「设置」→「反向代理」中添加,或手动编辑站点 conf 文件。重点不是加功能,而是保留关键 header 和连接升级逻辑。
-
proxy_pass http://127.0.0.1:9502;—— 注意末尾不加斜杠,否则路径会被截断 - 必须包含以下三行,否则 WebSocket 握手失败:
proxy_http_version 1.1;<br> proxy_set_header Upgrade $http_upgrade;<br> 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;
HTTPS 下的额外注意事项
如果域名已配置 SSL,Nginx 的 server 块需启用 443 端口并加载证书。此时 WebSocket 客户端必须用 wss:// 连接,且 Nginx 不会自动升级协议——全靠上面那三条 header 驱动。
- 确保宝塔中「SSL」选项已开启,并勾选「强制 HTTPS」
- 前端 JS 连接地址必须是
wss://your-domain.com/ws,不能写ws://或 IP - 若出现 ERR_SSL_PROTOCOL_ERROR 或 400 Bad Request,大概率是客户端用了 ws 协议连了 https 站点,或 Nginx 没传 Upgrade 头
验证与排错要点
别依赖浏览器 F5 刷新看结果,要用 curl + 日志组合判断。
- 测试反向代理通路:
curl -I https://your-domain.com,看是否返回 Swoole 的响应头(如X-Powered-By: swoole) - 测试 WebSocket 升级:
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" https://your-domain.com/ws,应返回101 Switching Protocols - 查看 Nginx error.log(宝塔路径:/www/wwwlogs/your-site.error.log),重点关注
upstream prematurely closed connection或no live upstreams类错误











