我有一堆小型服务器,每个服务器都提供一些实时 DASH/HLS 流(类似于带有 USB 调谐器适配器的 RasPi)。这些服务器的 URL 类似于https://streamingX.<my_domain>/serviceY/<files>
。我正在制作一个缓存反向代理,但我缺乏足够的硬件来进行真正的测试。所以我想用一个 NGINX 实例模拟一堆小型系统。
我已经循环播放视频,将视频提供给一堆 DASH/HLS 打包器,这些打包器输出到如下文件层次结构中:www/streamingX/serviceY/<files>
,并且能够很好地为该树提供服务,以模拟 50 个小型视频服务器。
但是我如何将微型服务器的 URL 转换为此文件层次结构?也就是说,转换https://streamingX.<my_domain>/serviceY/<files>
为https://<my_domain>/streamingX/serviceY/<files>
?
我最初的猜测是 NGINXmap
指令就是我所需要的,但以下指令不起作用:
map $host$uri $uri {
default $uri;
~(streaming[0-9])\.(*)/(*) $1/$3;
}
我遗漏了什么线索?
答案1
至少可以通过两种方式实现:
1)带有map
指令:
map $host $prefix {
"~^(streaming\d{1,2})\." /$1;
}
server {
...
# before "location" declarations, if any
rewrite .* $prefix$uri last;
...
}
2)带server_name
指令:
server {
server_name example.com www.example.com "~^(?<streaming>streaming\d{1,2})\.example\.com$";
...
# before "location" declarations, if any
if ($streaming) {
rewrite .* /$streaming$uri last;
}
...
}
更新
找到了更优雅的方法来做到这一点,而无需rewrite
指令:
server {
server_name example.com www.example.com "~^(?<prefix>streaming\d{1,2})\.example\.com$";
root <your_root>;
...
location / {
alias <your_root>/$prefix/;
...
}
}