☰
Laravel WebSockets 遇上 Cloudflare:用 `--port=2096` 解决生产环境 `:6001` 端口无响应
2026/10/13 1:52:15 网站建设 项目流程
  • 后端
  • 即时通讯

【免费下载链接】laravel-websockets

Websockets for Laravel. Done right.

项目地址:https://gitcode.com/gh_mirrors/la/laravel-websockets
点击查看免费下载

导读

本文聚焦一个在真实生产环境中高频出现的问题:把 laravel-websockets(Laravel WebSockets)部署在 Cloudflare 后面时,WebSocket 服务器默认监听的:6001端口可能对外完全不可达。文章将结合仓库源码说明问题根因,给出「改用 Cloudflare 放行端口(如 2096)直接监听」的官方推荐解法,并补充端口变更后需要同步调整的广播配置、Laravel Echo 配置与底层实现原理,帮助你一次性把生产环境的 WebSocket 连接调通。

问题现象:生产服务器对:6001没有响应

当你把 Laravel 应用部署到生产环境并启用了 Cloudflare CDN / 代理后,可能会发现一个奇怪的现象:本地一切正常,但部署到线上后,浏览器与 WebSocket 服务器之间始终无法建立连接,服务器似乎对:6001端口完全没有响应。

根据仓库的 FAQ 文档 说明,根因并不在 laravel-websockets 本身,而是 Cloudflare 并不会开放任意端口供外部流量穿透——它只放行少数几个特定端口。默认情况下,laravel-websockets 服务器监听的是6001端口,而这个端口不在 Cloudflare 的放行列表内,因此从公网发起的 WebSocket 握手请求根本无法到达你的服务器。

为什么默认端口是 6001

从源码可以确认6001是 laravel-websockets 的全链路默认端口:

  • 在 StartServer.php 中,websockets:serve命令签名为{--host=0.0.0.0}与{--port=6001},即不传参时默认监听所有网卡的6001端口;
  • 在 ServerFactory.php 中,host与port会被拼成"{$this->host}:{$this->port}"传给 ReactPHP 的Server创建实际监听 Socket(见 ServerFactory.php),这就是最终对外监听的地址;
  • 配套的 Laravel 广播配置 config/broadcasting.php 默认指向PUSHER_APP_PORT = 6001,前端 Laravel Echo 的wsPort也默认是6001(见 pusher.md)。

所以整个默认链路都围绕6001展开。一旦 Cloudflare 放行不了这个端口,整条 WebSocket 链路就会从入口处断裂。

解决方案:让服务器监听 Cloudflare 放行的端口

仓库 FAQ 给出的官方解法非常直接:把 WebSocket 服务器的监听端口,从默认的6001改成一个 Cloudflare 支持的端口。原文档以2096为例:

php artisan websockets:serve --port=2096

执行后,laravel-websockets 会改在:2096端口上提供 WebSocket 服务,此时 Cloudflare 能够将公网流量转发进来,新的:2096WebSocket 服务器即可正常工作。

--port参数在底层如何生效

理解这条命令的底层行为,有助于你在踩坑时快速定位问题:

  1. StartServer::buildServer() 读取$this->option('port'),将其与$this->option('host')一起传入ServerFactory构造函数;
  2. ServerFactory::createServer() 用new Server("{$this->host}:{$this->port}", $this->loop)在指定地址上创建 ReactPHP 异步 Socket 服务器;
  3. 随后该 Socket 被包装进SecureServer(若配置了 SSL)与IoServer,启动后便开始对外监听。

也就是说,--port是最终决定监听端口的唯一参数,改端口不需要修改任何源码或配置文件,重启命令即可生效。

仓库的测试也验证了--port参数的可用性:StartServerTest.php 中以--port => 6001启动服务器并断言启动不失败,其余用例则分别使用6002、6003验证SIGINT/SIGTERM信号下的优雅关闭流程(见 StartServerTest.php),说明任意端口均可作为监听端口使用。

换端口后必须同步调整的三处客户端配置

改完服务器监听端口只是第一步。因为默认配置链路全部指向6001,你还需要把以下三处同步改为新端口,否则会出现「服务器在 2096 上正常监听,但 Laravel 应用发不出事件、浏览器连不上」的割裂状态。

1. Laravel 广播配置(config/broadcasting.php)

