使用@fastify/websocket切换到HTTPS后无法建立ws/wss连接
解决Fastify + @fastify/websocket HTTPS环境下wss连接失败问题
针对你遇到的HTTPS下WebSocket无法建立连接的问题,可按以下步骤排查修复:
1. 客户端必须使用wss://协议
HTTP环境对应ws://前缀,HTTPS环境下必须使用wss://作为WebSocket连接地址前缀,例如客户端连接代码应为:
new WebSocket('wss://your-domain.com/live');
2. 调整CORS配置以支持WebSocket握手
WebSocket握手依赖Upgrade、Connection等特殊请求头,需在@fastify/cors中明确允许这些头及相关请求方法:
fastify.register(require("@fastify/cors"), { origin: config.domains, credentials: true, allowedHeaders: ['Upgrade', 'Connection', 'Sec-WebSocket-Key', 'Sec-WebSocket-Version'], methods: ['GET', 'OPTIONS'] });
3. 为HTTPS实例启用日志,排查握手错误
你的HTTPS模式Fastify实例未开启日志,添加logger: true后可查看WebSocket握手的详细请求日志,快速定位是否有403/500等错误:
const fastify = config.https === false ? require("fastify")({ serverTimeout: 60 * 60 * 1000, logger: true }) : require("fastify")({ serverTimeout: 60 * 60 * 1000, logger: true, // 新增日志配置 https: { key: fs.readFileSync(config.privKey), cert: fs.readFileSync(config.certKey), } });
4. 验证HTTPS证书完整性
如果你的证书包含中间CA证书,需确保将完整证书链传入cert字段,或者单独配置ca选项:
https: { key: fs.readFileSync(config.privKey), cert: fs.readFileSync(config.certKey), // 可包含主证书+中间证书内容 // 若中间证书单独存放,添加以下配置: // ca: fs.readFileSync('./path/to/ca-chain.pem') }
5. 确认插件版本兼容性
检查@fastify/websocket与Fastify主版本是否兼容,例如Fastify v4需要搭配@fastify/websocket v7及以上版本。可通过以下命令查看版本:
npm list
若版本不兼容,执行升级命令:
npm install @fastify/websocket@latest
按上述步骤调整后,重新启动服务测试wss连接,若仍有问题可通过Fastify日志输出的握手请求信息进一步定位。
内容的提问来源于stack exchange,提问作者Simone Zappatini
相关产品推荐
相关产品推荐

