Node.js Express中SocketIO在HTTPS环境下连接失败求助
Socket.IO在Nginx HTTPS环境下跨子域连接失败问题
我将两个Node.js应用部署到使用Nginx提供HTTPS服务的Ubuntu服务器后出现异常:本地localhost环境下Socket.IO连接正常,但服务器部署后,admin.domainname.com的客户端控制台报错:
manager.js:108 WebSocket connection to 'wss://domainname.com/socket.io/?EIO=4&transport=websocket' failed
主应用(domainname.com)Socket初始化代码
/*rest of app.js file with express.js*/ const PORT = 3000; const server = app.listen(PORT, () => { console.log(`Server running on port ${PORT}`) }) const socket = socketIo(server); socket.on('connection', (socket) => { console.log("connected") socket.emit("testmessage", "Hello World") socket.on('disconnect', () => {}); });
子应用(admin.domainname.com)客户端接收代码
const socketdomainconstruct = () => { if (location.port) { return "http://localhost:3000" } else { return "https://domainname.com" } } const socket = io(socketdomainconstruct(), { transports: ['websocket', 'polling', 'flashsocket'] }); socket.on("connect", () => { console.log("connected"); socket.on("testmessage", (message) => { console.log(message); }); });
关键现象
使用http://localhost:3000连接时完全正常,仅切换到HTTPS环境时触发WebSocket连接失败。
已排查方向及配置
- Socket服务器初始化方式:疑惑是否需要在Node.js层面配置HTTPS?目前仅通过Nginx配置了SSL证书。
- CORS配置:虽未出现CORS相关错误,但已设置如下请求头中间件:
app.use((req, res, next) => { res.removeHeader('Server'); res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0'); res.setHeader('Pragma', 'no-cache'); res.setHeader('Expires', '0'); res.setHeader('Last-Modified', new Date().toUTCString()); res.setHeader('Content-Security-Policy', "default-src 'self'; script-src 'self' 'unsafe-inline' cdn.socket.io code.jquery.com cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' bing.com; connect-src 'self' *"); res.setHeader('Permission-Policy', 'accelerometer=(), camera=(), microphone=(), geolocation=(), gyroscope=()'); res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('X-Content-Type-Options', 'nosniff'); res.setHeader('X-Frame-Options', 'deny'); res.setHeader('X-XSS-Protection', '1; mode=block'); res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains'); res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin'); next(); });
希望能得到排查思路或解决方案,官方文档提及两种常见初始化场景:HTTPS服务器搭配Socket.IO、Express框架搭配Socket.IO。
内容的提问来源于stack exchange,提问作者raffaelbaer
相关产品推荐
相关产品推荐

