You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Echo与Socket.IO在VPS环境下出现transport polling 404及ERR_CONNECTION_CLOSED循环连接问题求助

解决Laravel Echo Server + Socket.IO在VPS部署后无法连接的问题

根据你的描述,本地环境正常但部署到VPS后出现循环404和连接关闭的错误,核心问题大概率是HTTPS与HTTP的混合内容拦截、端口访问限制或者反向代理配置缺失。下面分步骤给出针对性的解决方案:

1. 优先处理HTTPS混合内容拦截(最可能的诱因)

你的网站使用HTTPS协议,但Laravel Echo Server配置的是HTTP协议("protocol": "http"),前端尝试从HTTPS页面连接HTTP的example.com:6001,浏览器会直接拦截这种"混合内容"请求,导致连接失败。这里提供两种解决思路:

方案A:为Laravel Echo Server配置SSL

修改laravel-echo-server.json,启用HTTPS并配置你的Let's Encrypt证书:

{
  "protocol": "https",
  "sslCertPath": "/etc/letsencrypt/live/example.com/fullchain.pem",
  "sslKeyPath": "/etc/letsencrypt/live/example.com/privkey.pem",
  // 其他原有配置保持不变
}

重启Laravel Echo Server生效:

supervisorctl restart echo-server

同时修改前端app.js的Echo配置,明确指定HTTPS协议:

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: 'https://' + window.location.hostname + ':6001',
});

方案B:通过Apache反向代理Socket.IO(更安全推荐)

让Apache统一处理HTTPS请求,反向代理到本地的6001端口,这样前端不需要直接访问6001端口,既避免混合内容问题,也无需开放外部端口。

修改你的Apache虚拟主机配置(.conf),在<VirtualHost>标签内添加反向代理规则:

# 先确保启用必要模块(首次配置执行)
# a2enmod proxy proxy_http proxy_wstunnel

# 处理Polling请求
ProxyPass /socket.io http://localhost:6001/socket.io
ProxyPassReverse /socket.io http://localhost:6001/socket.io
# 处理WebSocket连接
ProxyPass /socket.io/ ws://localhost:6001/socket.io/
ProxyPassReverse /socket.io/ ws://localhost:6001/socket.io/

重启Apache生效:

systemctl restart apache2

修改前端app.js的Echo配置,去掉端口,改用域名路径:

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname,
    path: '/socket.io',
});

2. 确认VPS防火墙/安全组配置(仅针对方案A)

如果选择方案A直接使用6001端口,需要确保VPS的防火墙和云服务商的安全组允许外部访问6001端口:

  • 对于UFW防火墙:
ufw allow 6001/tcp
ufw reload
  • 对于云服务商(如阿里云、AWS等),需要在安全组规则中添加入站规则,允许TCP 6001端口的外部访问。

3. 检查Laravel Echo Server监听配置

你的laravel-echo-server.json中"host": null默认会监听所有地址(:::6001),这本身没问题,但如果VPS有多网卡,也可以明确指定"host": "0.0.0.0"确保监听所有IP地址。

4. 验证连接有效性

完成配置后,用curl测试Socket.IO连接是否正常:

# 方案B测试命令
curl https://example.com/socket.io/?EIO=4&transport=polling
# 方案A测试命令
curl https://example.com:6001/socket.io/?EIO=4&transport=polling

如果返回类似0{"sid":"xxxxxx","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}的内容,说明连接配置正常。同时查看echoserver.log,如果出现用户连接的日志,就代表前端已经成功建立连接。

额外注意事项

  • 版本兼容性:确保前端Socket.IO客户端版本(你用的是4.0.1)与Laravel Echo Server依赖的Socket.IO服务端版本匹配(可查看项目package.json中的socket.io版本),版本不兼容也会导致连接失败。
  • 清除浏览器缓存:旧的缓存可能残留错误配置,测试前建议清除缓存或使用无痕模式访问。

内容的提问来源于stack exchange,提问作者Kuasar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:27:35