单机十万并发HLS直播服务器的防盗链技术

本文详细介绍了一种基于HLS协议的直播服务器防盗链技术,包括切片服务器配置、HTTP服务器选择、Lua脚本实现等内容,并提供了具体的技术参数和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单机十万并发HLS直播服务器的防盗链技术

本文主要介绍基于HLS直播服务器的十万并发防盗链实现

  • 录制切片服务器
  • HTTP 服务器 (nginx)
  • LuaLib

录制切片服务器

录制切片服务器负责把直播流 切片成HLS 直播协议所需要的TS 切片文件,
切片文件命名规则可以为: live-Segment[%d%d%d%d].ts
比如:live-Segement0011.ts , live-Segement0003.ts 等.也可以自由发挥, 比如:live-2018-08-21_14:00:00.ts等.

TS 切片策略:

-文件开头必须是PAT表,紧接这是PMT表

-文件内部,紧接这PSI 表后, 应该是视频关键帧

-切片内部PCR 总间隔 推荐10秒

-文件末尾 最好是一个完整的视频帧内容,

m3u8文件内容:

#EXTM3U
#EXT-X-VERSION:2
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:128483 每生成一个新的TS切片,该值加一
#EXT-X-TARGETDURATION:10
#EXTINF:10.1501,
http://videoa.southtv.cn/cctv1/live-2018-08-20_14-59-36.ts?sign=286200040a04918772efb52cbad6f21d&t=5b7a67ec
#EXTINF:11.0109,
http://videoa.southtv.cn/cctv1/live-2018-08-20_14-59-48.ts?sign=7825c09c52f7f8d1617a173b28f5ea37&t=5b7a67ec
#EXTINF:10.0912,
http://videoa.southtv.cn/cctv1/live-2018-08-20_15-00-00.ts?sign=984225f050a9bcf6d67bee3b08674f23&t=5b7a67ec

Openresty Nginx 安装

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。—— [ openresty ]

tar -xzvf openresty-VERSION.tar.gz
cd openresty-VERSION/
./configure
make
sudo make install

系统配置

首先要配置打开文件数量限制,
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 11000
* hard noproc 11000
* soft nofile 4100
* hard nofile 4100
说明:* 代表针对所有用户
noproc 是代表最大进程数
nofile 是代表最大文件打开数

更改/etc/sysctl.conf

net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 0

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

# 不充当路由器 
net.ipv4.ip_forward = 0 
net.ipv4.conf.all.send_redirects = 0 
net.ipv4.conf.default.send_redirects = 0 

# 反向路径过滤 
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
#net.ipv4.neigh.default.gc_stale_time = 120
#net.ipv4.conf.default.arp_announce = 2
#net.ipv4.conf.all.arp_announce = 2
#net.ipv4.conf.lo.arp_announce = 2

###内存资源使用相关设定
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 8388608 8388608 8388608

##应对DDOS攻击,TCP连接建立设置
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1 
net.ipv4.tcp_syn_retries = 1 
net.ipv4.tcp_max_syn_backlog = 262144

##应对timewait过高,TCP连接断开设置
net.ipv4.tcp_max_tw_buckets = 524288 
net.ipv4.tcp_tw_recycle = 1 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_timestamps = 0 
net.ipv4.tcp_fin_timeout = 5
net.ipv4.ip_local_port_range = 10000 65000

###TCP keepalived 连接保鲜设置
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5

###其他TCP相关调节
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144  
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1

#net.nf_conntrack_max=655360

net.ipv4.neigh.default.gc_thresh1 = 102400      
net.ipv4.neigh.default.gc_thresh2 = 204800      
net.ipv4.neigh.default.gc_thresh3 = 409600

#TCP拥堵算法 (最新算法bbr)
#net.ipv4.tcp_congestion_control = cubic 
#net.ipv4.tcp_available_congestion_control = cubic reno 
#net.ipv4.tcp_allowed_congestion_control = cubic reno 

net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.p6p1.rp_filter=0
net.ipv4.conf.p6p2.rp_filter=0
net.ipv4.conf.bond0.rp_filter=0

sysctl -p生效

nginx 配置

  1 worker_processes  55;  根据系统内核数量配置
  2 worker_rlimit_nofile 10240;
  3 
  4 events {
  5     worker_connections  10240;
  6     multi_accept on;
  7     use epoll;
  8 }
  9 

到此为止,前期工作已经作为, 开始利用lua 模块 处理防盗链

nginx 的location配置里增加

299      location ~ live\.m3u8$ {
300             access_by_lua_file /southtv/lualib/access_token.lua;
301             root   /data;  #TS 切片文件目录
302         }

