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请求使用缓存,避免连接异常
验证步骤
- 重启Nginx容器使配置生效:
docker-compose restart nginx - 使用Postman测试WebSocket连接:
- 选择WebSocket请求类型,输入地址:
ws://localhost:3000/academic/socket.io/?EIO=4&transport=websocket - 发送连接请求,此时可在NestJS服务日志中看到
Socket connected => [socket-id]的输出
- 选择WebSocket请求类型,输入地址:
若直接填ws://localhost:3000/academic/无法连接,是因为Socket.io默认使用/socket.io路径进行握手,需带上完整路径参数。
额外注意事项
- 你的NestJS
WebSocketGateway使用默认配置,无需修改路径或端口 - 可进入Nginx容器执行
ping academic-api,验证容器间网络连通性
内容的提问来源于stack exchange,提问作者Husnul Aman
相关产品推荐
相关产品推荐

