Soketi+Laravel广播事件本地正常,外部无法实时通信求助
问题解答
必须配置WSS(安全WebSocket连接)
你遇到的外部网络通信异常,核心原因是现代浏览器和移动网络会严格限制非安全的WS(WebSocket)连接。当使用HTTP/WS时,外部网络(比如移动数据、非本地主机)的浏览器安全策略会直接阻止WS连接建立,这就是手机和外部主机无法接收消息的根本原因。只有切换到WSS(加密WebSocket),才能绕过这些限制,实现跨网络的实时通信。
用Cloudflare免费证书配置WSS的步骤
Cloudflare可以作为SSL终止点,不需要在Soketi本身配置证书,只需要通过Cloudflare的反向代理转发WebSocket请求即可,具体步骤如下:
1. 配置Cloudflare基础环境
- 确保你的域名已托管在Cloudflare,DNS记录指向服务器IP,并且DNS记录的「云朵图标」处于开启状态(启用Cloudflare代理)。
- 在Cloudflare的「SSL/TLS」设置中,将SSL模式设置为Full Strict(如果服务器本身还没有证书,可先选Flexible模式,后续再升级)。
2. 配置Cloudflare的WebSocket转发规则
通过Page Rules实现请求转发(免费版足够使用):
- 进入Cloudflare的「Page Rules」页面,点击「Create Page Rule」。
- 匹配URL:填写
你的域名/ws/*(比如example.com/ws/*)。 - 添加设置:
- 开启「WebSocket Support」。
- 设置「Forwarding URL」为
http://你的服务器IP:6001/$1($1用于保留原请求的路径参数)。 - 缓存级别设置为「Cache Level: Bypass」。
- 保存规则并启用。
3. 修改Soketi的Docker Compose配置
添加跨域允许配置,确保只有你的域名能访问Soketi:
soketi: image: 'quay.io/soketi/soketi:latest-16-alpine' environment: SOKETI_DEBUG: '1' SOKETI_METRICS_SERVER_PORT: '9601' SOKETI_ALLOWED_ORIGINS: 'https://你的域名' # 替换为你的实际域名 # 如果用数组管理应用,可添加此行(替换为你的应用信息) # SOKETI_APP_MANAGER_ARRAY: '[{"id":"你的APP_ID","key":"你的APP_KEY","secret":"你的APP_SECRET"}]' ports: - '${SOKETI_PORT:-6001}:6001' - '${SOKETI_METRICS_SERVER_PORT:-9601}:9601'
4. 调整Laravel广播配置
修改 config/broadcasting.php 的Pusher配置:
'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'host' => env('PUSHER_HOST') ?: '你的域名', 'port' => env('PUSHER_PORT') ?: 443, 'scheme' => env('PUSHER_SCHEME') ?: 'https', 'encrypted' => true, 'useTLS' => true, ], ],
修改 .env 文件:
PUSHER_SCHEME=https PUSHER_HOST=你的域名 PUSHER_PORT=443 # Vite环境变量用VITE_前缀,Mix用MIX_,根据你的项目工具调整 VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" VITE_PUSHER_HOST="${PUSHER_HOST}" VITE_PUSHER_PORT="${PUSHER_PORT}" VITE_PUSHER_SCHEME="https"
5. 调整前端Echo配置(resources/js/bootstrap.js)
import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; window.Echo = new Echo({ broadcaster: 'pusher', key: import.meta.env.VITE_PUSHER_APP_KEY, // Mix环境改为process.env.MIX_PUSHER_APP_KEY cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER, wsHost: import.meta.env.VITE_PUSHER_HOST, wsPort: import.meta.env.VITE_PUSHER_PORT, wssPort: import.meta.env.VITE_PUSHER_PORT, forceTLS: true, encrypted: true, disableStats: true, enabledTransports: ['ws', 'wss'], });
6. 重启服务验证
- 重启Soketi容器:
docker-compose up -d --force-recreate soketi - 重启Laravel应用(或队列广播服务,如果使用队列驱动)
- 用HTTPS访问应用,测试移动数据、外部主机的实时通信是否正常。
内容的提问来源于stack exchange,提问作者Pablo Camara
相关产品推荐
相关产品推荐

