部署在Azure App Service的Node.js Socket.IO连接问题求助
环境配置
- Node.js应用已部署至Azure Web App;
- Socket.IO服务器配置监听自定义端口8444;
- 已配置CORS允许特定域名访问;
- 服务器代码:
const { createServer } = require('http'); const { Server } = require('socket.io'); const express = require('express'); const app = express(); const httpServer = createServer(app); const io = new Server(httpServer, { serveClient: false, path: '/api/socket/', cors: { origin: [ 'http://localhost:3000', ] }, }); const port = process.env.PORT || 8444; httpServer.listen(port, () => { console.log(`Socket.IO server listening on port ${port}`); });
故障情况
服务器运行无报错,但客户端无法建立WebSocket连接。已排查网络配置、端口可达性,问题仍未解决。
排查建议
修正Azure Web App端口监听逻辑
Azure Web App不支持直接监听自定义端口(如8444),平台会自动分配内部端口并通过process.env.PORT传入。部署后必须确保仅使用process.env.PORT,本地开发可保留8444作为 fallback。客户端连接时不要指定端口,直接使用Azure Web App的默认域名(如https://your-app-name.azurewebsites.net),平台会自动转发请求到内部端口。完善CORS配置
- 确保
origin数组包含客户端实际部署的域名(不能仅保留localhost:3000),比如生产环境的https://your-client-domain.com; - 若客户端需要携带凭证(如Cookie),需显式添加
credentials: true,同时补充允许的请求方法,示例:
cors: { origin: ['http://localhost:3000', 'https://your-client-domain.com'], methods: ["GET", "POST"], credentials: true }
- 匹配客户端连接路径
客户端连接时必须严格对应服务器配置的path: '/api/socket/',示例客户端代码:
import { io } from "socket.io-client"; const socket = io("https://your-app-name.azurewebsites.net", { path: "/api/socket/" });
启用Azure Web App的WebSocket支持
在Azure Portal中进入你的Web App → 配置 → 常规设置,找到「Web sockets」选项,设置为启用。默认情况下Azure Web App可能禁用WebSocket,这会直接导致连接失败。排查日志与客户端请求
- 查看Azure Portal的「日志流」,实时确认服务器是否收到连接请求、是否有CORS错误或其他异常;
- 打开客户端浏览器开发者工具的Network标签,查看WebSocket请求的状态码(如404、403)及响应头的CORS信息,定位具体错误原因。
确认版本兼容性
确保客户端socket.io-client与服务器socket.io版本完全一致(如均为4.x系列),版本不匹配会导致握手失败。可通过npm list socket.io查看服务器版本,客户端安装对应版本的包。测试长轮询降级
暂时在客户端配置中强制使用长轮询,排除WebSocket协议层面的问题:
const socket = io("https://your-app-name.azurewebsites.net", { path: "/api/socket/", transports: ["polling"] });
如果长轮询能正常连接,说明问题集中在WebSocket协议配置,重点检查Azure的WebSocket开关及网络代理设置。
内容的提问来源于stack exchange,提问作者Muhammad Umair

