生产环境Nginx下PeerJS服务器WebSocket连接失败求助
问题分析与解决方案
从你提供的信息来看,核心问题出在端口不匹配和PeerServer网络监听配置上,结合Nginx日志里的connect() failed (111: Unknown error),直接导致Nginx无法连接到PeerJS后端服务,进而引发WebSocket连接失败。以下是具体修复步骤:
1. 修复端口不匹配问题
你的PeerServer配置中端口为process.env.PEER_PORT || 3001,但Nginx的proxy_pass指向了http://localhost:5005/peerjs,两者端口完全不一致,这是Nginx连不上后端的直接原因。
修改Nginx配置:将proxy_pass的端口改为PeerServer实际使用的端口(比如默认的3001):
location /peerjs { proxy_pass http://localhost:3001/peerjs; # 端口与PeerServer保持一致 # 其他配置保留 }
2. 调整PeerServer监听配置
PeerServer当前设置host: 'localhost',这意味着它只接受本地进程的访问,Nginx作为反向代理无法连接到它。同时不需要给PeerServer配置SSL(Nginx已经做了SSL终止,后端用HTTP即可)。
修改PeerServer.mjs:
import 'dotenv/config' import { PeerServer } from 'peer' import { jwtVerify } from 'jose' const serverConfig = { port: Number(process.env.PEER_PORT || 3001), path: '/peerjs', host: '0.0.0.0', // 改为0.0.0.0,允许外部(Nginx)访问 allow_discovery: true, } // 其余代码保留...
3. 完善Nginx的WebSocket代理配置
添加必要的请求头和长连接超时设置,避免WebSocket连接被过早断开:
location /peerjs { proxy_pass http://localhost:3001/peerjs; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket长连接超时配置 proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; }
4. 补充客户端连接配置
明确指定secure: true和path: '/peerjs',确保客户端正确发起WSS请求:
this.peer = new Peer(this.manager.user.uuid, { token: accessToken, host: 'ps.mydomain.com', port: 443, secure: true, // 启用SSL模式 path: '/peerjs' // 指定PeerJS服务路径 })
验证步骤
- 重启PeerServer服务,确保它监听在
0.0.0.0:3001 - 重启Nginx:
sudo systemctl restart nginx - 测试后端连通性:
curl http://localhost:3001/peerjs,应返回PeerServer的JSON响应 - 重新测试客户端的WebSocket连接
内容的提问来源于stack exchange,提问作者user3331344
相关产品推荐
相关产品推荐

