美文网首页Nginx
Nginx Rtmp Learing 之HTTP HOOK回调

Nginx Rtmp Learing 之HTTP HOOK回调

作者: lo踏风 | 来源:发表于2017-09-07 15:55 被阅读267次

    Nginx Rtmp Learing 之HTTP HOOK回调

    1. 名词解释

    • LMSS Live Media Streaming Service 直播流媒体服务
    • LMDS Live Media dispatch Service 直播媒体调度服务

    2. 概述

    1. 在nginx的rtmp协议实现中,一个简单的推拉流会被拆分成多个事件(CONNECT,PUBLISH,UPDATE,PUBLISH_DONE,PLAY)等等。
    2. LMSS 模块会将RTMP推拉流请求中的每种事件定制为一种HOOK请求发往后端的调度模块(LMDS)。
    3. LMDS模块当接收到HOOK请求后会完成类似用户合法性验证、用户配置信息获取、级联信息查询等等逻辑。
    4. LMSS在接收到LMDS的响应之前会暂停命令处理,直到它返回结果代码。

    原生的nginx rtmp模块已经支持了上述HOOK的功能,所以本文不在讲述具体的实现原理。只简单的介绍下,它的配置及字段含义。

    3. nginx.conf配置实例

    rtmp {
        ...
        
        on_connect             unix:/dev/shm/rtmp.sock:/connect;
        on_publish             unix:/dev/shm/rtmp.sock:/publish;
        on_play                unix:/dev/shm/rtmp.sock:/play;
        on_update              unix:/dev/shm/rtmp.sock:/update;
        on_publish_done        unix:/dev/shm/rtmp.sock:/publish_done;
        
        server {
         ...
        }
    }
    
    http {
        server {
                listen unix:/dev/shm/rtmp.sock;
        
                location =/connect {
                    proxy_set_header Host $host;
                    proxy_pass http://lmds/connect;
                    proxy_http_version 1.1;
                    proxy_set_header Connection "";
                }
        
                location =/publish {
                    proxy_set_header Host $host;
                    proxy_pass http://lmds/publish;
                    proxy_http_version 1.1;
                    proxy_set_header Connection "";
                }
        
                location =/play {
                    proxy_set_header Host $host;
                    proxy_pass http://lmds/play;
                    proxy_http_version 1.1;
                    proxy_set_header Connection "";
                }
        
                location =/update {
                    proxy_set_header Host $host;
                    proxy_pass http://lmds/update;
                    proxy_http_version 1.1;
                    proxy_set_header Connection "";
                }
        
                location =/publish_done {
                    proxy_set_header Host $host;
                    proxy_pass http://lmds/publish_done;
                    proxy_http_version 1.1;
                    proxy_set_header Connection "";
                }
            }
    }
    
    upstream lmds {
        #round-robin by default
        server 127.0.0.1:80;
        keepalive 60;
    }
    
    

    Lmss 和Lmds服务器之间会频繁通过HTTP进行交互。为了减少频繁建立和释放HTTP所带来的损耗,可以采用在两个服务器之间采用proxy代理及unix socket实现http长连接的方式。

    3.1 on_connect

    • 语法

    on_connect url

    • 上下文

    rtmp, server

    • 描述

      1. 设置 HTTP 连接回调。当客户分发连接命令一个连接命令时,一个 HTTP 请求异步发送,命令处理将被暂停,直到它返回结果代码。当 HTTP 2XX 码(成功状态码)返回时,RTMP 会话继续。返回码 3XX (重定向状态码)会使 RTMP 重定向到另一个从 HTTP 返回头里获取到的 application。否则(其他状态码)连接丢弃。
      2. 注意这一指令在 application 域是不允许的,因为 application 在连接阶段还是未知的。
        HTTP 请求接收到一些参数。在 application/x-www-form-urlencoded MIME 类型下使用 POST 方法。以下参数将被传给调用者:
      call=connect。
      * addr - 客户端 IP 地址。
      * app - application 名。
      * flashVer - 客户端 flash 版本。
      * swfUrl - 客户端 swf url。
      * tcUrl - tcUrl。
      * pageUrl - 客户端页面 url。
      
      

    除了上述参数以外,所有显式传递给连接命令args的参数也由回调发送。

    3.2 on_publish

    • 语法

    on_publish url

    • 上下文

    rtmp, serverapplication

    • 描述

    同上面提到的 on_play 一样,唯一的不同点在于这个指令在发布命令设置回调。不同于远程 pull,push 在这里是可以的。

    除了上述参数以外,所有显式传递给连接命令args的参数也由回调发送。

    3.3 on_update

    • 语法

    on_update url

    • 上下文

    rtmp, serverapplication

    • 描述

    设置 update 回调。这个回调会在 notify_update_timeout 期间调用。如果一个请求返回结果不是 2XX,连接禁止。这可以用来同步过期的会话。追加 time 参数即播放/发布调用后的秒数会被发送给处理程序。

    3.4 on_publish_done

    • 语法

    on_publish_done url

    • 上下文

    rtmp, serverapplication

    • 描述

    等同于 on_done 的表现,但只适用于发布结束事件。

    3.5 on_play

    • 语法

    on_play url

    • 上下文

    rtmp, serverapplication

    • 描述
    1. 设置 HTTP 播放回调。每次一个客户分发播放命令时,一个 HTTP 请求异步发送,命令处理会挂起 - 直到它返回结果码。之后再解析 HTTP 结果码。
    2. HTTP 2XX 返回码的话继续 RTMP 会话。
    3. HTTP 3XX 返回码的话 重定向 RTMP 到另一个流,这个流的名字在 HTTP 返回头的 Location 获取。如果新流的名字起始于 rtmp:// 然后远程 relay 会被创建。relay 要求 IP 地址是指定的而不是域名,并且只工作在 1.3.10 版本以上的 nginx。另请参考 notify_relay_redirect。
    4. 其他返回码的话 RTMP 连接丢弃。

    HTTP 请求接收到一些个参数。在 application/x-www-form-urlencoded MIME 类型下使用 POST 方法。以下参数会被传送给调用者:

    * call=play。
    * addr - 客户端 IP 地址。
    * app - application 名。
    * flashVer - 客户端 flash 版本。
    * swfUrl - 客户端 swf url。
    * tcUrl - tcUrl。
    * pageUrl - 客户端页面 url。
    * name - 流名。
    出了上述参数之外其他所有播放命令参数显式地发送回调。例如如果一个流由 url rtmp://localhost/app/movie?a=100&b=face&foo=bar 访问,然后呢 a,b 和 foo 发送回调。
    

    参考:

    http://blog.csdn.net/defonds/article/details/9274479
    https://github.com/arut/nginx-rtmp-module/wiki/Directives#on_connect

    相关文章

      网友评论

        本文标题:Nginx Rtmp Learing 之HTTP HOOK回调

        本文链接:https://www.haomeiwen.com/subject/gumijxtx.html