acess.lua 就是我们的防盗链实现
1 URL 需要具备时间有效性,直播URL 2小时有效, 防止被拷贝
2 URL 需要对自身签名,防止URL 被篡改,
3 URL 需要具备IP地址 校验特效, 用户A的播放URL,不可以拷贝出来给用户B 使用
3 URL 不可以逆向解密

if ngx.var.arg_sign ~= nil and ngx.var.arg_ip ~= nil and ngx.var.arg_t ~= nil then

    local diff = os.time() - tonumber(ngx.var.arg_t)
    if (diff > 7200) then
        ngx.exit(ngx.HTTP_FORBIDDEN)
    end

    if ngx.var.remote_addr ~= ngx.var.arg_ip then
        ngx.exit(ngx.HTTP_FORBIDDEN)
    end
    local sign, _ = string.find(ngx.var.request_uri, "sign")
    local sub = string.sub(ngx.var.request_uri, 1, sign - 1)
    local my = sub.."key=mykey"
    --ngx.say(my)
    --ngx.say(ngx.md5(my))
    if ngx.md5(my) ~= ngx.var.arg_sign then
        ngx.exit(ngx.HTTP_FORBIDDEN)
    else
        return
    end
end

ngx.exit(ngx.HTTP_FORBIDDEN)

以上所有技术点,已经在南方无线APP里 验证使用,
单机并发大概9万左右, 欢迎下载试用,
[ 南方无线APP ]

关于我们
http://www.southtv.cn

一款免费的流媒体直播软件,主要用于流媒体直播,视频直播,视频点播,视频录制等应用,与FMS、WOWZA、RED5一道,作为用户流媒体直播应用的可选方案。 1、支持Windows/Linux等多种操作系统; 2、采用开发的流媒体协议,而非私有协议,可以与主流系统对接,至少支持RTMP推流,RTMP拉流,RTSP拉流三种方式获取直播流,支持对获取的直播流再按照TS组播或者单播,RTMP,RTSP,HLS,TS OVER HTTP,FLV OVER HTTP等标准流媒体协议的方式进行对外直播转发; 3、支持录制,可定时录制或手动录制,能录制MP4或者FLV格式文件,录制时支持生成新文件或者追加文件两种方式,支持录制超过4G的文件; 4、单台服务器可支持1000个以上并发用户,直播延时小于2秒; 5、支持RTMP转发功能,能够把AMS上的直播流转发给其它AMS服务器或者第三方的RTMP服务器,例如RED5,FMS,WOWZA流媒体服务器; 6、 支持PC/手机/平板电脑等多终端访问,无论是windows,linux,或者andriod以及IOS系统访问收看直播时都无需下载插件,直接观看; 7、响应点播时间控制在100ms以内,支持暂停、拖动等特技操作; 8、支持文件直播,可把硬盘上存在的FLV文件编目后,按设定好的任务和顺序进行直播; 9、内置Web应用系统,无需复杂配置,可直接部署到用户服务器使用,也可以选配更复杂的媒资管理系统,完成类似优酷土豆的应用模式; 10、开放的系统架构,提供二次开发接口,可轻松的融入到用户已有的平台或网站平台中、或在此基础上进行二次开放等 ------------------------------------------------------------------------- 使用说明: 1、关于安装运行:软件解压到硬盘上后,执行AokuMServiceManager,即可完成AMS服务的安装,安装完成后,在Windows系统服务中会出现一个AokuMService服务; 2、关于端口:AMS默认的管理端口是9001,可通过浏览器登陆http://127.0.0.1:9001/main.html进行管理;AMS默认的RTMP端口是1935,默认的rtsp端口是5554,默认的flv over http端口是7000,默认的ts over http端口是8008,默认的hls端口也是9001; 3、关于推流:使用直播你需要有一个支持rtmp推流的编码器,建议用奥酷全接口高清编码器,当然你也可以通过FME进行软编码来实现; 4、关于接收直播:AMS正常启动并发布上直播流后,你可以在网络内的任一电脑上打开http://ip:9001,通过浏览器观看直播,若开启了hls功能,通过iphone或者ipad登陆http://ip:9001即可观看直播。 5、若开启了TS组播,请确认防火墙是否允许组播,另外您网络内的路由器是否支持组播,接收组播是需要用VLC播放器来完成; 6、接收flv over http也是通过VLC播放器或者支持类似协议的播放器来测试。 7、若使用中出现问题,你可以查看logs目录下的rtmpserver.log文件,里面有详细的错误日志描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值