Laravel Reverb在DigitalOcean应用平台无法连接问题求助
Laravel Reverb部署到DigitalOcean App Platform无法连接的解决方案
核心问题分析
错误日志显示Failed to connect to 0.0.0.0 port 6001 after 6 ms: Connection refused,说明Laravel应用在尝试连接本地绑定的0.0.0.0:6001,但在DigitalOcean App Platform环境中,这个配置存在两个关键问题:
0.0.0.0是服务绑定地址,不是内部访问的目标地址- DigitalOcean App Platform默认不暴露非标准端口(如6001),且多进程间的访问需要正确的内部寻址
分步解决方案
1. 拆分环境变量,区分内部/外部访问地址
修改.env配置,拆分Reverb的内部连接地址和外部客户端地址:
BROADCAST_DRIVER=reverb REVERB_APP_ID=my-app-id REVERB_APP_KEY=my-app-key REVERB_APP_SECRET=my-app-secret # 内部服务间连接用localhost REVERB_INTERNAL_HOST=localhost # 客户端连接用你的DigitalOcean应用域名 REVERB_EXTERNAL_HOST=your-digitalocean-app-domain.com REVERB_SCHEME=https # Reverb内部监听端口(无需对外暴露) REVERB_PORT=6001
2. 调整broadcasting.php配置(应用内部发广播用)
让Laravel应用通过内部地址连接Reverb,修改connections.reverb.options:
'reverb' => [ 'driver' => 'pusher', 'key' => env('REVERB_APP_KEY'), 'secret' => env('REVERB_APP_SECRET'), 'app_id' => env('REVERB_APP_ID'), 'options' => [ // 内部访问用localhost 'host' => env('REVERB_INTERNAL_HOST', 'localhost'), 'port' => env('REVERB_PORT', 6001), // 内部连接可以用http,外部通过反向代理转https 'scheme' => env('REVERB_INTERNAL_SCHEME', 'http'), 'useTLS' => false, 'encrypted' => false, // 关键:禁用curl的SSL验证(内部连接无需) 'curl_options' => [ CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0, ], ], ],
3. 调整reverb.php配置(Reverb服务自身配置)
让Reverb绑定所有接口,同时设置正确的外部hostname以适配SSL:
'servers' => [ 'reverb' => [ 'host' => env('REVERB_HOST', '0.0.0.0'), 'port' => env('REVERB_PORT', 6001), // 外部客户端访问的域名 'hostname' => env('REVERB_EXTERNAL_HOST'), 'options' => [ // 若通过反向代理处理SSL,这里无需配置TLS 'tls' => [], ], // 其他配置保持不变 ], ], 'apps' => [ 'provider' => 'config', 'apps' => [ [ 'key' => env('REVERB_APP_KEY'), 'secret' => env('REVERB_APP_SECRET'), 'app_id' => env('REVERB_APP_ID'), 'options' => [ 'host' => env('REVERB_EXTERNAL_HOST'), 'port' => 443, // 客户端用标准HTTPS端口 'scheme' => env('REVERB_SCHEME', 'https'), 'useTLS' => true, ], 'allowed_origins' => ['*'], // 其他配置保持不变 ], ], ],
4. 配置DigitalOcean App Platform进程与反向代理
- 添加Reverb进程:在App Platform的"Components"中添加一个新的Worker组件,命令设置为
php artisan reverb:start,确保它和Laravel Web进程在同一个环境下。 - 配置反向代理:在Web组件的"Routes"中添加一条路由规则,将
/reverb路径转发到Reverb进程的http://localhost:6001(DigitalOcean会自动处理内部服务发现)。- 路由路径:
/reverb/* - 目标:选择你的Reverb Worker组件
- 保留路径:开启
- 路由路径:
5. 客户端连接配置调整
前端JS代码中,将Reverb连接地址改为你的域名+路径,无需指定端口:
import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; window.Echo = new Echo({ broadcaster: 'reverb', key: import.meta.env.VITE_REVERB_APP_KEY, wsHost: import.meta.env.VITE_REVERB_EXTERNAL_HOST, wsPort: 443, wssPort: 443, forceTLS: true, enabledTransports: ['ws', 'wss'], path: '/reverb', // 对应反向代理的路径 });
验证步骤
- 重启DigitalOcean App Platform的所有组件
- 查看Reverb进程日志,确认服务正常启动:
php artisan reverb:start --debug - 用浏览器开发者工具检查Websocket连接是否成功(Network -> WS标签)
- 触发广播事件,查看Laravel日志是否再出现连接错误
内容的提问来源于stack exchange,提问作者Azay Karimli
相关产品推荐
相关产品推荐

