Docker中Node.js应用Websocket流终止问题求助
Docker化rtsp-relay Node.js应用WebSocket连接终止问题排查与解决
核心问题场景
开发的Node.js应用基于rtsp-relay包实现RTSP转jsmpeg WebSocket流,本地运行正常,但Docker容器化后出现WebSocket连接终止,无法接收流数据;应用的HTTP API接口可正常访问,说明HTTP服务无问题,故障集中在WebSocket或FFmpeg流处理环节。
排查与解决方案
1. 确认端口映射与网络配置
- 务必映射WebSocket服务使用的端口(默认通常为9999,需与代码配置一致),Docker启动命令需同时包含API端口与WebSocket端口:
docker run -d -p 8080:8080 -p 9999:9999 你的镜像名 - 若使用
--network host模式,需确保容器端口未被宿主机其他进程占用,且RTSP源允许宿主机网络访问。
2. 验证容器内FFmpeg的有效性
- 进入容器检查FFmpeg版本与协议支持:
确认输出中包含docker exec -it 容器ID bash ffmpeg -version--enable-protocol=rtsp,否则需重新编译FFmpeg并开启RTSP协议支持。 - 手动测试RTSP拉流:
若命令报错,说明容器无法访问RTSP源,需排查:ffmpeg -i rtsp://你的RTSP输入URL -f mpegts -- RTSP设备是否允许容器所在网络的IP访问
- 容器是否能ping通RTSP设备的IP地址
3. 修正rtsp-relay的配置细节
- 确保WebSocket服务绑定到
0.0.0.0而非localhost,否则容器外无法连接:const { relay } = require('rtsp-relay')(app); const streamHandler = relay({ url: 'rtsp://你的输入URL', ws: { host: '0.0.0.0', port: 9999 } }); - 强制FFmpeg使用TCP方式拉取RTSP流,避免容器网络下UDP丢包导致的连接中断:
const streamHandler = relay({ url: 'rtsp://你的输入URL', ffmpegArguments: ['-rtsp_transport', 'tcp'] });
4. 排查WebSocket连接的错误日志
- 在应用中添加WebSocket的错误与关闭事件监听,输出详细信息:
const WebSocket = require('ws'); const wsServer = new WebSocket.Server({ port: 9999 }); wsServer.on('connection', (ws) => { ws.on('error', (err) => { console.error('WebSocket错误:', err.stack); }); ws.on('close', (code, reason) => { console.log('WebSocket断开: 状态码', code, '原因:', reason.toString()); }); }); - 通过
docker logs 容器ID查看日志,定位是否为FFmpeg进程崩溃、流数据中断等原因导致连接终止。
5. 检查网络策略与iptables规则
- 确认宿主机iptables规则允许容器端口的流量转发,比如针对Docker bridge网络的转发规则是否存在。
- 检查宿主机IPv4转发是否开启:
若输出为sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 0,需执行sysctl -w net.ipv4.ip_forward=1开启,并写入/etc/sysctl.conf永久生效。
6. 调整容器资源限制
- 若RTSP流分辨率较高或FFmpeg未优化编译,容器可能因CPU/内存不足导致进程终止,启动容器时增加资源配额:
docker run -d --cpus 2 --memory 2g -p 8080:8080 -p 9999:9999 你的镜像名
内容的提问来源于stack exchange,提问作者Akhil Varghese
相关产品推荐
相关产品推荐

