Laravel Websocket与Echo本地正常服务器失效:实时通知不触发排查
实时通知功能部署后无响应的排查思路
一、服务器端配置检查
- 更新广播配置Host:确保
config/broadcasting.php中pusher选项的host不是127.0.0.1,替换为服务器内网IP、公网IP或域名(根据websocket服务部署位置调整)。同时确认.env里的PUSHER_APP_KEY、PUSHER_APP_SECRET、PUSHER_APP_ID、PUSHER_APP_CLUSTER变量在服务器上配置正确。 - 确认Websockets服务运行状态:服务器需持续运行websocket服务,不能仅临时启动。用
ps aux | grep websockets查看进程是否存在;若未运行,先执行php artisan websockets:serve临时测试,后续通过Supervisor或systemd配置为后台守护进程。 - 查看Websockets服务日志:临时启动websocket服务(
php artisan websockets:serve),观察控制台输出是否有连接失败、认证错误或广播事件异常;若用守护进程,查看对应日志文件定位问题。 - 验证Vite环境变量:服务器
.env中的VITE_PUSHER_HOST必须设为服务器公网IP或域名(不能是127.0.0.1,否则前端无法连接),修改后执行npm run build重新编译前端资源,确保前端使用最新配置。
二、客户端检查
- 查看浏览器控制台错误:打开浏览器开发者工具(F12)的Console标签,检查是否有Pusher/Echo连接失败、密钥无效、CORS报错等信息,直接定位前端连接问题。
- 确认Echo连接参数:在浏览器控制台执行
Echo.connector.options,检查wsHost是否为服务器公网IP/域名、wsPort是否为6001、key是否与服务器端一致。参数错误说明前端资源未正确编译或环境变量配置有误。 - 检查CORS配置:
- Laravel端:
config/cors.php的paths需包含websocket相关路径(如/ws/*),allowed_origins允许前端域名(测试时可临时设为*)。 - Websockets端:
config/websockets.php中apps下的allowed_origins数组需添加前端访问的域名。
- Laravel端:
三、网络与防火墙检查
- 开放6001端口:服务器防火墙(UFW、iptables或云服务商安全组)必须允许外部访问6001端口。用
telnet 服务器IP 6001或nc -zv 服务器IP 6001测试端口是否可达,不通则调整防火墙规则。 - HTTPS环境适配:若网站使用HTTPS,浏览器会阻止未加密的
ws://连接,需配置websocket服务使用SSL:- 服务器端广播配置中,将
scheme改为https,forceTLS设为true,并配置正确的SSL端口(如6002)。 - 前端Echo配置中,使用
wssHost和wssPort,确保连接协议为wss://。
- 服务器端广播配置中,将
四、其他潜在问题
- 私有频道认证:实时通知使用私有频道,确保
/broadcasting/auth路由正常工作。通过POST请求测试该路由(携带频道名参数),若返回403或错误,检查CSRF令牌、用户认证状态或频道授权逻辑。 - 队列配置:若
.env中QUEUE_CONNECTION不是sync,需确保服务器运行队列worker(php artisan queue:work),否则广播事件会堆积在队列中无法触发。 - 清除缓存:执行
php artisan config:clear、php artisan cache:clear清除服务器缓存,确保最新配置生效。
内容的提问来源于stack exchange,提问作者Vpa
相关产品推荐
相关产品推荐

