Nginx RTMP配置server_name报错 如何绑定域名限制访问
报错原因
server_name是Nginx HTTP核心模块的专属指令,只允许在http{}块下的server上下文使用。RTMP服务能力是第三方nginx-rtmp-module扩展的独立配置块,RTMP上下文本身不识别、不支持这个指令,所以配置检测时直接抛出指令不合法的错误。- 从协议层面看,RTMP握手建连阶段不会携带HTTP协议中的Host请求头,本身没有原生的域名路由匹配逻辑,无法直接照搬HTTP虚拟主机的配置方式绑定域名。
RTMP服务限制指定域名访问的实现方式
RTMP客户端发起连接时,会在connect命令里携带tcUrl字段,这个字段存储的是客户端填写的完整连接地址,包含访问使用的域名,通过匹配这个字段就能实现域名访问限制,两种常用方案如下:
轻量本地校验(无额外服务依赖)
直接在application块中匹配内置$tc_url变量,非指定域名发起的连接直接拒绝,配置参考:
rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; hls on; hls_path /var/www/html/stream/hls; hls_fragment 3; hls_playlist_length 60; # 校验tcUrl中的域名是否为目标域名 if ($tc_url !~* "^rtmp://example.com/") { deny all; } } } }
注意:过老版本的nginx-rtmp-module可能不支持
$tc_url变量,升级到最新稳定版模块即可正常使用。修改完成后执行nginx -t校验通过,重载配置即可生效。
回调鉴权(适合复杂权限场景)
如果需要支持多域名、多维度的访问控制规则,可以配置on_connect回调,将连接信息发送到本地鉴权服务做判断:
rtmp { server { listen 1935; chunk_size 4096; # 新连接建立前先触发本地鉴权接口 on_connect http://127.0.0.1/rtmp/auth_check; application live { live on; record off; hls on; hls_path /var/www/html/stream/hls; hls_fragment 3; hls_playlist_length 60; } } }
鉴权接口收到请求后,解析请求参数中的tcUrl字段提取访问域名,和允许访问的域名列表做比对,返回2xx状态码即放行连接,返回4xx/5xx状态码即直接拒绝连接。
补充:配置中开启的HLS输出走HTTP协议传输,这部分的域名访问限制直接在HTTP块对应的server中配置
server_name example.com;即可,遵循HTTP模块标准的虚拟主机配置规则。
内容的提问来源于stack exchange,提问作者anamul
相关产品推荐
相关产品推荐

