Laravel Websockets配置Let's Encrypt SSL跨浏览器连接问题排查
生产环境Laravel Websockets SSL配置问题排查
我正尝试在生产服务器上配置Laravel Websockets以通过SSL运行。起初以为配置正确,因为能通过生产服务器访问Laravel Websockets仪表盘,但后来发现仅在本地可用。本地机器上Chrome无法连接Websockets服务器,但Firefox可以;其他机器上Firefox和Chrome均无法连接。我使用Let's Encrypt证书,以下是我的配置信息:
.env 配置
PUSHER_APP_ID=12345 PUSHER_APP_KEY=ABCDEFG PUSHER_APP_SECRET=HIJKLMNOP PUSHER_HOST=xxx.xxxxx.xxx PUSHER_PORT=6001 PUSHER_SCHEME=https PUSHER_APP_CLUSTER=mt1 LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT=/etc/letsencrypt/live/xxx.xxxxx.xxx/fullchain.pem LARAVEL_WEBSOCKETS_SSL_LOCAL_PK=/etc/letsencrypt/live/xxx.xxxxx.xxx/privkey.pem
broadcasting.php 配置
'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', 'port' => env('PUSHER_PORT', 443), 'scheme' => env('PUSHER_SCHEME', 'https'), 'encrypted' => true, 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', ], 'client_options' => [ // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html ], ],
请问这是SSL问题还是我遗漏了某些配置?
排查方向
- 端口与防火墙检查:
确保生产服务器的6001端口已对外开放,服务器本地防火墙(如ufw、iptables)允许TCP流量通过该端口。如果是云服务器,还要检查服务商的安全组规则,是否放行6001端口的入站流量——这是跨机器无法连接的高频原因。 - SSL证书有效性验证:
确认证书文件路径正确,且Laravel进程拥有读取证书的权限(可将证书文件所属组设为www-data或运行Laravel的用户组)。用命令openssl s_client -connect xxx.xxxxx.xxx:6001测试SSL连接,查看返回的证书信息是否有效、域名是否匹配。 - Chrome连接限制排查:
Chrome对WebSocket的HTTPS连接安全校验更严格,比如证书必须包含正确的SAN(主题备用名称)。打开Chrome控制台的Network标签,查看WebSocket连接的错误日志,通常会显示具体问题(如证书不被信任、连接超时)。 - 配置细节调整测试:
在broadcasting.php的options中临时添加'curl_options' => [CURLOPT_SSL_VERIFYPEER => false](仅用于测试,生产环境不要长期开启),排除证书验证环节的问题。同时确认前端WebSocket连接地址格式正确,比如wss://xxx.xxxxx.xxx:6001/app/ABCDEFG?protocol=7&client=js&version=7.6.0&flash=false,确保App Key与配置一致。 - 服务稳定性检查:
确认php artisan websockets:serve进程在后台稳定运行,建议用supervisor等工具管理进程避免意外终止。查看Laravel日志(storage/logs/laravel.log)或Websockets专属日志,排查是否有SSL相关的报错信息。
内容的提问来源于stack exchange,提问作者Jheems
相关产品推荐
相关产品推荐

