Laravel 10 Reverb生产环境WebSocket连接失败求助
Laravel Reverb生产环境WebSocket连接失败解决方案
1. 修正前后端配置的核心冲突
你的后端.env和前端bootstrap.js配置存在多处不一致,直接导致连接失败:
- 后端
.env调整:BROADCAST_DRIVER=reverb REVERB_APP_ID=my-id REVERB_APP_KEY=my-key REVERB_APP_SECRET=my-secret REVERB_HOST="my-domain" # 改为域名而非公网IP,适配Cloudflare代理逻辑 REVERB_PORT=443 # 使用Cloudflare默认支持的HTTPS端口,避免8080端口转发问题 REVERB_SCHEME=https - 前端
bootstrap.js调整:import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; window.Echo = new Echo({ broadcaster: 'reverb', key: 'my-key', wsHost: 'my-domain', wssPort: 443, forceTLS: true, enabledTransports: ['wss'], // 强制走加密wss协议,匹配Cloudflare SSL配置 disableStats: true, // 禁用统计请求,减少连接异常点 });
2. 配置Cloudflare的WebSocket转发规则
Cloudflare对非标准端口的WebSocket转发需要手动配置:
- 登录Cloudflare控制台,进入目标域名的网络选项卡,开启「WebSocket支持」
- 若坚持使用8080端口,需在规则→页面规则中添加规则:
- 匹配URL:
https://my-domain:8080/* - 勾选「WebSocket支持」选项
- 匹配URL:
- 调整SSL/TLS设置为「灵活」模式(服务器无SSL证书时,Cloudflare与客户端用HTTPS,与服务器用HTTP)
3. 确保Reverb监听正确地址
修改config/reverb.php的监听配置,让Reverb可以被Cloudflare访问:
'listen' => [ 'http' => env('REVERB_LISTEN', '0.0.0.0:8080'), // 监听所有网卡,而非仅localhost 'https' => env('REVERB_LISTEN_HTTPS', null), ],
启动Reverb时手动指定监听地址:
php artisan reverb:start --host=0.0.0.0 --port=8080
4. 用进程管理器维持Reverb后台运行
终端关闭后Reverb会停止,需用systemd或supervisor管理服务:
- 创建
/etc/systemd/system/reverb.service文件:[Unit] Description=Laravel Reverb Server After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/var/www/你的项目路径 ExecStart=/usr/bin/php artisan reverb:start --host=0.0.0.0 --port=8080 Restart=always [Install] WantedBy=multi-user.target - 启动并设置开机自启:
sudo systemctl daemon-reload sudo systemctl start reverb sudo systemctl enable reverb
5. 补充防火墙规则
确保Cloudflare的IP段能访问服务器8080端口,将Cloudflare官方公布的IP段加入iptables:
# 示例,需替换为完整Cloudflare IP段 iptables -A INPUT -s 103.21.244.0/22 -p tcp --dport 8080 -j ACCEPT iptables -A INPUT -s 103.22.200.0/22 -p tcp --dport 8080 -j ACCEPT
若启用UFW防火墙,执行:
sudo ufw allow 8080/tcp
内容的提问来源于stack exchange,提问作者maximus1127
相关产品推荐
相关产品推荐

