You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker+Nginx环境下NestJS微服务的Socket.io反向代理连接问题

解决Docker+Nginx反向代理下NestJS Socket.io WebSocket连接问题

你的问题核心是Nginx默认未配置WebSocket协议的转发规则,Socket.io建立连接时需要先通过HTTP请求完成协议升级,原有Nginx配置缺少必要的头信息和升级处理逻辑,导致代理后的WebSocket请求无法被NestJS服务正确识别。

解决方案:修改Nginx配置添加WebSocket代理支持

更新你的nginx.conf,在/academic/的location块中添加WebSocket代理所需的配置项:

worker_processes 1;

events { worker_connections 1024; }

http {

  upstream users {
    server user-api:3000;
  }

  upstream academic {
    server academic-api:3000;
  }
 
  server {
    listen 80;

    location /users/ {
      proxy_pass http://users/;
    }

    location /academic/ {
      proxy_pass http://academic/;
      # 启用WebSocket代理支持
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
    }
  }
}

关键配置说明:

  • proxy_http_version 1.1: 强制使用HTTP/1.1协议,WebSocket依赖该版本的Upgrade机制完成协议切换
  • proxy_set_header Upgrade $http_upgrade: 转发客户端发起的协议升级请求头
  • proxy_set_header Connection "upgrade": 明确告知后端服务这是一个WebSocket升级请求
  • proxy_set_header Host $host: 确保后端服务能正确识别请求的主机地址
  • proxy_cache_bypass $http_upgrade: 禁止对WebSocket请求使用缓存,避免连接异常

验证步骤

  1. 重启Nginx容器使配置生效:
    docker-compose restart nginx
    
  2. 使用Postman测试WebSocket连接:
    • 选择WebSocket请求类型,输入地址:ws://localhost:3000/academic/socket.io/?EIO=4&transport=websocket
    • 发送连接请求,此时可在NestJS服务日志中看到Socket connected => [socket-id]的输出

若直接填ws://localhost:3000/academic/无法连接,是因为Socket.io默认使用/socket.io路径进行握手,需带上完整路径参数。

额外注意事项

  • 你的NestJS WebSocketGateway使用默认配置,无需修改路径或端口
  • 可进入Nginx容器执行ping academic-api,验证容器间网络连通性

内容的提问来源于stack exchange,提问作者Husnul Aman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:45:37