您可以在搜索 nginx 位置之前从后端服务器检索并存储文件吗?

Can you retrieve and store a file from a backend server before searching for the nginx location?

问题

我使用 Nginx Plus 中的 HLS 模块来流式传输 .mp4 文件,使用以下配置:

    location /hls {
        hls;
        hls_fragment 10s;
        hls_buffers 10 10m;
        hls_mp4_buffer_size 1m;
        hls_mp4_max_buffer_size 10m;
        alias /var/www/vod/cache;
    }

/var/www/vod/cache 中存在 .mp4 文件时一切正常。当客户端请求 http://example.com/hls/file.mp4.m3u8 时,HLS 模块会即时生成 m3u8 播放列表并 returns 它。

不过,我不希望将所有的mp4文件都存储在流媒体服务器上,而是将文件存储在后端存储服务器上。理想情况下,只有在客户端请求特定视频(稍后通过 cron 作业删除)时,mp4 文件才会从存储服务器检索并存储在本地。使用 proxy_store 我能够检索 mp4 文件并使用如下配置将它们存储在本地:

    location @fetch_content {
        internal;
        rewrite ^/hls(.*).mp4.m3u8$ .mp4 break;
        proxy_pass         http://example-storage.com;
        proxy_store        on;
        proxy_store_access user:rw group:rw all:r;
        proxy_temp_path    /tmp;
        root /var/www/vod/cache;
    }

使用proxy_pass的问题是nginx returns mp4文件直接到客户端,而不是m3u8播放列表。

有没有办法让nginx检索并存储mp4文件,然后使用HLS模块生成m3u8播放列表文件?或者换一种说法,我可以检查 mp4 文件是否存在,如果找不到则检索并存储它,然后点击 /hls 位置,这将使用 HLS 模块流式传输文件?

由于这是Nginx Plus,我无法编写模块。我只能使用包含的模块,请参阅此处 https://www.nginx.com/products/technical-specs/

Nginx Plus 包括第 3 方 Lua module 并且在定向到 /hls 位置之前,我能够使用 Lua 从后端服务器检索 mp4 文件。