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

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拉流:
    ffmpeg -i rtsp://你的RTSP输入URL -f mpegts -
    
    若命令报错,说明容器无法访问RTSP源,需排查:
    • 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_forward
    
    若输出为net.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:52:48