Laravel 应用通过 Pusher HTTP API 向 WebSocket 服务器推送事件时,会读取config/broadcasting.php中pusher段落的host与port。请将.env中的端口变量指向新端口:

PUSHER_APP_PORT=2096

对应 pusher.md 中的配置段:

'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'encrypted' => true, 'host' => env('PUSHER_APP_HOST', '127.0.0.1'), 'port' => env('PUSHER_APP_PORT', 6001), 'scheme' => env('PUSHER_APP_SCHEME', 'http'), 'curl_options' => [ CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0, ], ],

2. 前端 Laravel Echo(wsPort)

浏览器端通过pusher-js/ Laravel Echo 建立 WebSocket 连接,需要把wsPort改为新端口:

window.Echo = new Echo({ broadcaster: 'pusher', key: 'your-pusher-key', wsHost: window.location.hostname, wsPort: 2096, forceTLS: false, disableStats: true, enabledTransports: ['ws', 'wss'], });

注意:如果你通过 HTTPS 访问站点,应结合 SSL 支持文档 将forceTLS设为true,并在 WebSocket 服务器上配置证书。

3. 统计与 Dashboard 端口(config/websockets.php)

config/websockets.php 中dashboard.port默认读取LARAVEL_WEBSOCKETS_PORT,默认值为6001,用于 WebSocket 服务器自身的 Dashboard 与健康检查等 HTTP 接口。建议通过环境变量统一管理:

LARAVEL_WEBSOCKETS_PORT=2096

在 ServerFactory.php 中可以看到,服务器会把 WebSocket 路由(如/app/{appKey}、/apps/{appId}/events、/health等,注册逻辑见 Router.php)与 Dashboard 路由统一挂在同一个监听 Socket 上,因此这个端口与--port保持一致即可。

备选思路:不改端口,用反向代理走 80/443

除了直接改用 Cloudflare 放行的端口,另一种常见做法是让 WebSocket 服务器继续监听127.0.0.1:6001,由 Nginx、Caddy 等反向代理在80/443端口终结 TLS 并把 WebSocket 升级请求转发过去。这样公网只暴露80/443,完全绕开 Cloudflare 的端口限制问题,同时还能统一 HTTPS 管理。仓库的 SSL 文档 给出了完整的 NginxUpgrade/Connection头转发配置与 Caddy v2 的reverse_proxy配置示例,可作为生产环境的另一条成熟路径。

两条路线各有取舍:

方案优点注意点
直接监听 Cloudflare 放行端口(如 2096)配置最简单,一条命令即可需要额外开放防火墙端口;需同步修改上文的客户端配置
反向代理转发到 6001只暴露 80/443,TLS 统一管理需额外维护代理配置;需正确设置Upgrade/Connection请求头

小结与验证

处理「laravel-websockets + Cloudflare 生产环境连不上」问题的完整链路是:

  1. 确认根因:Cloudflare 不放行默认的:6001端口,导致公网 WebSocket 握手无法到达服务器;
  2. 执行修复:php artisan websockets:serve --port=2096(或任一 Cloudflare 放行端口),必要时配合--host指定监听网卡(默认0.0.0.0,参数定义见 StartServer.php);
  3. 同步配置:将PUSHER_APP_PORT、Echo 的wsPort、LARAVEL_WEBSOCKETS_PORT一并改为新端口;
  4. 验证连通:访问http://你的域名:2096/health应返回{"ok":true}(健康检查实现见 HealthHandler.php),并确认浏览器能成功建立 WebSocket 连接、Laravel 能正常推送事件。

按照上述步骤操作,你的 WebSocket 服务器就能在 Cloudflare 环境下稳定对外提供服务,同时也能与仓库 FAQ 目录 中的其他部署技巧(如 supervisord 守护)组合使用,构建一套健壮的生产级实时通信设施。

  • 后端
  • 即时通讯

【免费下载链接】laravel-websockets

Websockets for Laravel. Done right.

项目地址:https://gitcode.com/gh_mirrors/la/laravel-websockets
点击查看免费下载
上一篇:解决Ubuntu系统下Netty的Epoll支持问题:从异常到高性能网络编程
下一篇:告别检索低效!LangChain4J 集成 Apache Lucene 实现极速全文检索的实战指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询