NestJS部署至Google App Engine标准环境后websocket传输失效仅支持长轮询
API侧(NestJS项目)配置调整
- 若使用Socket.IO实现WebSocket服务,显式声明允许的传输类型,确保包含
websocket,同时匹配前端的CORS规则:
若使用原生WS库,需要显式处理HTTP升级事件,不要拦截// NestJS WebSocketGateway 配置示例 @WebSocketGateway({ transports: ['websocket', 'polling'], cors: { origin: "你的Angular前端域名", credentials: true } })Upgrade请求头。 - 在NestJS启动配置中开启信任代理设置,App Engine的请求会经过GCP前置反向代理,不信任代理会导致WebSocket升级请求的头校验失败:
// main.ts bootstrap 函数中添加 async function bootstrap() { const app = await NestFactory.create(AppModule); app.set('trust proxy', true); await app.listen(process.env.PORT || 8080); } - 新增WebSocket错误捕获逻辑,避免异常未上报到日志系统:
// 在Gateway中添加连接错误监听 @OnGatewayConnection() handleConnection(socket: Socket) { socket.on('error', (err) => { console.error('WebSocket连接错误:', JSON.stringify(err)); }); } // 全局监听Socket.IO连接升级错误 @OnGatewayInit() afterInit(server: Server) { server.on('connection_error', (err) => { console.error('WebSocket升级失败:', err); }); }
GCP App Engine标准环境部署侧配置调整
App Engine标准环境默认会拦截WebSocket升级请求,需要在app.yaml中显式开启相关配置:
- 调整handler规则,匹配WebSocket请求路径的规则添加
websocket: true参数,允许GCP转发升级请求,同时使用14及以上版本的Node.js运行时(旧版本不支持WebSocket):runtime: nodejs18 service: 你的服务名 handlers: # 匹配你的WebSocket请求路径,Socket.IO默认路径为/socket.io/ - url: /socket.io/.* script: auto websocket: true secure: always # 其他普通请求规则 - url: /.* script: auto secure: always - 开启会话亲和性,保证同一个客户端的WebSocket请求始终调度到同一个实例,避免跨实例握手失败:
network: session_affinity: true - 不要使用免费的F1/F2级实例,免费实例有休眠机制和连接数限制,会主动断开长连接,至少使用B1及以上的基础实例,或G1及以上的自动扩缩容实例。
内容的提问来源于stack exchange,提问作者Blair Holmes
相关产品推荐
相关产品推荐

