Nginx Rtmp Learing 之HTTP HOOK回调
1. 名词解释
- LMSS Live Media Streaming Service 直播流媒体服务
- LMDS Live Media dispatch Service 直播媒体调度服务
2. 概述
- 在nginx的rtmp协议实现中,一个简单的推拉流会被拆分成多个事件(CONNECT,PUBLISH,UPDATE,PUBLISH_DONE,PLAY)等等。
- LMSS 模块会将RTMP推拉流请求中的每种事件定制为一种HOOK请求发往后端的调度模块(LMDS)。
- LMDS模块当接收到HOOK请求后会完成类似用户合法性验证、用户配置信息获取、级联信息查询等等逻辑。
- 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
-
描述:
- 设置 HTTP 连接回调。当客户分发连接命令一个连接命令时,一个 HTTP 请求异步发送,命令处理将被暂停,直到它返回结果代码。当 HTTP 2XX 码(成功状态码)返回时,RTMP 会话继续。返回码 3XX (重定向状态码)会使 RTMP 重定向到另一个从 HTTP 返回头里获取到的 application。否则(其他状态码)连接丢弃。
- 注意这一指令在 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, server,application
- 描述:
同上面提到的 on_play 一样,唯一的不同点在于这个指令在发布命令设置回调。不同于远程 pull,push 在这里是可以的。
除了上述参数以外,所有显式传递给连接命令args的参数也由回调发送。
3.3 on_update
- 语法:
on_update url
- 上下文:
rtmp, server,application
- 描述:
设置 update 回调。这个回调会在 notify_update_timeout 期间调用。如果一个请求返回结果不是 2XX,连接禁止。这可以用来同步过期的会话。追加 time 参数即播放/发布调用后的秒数会被发送给处理程序。
3.4 on_publish_done
- 语法:
on_publish_done url
- 上下文:
rtmp, server,application
- 描述:
等同于 on_done 的表现,但只适用于发布结束事件。
3.5 on_play
- 语法:
on_play url
- 上下文:
rtmp, server,application
- 描述:
- 设置 HTTP 播放回调。每次一个客户分发播放命令时,一个 HTTP 请求异步发送,命令处理会挂起 - 直到它返回结果码。之后再解析 HTTP 结果码。
- HTTP 2XX 返回码的话继续 RTMP 会话。
- HTTP 3XX 返回码的话 重定向 RTMP 到另一个流,这个流的名字在 HTTP 返回头的 Location 获取。如果新流的名字起始于 rtmp:// 然后远程 relay 会被创建。relay 要求 IP 地址是指定的而不是域名,并且只工作在 1.3.10 版本以上的 nginx。另请参考 notify_relay_redirect。
- 其他返回码的话 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
网友评论