Nginx Rtmp Learing 之HTTP HOOK回调

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回调)