如何通过Nginx指令限制RTMP服务器HLS流的出站传输速率
Nginx-RTMP 服务器出站速率限制方案
可以通过Nginx内置配置实现速率限制,具体方案如下:
1. 单客户端连接限速(原生支持)
直接使用Nginx标准模块ngx_http_core_module自带的limit_rate指令即可实现,无需额外安装第三方模块:
- 速率换算规则:1Mbps对应128KB/s,限制单连接2Mbps对应配置值为
256k,限制1Mbps对应128k - 配置位置放在http块的
location /段中即可 - 可选优化:搭配
limit_rate_after指令,设置前N字节数据不限速,可加快首帧加载速度,减少用户等待时间
2. 全局总出站带宽限制
Nginx内置没有直接的全局总带宽限制参数,可通过两种方式实现:
- 间接实现:用
limit_conn+limit_rate组合,比如总带宽要控制在2Mbps、单连接限速256k的场景下,设置全局最多允许8个并发连接即可,总带宽上限为8*256k=2Mbps - 精准实现:配合Linux系统自带的tc(流量控制)命令做出口限速,控制效果更稳定
注意事项
- 你当前的源HLS流码率为3-4Mbps,如果直接限速到1-2Mbps,会导致客户端拉流速度跟不上播放速度,出现频繁卡顿。建议先新增转码环节,将HLS流的实际编码码率压缩到1-2Mbps范围内,再搭配限速规则使用,播放体验会更好
- 你现有配置中的
hls_variant参数是HLS多码率适配的声明参数,仅用于告知播放端当前流的码率档位,不会实际限制流的码率,也不会限制服务器出站带宽
修改后配置示例
rtmp { server { listen 1935; chunk_size 4096; application live { notify_method get; live on; hls on; hls_path /nginx/hls/; hls_fragment 3; hls_playlist_length 60; drop_idle_publisher 10s; meta copy; hls_variant _low BANDWIDTH=166000; hls_variant _mid BANDWIDTH=244000; } } } http { sendfile off; tcp_nopush on; directio 512; default_type application/octet-stream; # 可选:全局连接限制配置,用于间接控制总带宽 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=total:10m; server { listen 8080; location / { # 可选:单IP并发连接限制,最多2个连接 limit_conn perip 2; # 可选:全局并发连接限制,最多8个连接 limit_conn total 8; # 单连接限速2Mbps limit_rate 256k; # 可选:前100k数据不限速,加快首屏加载 limit_rate_after 100k; add_header 'Cache-Control' 'no-cache'; add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Expose-Headers' 'Content-Length'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /nginx/hls/; } } }
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

