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

Nginx RTMP对接Django的直播流启停配置问题答疑

问题解答

不需要定义两个独立application实现流启停。你当前配置存在多处语法和逻辑错误,核心是对Nginx RTMP模块的配置规则理解有偏差:

  • RTMP配置中application后只需要填写路径段名称,不是完整URL。比如推流地址为rtmp://x.x.x.x/live时,application名就是live
  • 直播流的启停不需要靠切换application的live参数实现:推流端主动断开连接、或者推流鉴权失败时,Nginx会自动终止对应流,同时可以通过回调通知你的Django服务处理业务逻辑
  • hls_path是Nginx服务器本地的磁盘存储路径,不是RTMP/HTTP URL,HLS生成的ts切片、m3u8播放列表会存在这个目录下,供HTTP服务读取返回给播放器
  • HTTP块中location后只需要填写URL路径匹配规则,不是完整URL
  • 你当前配置中单独定义的hlsapplication放在了rtmp块外部,Nginx无法识别加载

正确对接逻辑

流的启停业务逻辑全部通过Nginx RTMP的事件回调对接8000端口的Django服务实现,只需要1个推流入站application即可:

  • 推流端发起推流请求时,Nginx自动调用Django的/api/livevideostreams/startstream接口做鉴权,接口返回200则允许推流,返回其他状态码直接拒绝推流
  • 推流端主动断开、推流异常中断时,Nginx自动调用Django的/api/livevideostreams/stopstream接口,Django侧更新直播状态、处理回放等后续逻辑即可
  • HLS切片统一由专门的hls application处理,只允许本地推流写入,禁止外部直接推流/播放
  • HTTP服务在8080端口暴露HLS文件存储目录,供前端播放器拉取m3u8和ts文件播放

修正后的完整配置

worker_processes  auto;
events {
    worker_connections  1024;
}

# RTMP服务配置
rtmp {
    server {
        listen 1935; # 标准RTMP端口
        chunk_size 4000;

        # 推流入站application,推流地址为 rtmp://<服务器IP>:1935/live/<流密钥>
        application live {
            live on;
            deny play all; # 禁止直接通过RTMP协议拉流

            # 推流开始回调,对接Django启动流鉴权接口
            on_publish http://127.0.0.1:8000/api/livevideostreams/startstream;
            # 推流结束回调,对接Django停流处理接口
            on_publish_done http://127.0.0.1:8000/api/livevideostreams/stopstream;

            # 推流成功后自动转推到本地HLS切片application
            push rtmp://127.0.0.1:1935/hls;
        }

        # HLS切片处理application,仅接受本地转推的流
        application hls {
            live on;
            hls on;
            hls_nested on;
            hls_fragment 3;
            hls_playlist_length 60;
            hls_fragment_naming system;
            hls_datetime system;
            # HLS文件本地存储路径,提前创建好目录并给Nginx读写权限
            hls_path /mnt/hls;

            # 仅允许本机转推,禁止外部用户推流/拉RTMP流
            allow publish 127.0.0.1;
            deny publish all;
            deny play all;
        }
    }
}

# HTTP服务配置,用于分发HLS流
http {
    sendfile off;
    tcp_nopush on;
    directio 512;
    default_type application/octet-stream;

    server {
        listen 8080;

        # HLS流访问路径,播放器访问 http://<服务器IP>:8080/hls/<流密钥>.m3u8
        location /hls/ {
            # 对应HLS文件本地存储根目录
            root /mnt/;

            # 禁用缓存
            add_header 'Cache-Control' 'no-cache';
            # CORS跨域配置
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length';

            # 处理CORS预检请求
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;
                return 204;
            }

            types {
                application/dash+xml mpd;
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
        }
    }
}

部署注意事项

  • 提前创建/mnt/hls目录,给Nginx运行用户分配读写权限,否则HLS切片无法写入
  • Django侧的两个回调接口需要接收Nginx POST传递的name参数(即推流时填写的流密钥),用来匹配对应直播间
  • 如果需要做HTTPS、访问鉴权,可以在HTTP服务前加一层Nginx反向代理处理,不影响RTMP核心逻辑

内容的提问来源于stack exchange,提问作者Harsh Wasnik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:24:24