解决Laravel部署至VPS后无法获取Socket.io的SSL协议错误问题
解决Laravel Echo部署Ubuntu-Nginx环境后SSL协议错误问题
出现GET https://example.com:6001/socket.io/socket.io.js net::ERR_SSL_PROTOCOL_ERROR的核心原因是:浏览器用HTTPS协议访问6001端口,但该端口的Socket.IO服务未配置SSL证书,也没通过Nginx做SSL反向代理——主站正常是因为Nginx已经为443端口配置了SSL,和6001端口的服务是独立的。
下面是两种可行的解决办法:
方案1:Nginx反向代理Socket.IO(推荐生产环境使用)
通过Nginx统一处理SSL,无需直接暴露6001端口,更安全规范:
- 编辑你的Nginx站点配置文件(通常在
/etc/nginx/sites-available/example.com),添加以下反向代理规则:
location /socket.io { proxy_pass http://localhost:6001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
- 重启Nginx生效配置:
sudo systemctl restart nginx
- 修改前端代码,去掉端口号,直接走主站域名:
- Blade模板中的script标签:
<script src="{{ url('/socket.io/socket.io.js') }}"></script>
laravel-echo-setup.js中的Echo配置:
import Echo from "laravel-echo"; window.Echo = new Echo({ broadcaster: "socket.io", host: window.location.protocol + "//" + window.location.hostname, });
方案2:给Socket.IO服务直接配置SSL
如果必须直接使用6001端口,需要让Socket.IO服务加载SSL证书:
- 修改Laravel的
config/broadcasting.php,为socketio驱动添加SSL配置(替换成你的证书路径):
'socketio' => [ 'driver' => 'socketio', 'host' => env('SOCKET_IO_HOST', 'localhost'), 'port' => env('SOCKET_IO_PORT', 6001), 'ssl' => [ 'cert' => '/etc/ssl/certs/example.com.crt', 'key' => '/etc/ssl/private/example.com.key', ], ],
- 重启Laravel Echo Server:
laravel-echo-server restart
- 开放服务器防火墙的6001端口TCP流量:
sudo ufw allow 6001/tcp
内容的提问来源于stack exchange,提问作者nguyenthanhson
相关产品推荐
相关产品推荐

