如何从SSL加密网站通过HTTPS加载socketio服务?
问题核心原因
/socket.io/socket.io.js返回404的直接原因是你提供的server.js代码中,没有初始化Socket.IO实例,也没有将Socket.IO绑定到你创建的HTTPS服务上,服务端没有对应路由处理该资源请求。
修复步骤
- 修改
server.js代码,补充Socket.IO初始化逻辑,修正后参考代码如下:
const express = require('express'); const app = express(); const https = require('https'); const fs = require('fs'); // 引入Socket.IO const { Server } = require("socket.io"); var options = { key: fs.readFileSync('/etc/letsencrypt/live/你的域名/privkey.pem'), // 建议替换为证书绝对路径 cert: fs.readFileSync('/etc/letsencrypt/live/你的域名/cert.pem') }; const sslserver = https.createServer(options,app); // 将Socket.IO挂载到HTTPS服务上 const io = new Server(sslserver); // 连接处理逻辑 io.on('connection', (socket) => { // 你的业务逻辑 }); // 监听端口 sslserver.listen(8000, () => { console.log('listening on *: 8000'); });
- 端口权限配置
- 检查服务器本地防火墙规则,放行8000端口的TCP入站访问
- 若使用云服务器,同步在云服务商的安全组配置中放行8000端口
- 证书有效性校验
- 确认证书文件路径正确,运行Node服务的账户拥有证书文件的读取权限
- 可先在服务器本地执行
curl https://www.example.com:8000/socket.io/socket.io.js验证资源是否可正常返回
可选优化(无需对外暴露8000端口)
如果你不想对外暴露8000端口,可以使用Apache反向代理处理Socket.IO请求,在你的Apache SSL虚拟主机配置中加入以下规则即可:
ProxyRequests Off ProxyPreserveHost On # 处理WebSocket协议的Socket.IO请求 ProxyPass /socket.io/ ws://127.0.0.1:8000/socket.io/ ProxyPassReverse /socket.io/ ws://127.0.0.1:8000/socket.io/
配置完成后前端代码可以修改为直接请求当前域名的路径,无需携带端口:
<script src="/socket.io/socket.io.js"></script> <script> var socket = io.connect({'multiplex': false}); </script>
内容的提问来源于stack exchange,提问作者Grogu
相关产品推荐
相关产品推荐

