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
相关产品推荐
相关产品推荐

