使用单个服务器模拟许多小型物联网服务器:使用NGINX‘map’?

使用单个服务器模拟许多小型物联网服务器:使用NGINX‘map’?

我有一堆小型服务器,每个服务器都提供一些实时 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/;
        ...
    }
}

相关内容