使用 Nginx 的分布式和缓存 MP4 伪流(搜索)

Posted

技术标签:

【中文标题】使用 Nginx 的分布式和缓存 MP4 伪流(搜索)【英文标题】:Distributed & Cached MP4 PseudoStreaming (seeking) with Nginx 【发布时间】:2012-04-18 23:30:11 【问题描述】:

我尝试使用 nginx(源 + 边缘)设置至少 2 台服务器。都使用mp4-module 编译。来源包含我所有的 mp4 文件。 Edge 配置了所有按预期工作的缓存内容(见下文),每个 mp4 文件请求第二次由边缘缓存提供服务,没有原始流量。

但我希望能够在文件中查找。该功能来自 mp4 模块。只需附加查询参数 "?start=120" 告诉 nginx 从时间戳 120sec 开始提供 mp4 内容。这适用于直接请求的来源。但是一旦我在 nginx 的缓存位置启用 mp4-module,请求将是 404。

nginx.conf@origin:

server 
  listen       80;
  server_name  localhost;
  root         /usr/share/nginx/www;
  location ~ \.mp4$ 
    mp4;
    expires max;
  

nginx.conf@edge:

proxy_cache_path /usr/share/nginx/cache levels=2:2 keys_zone=icdn_cache:10m inactive=7d max_size=2g;
proxy_temp_path /usr/share/nginx/temp;
proxy_ignore_headers X-Accel-Expires Cache-Control Set-Cookie;
log_format cache '[$time_local] Cache: $upstream_cache_status $upstream_addr $upstream_response_time $status $bytes_sent $proxy_add_x_forwarded_for $request_uri';
access_log /usr/local/nginx/logs/cache.log cache;

upstream origin 
  server <origin-domain>;

server 
  listen       80;
  server_name  localhost;

  location ~ \.mp4$ 
    mp4;
    proxy_cache icdn_cache;
    proxy_pass http://origin;
    proxy_cache_key $uri;
  

我也试过了:

location / 
  location ~ \.mp4$  mp4; 
  proxy_cache icdn_cache;
  proxy_pass http://origin;
  proxy_cache_key $uri;

有没有办法让缓存的 mp4 文件与 mp4-module 的搜索功能一起工作?

【问题讨论】:

【参考方案1】:

proxy_cache 是代理模块的一部分。目前您不能将 nginx mp4 模块与代理一起使用,它仅适用于静态文件,仅此而已。

【讨论】:

【参考方案2】:

您必须使用proxy_storeproxy_cache 将为每个 ?start=xxxx 请求创建大量文件。

要让 mp4 模块在文件中查找,您需要完整的电影。 proxy_store 会在缓存服务器上做一个镜像。

【讨论】:

这不是真的,因为用户正在使用'proxy_cache_key $uri;' proxy_cache 将使用 $uri(而不是 $request_uri)作为键,$uri 不包括查询参数。这实际上可能会导致问题,如果第一个请求有 ?start=120 并且 nginx 缓存了前 120 秒丢失的文件,但这是一个不同的问题

以上是关于使用 Nginx 的分布式和缓存 MP4 伪流(搜索)的主要内容,如果未能解决你的问题,请参考以下文章

网易视频云:用Nginx搭建flv,mp4,hls流媒体服务器

nginx 配置vue项目缓存

如何在 Nginx 上使用高效的缓存策略服务静态资产?

nginx 文件图片缓存设置

nginx缓存(proxy_cache模块)

Memcache缓存服务器(Nginx+php+Memcache+MySQL)