如何在 nginx 上强制缓存视频文件

如何在 nginx 上强制缓存视频文件

我有两台配置几乎完全相同的服务器。一台是我的生产服务器,另一台是我的临时服务器。两台服务器上的 nginx 配置都是彼此的副本,除了服务器名称(以及我使用服务器名称的其他任何地方)

这是我的暂存服务器的配置。

server {
  listen 80;
  server_name *.johnvarghese.info johnvarghese.info;
  return 301 https://$host$request_uri;
}

server {
  listen 443;
  ssl on;
  ssl_certificate /etc/johnvarghese.info.ssl/star.johnvarghese.info.bundle.crt;
  ssl_certificate_key /etc/johnvarghese.info.ssl/star.johnvarghese.info.key;

  server_name support.johnvarghese.info;
  return 301 "$scheme://johnvarghese.info/support${request_uri}";
}

server {
  listen 443;
  ssl on;
  ssl_certificate /etc/johnvarghese.info.ssl/star.johnvarghese.info.bundle.crt;
  ssl_certificate_key /etc/johnvarghese.info.ssl/star.johnvarghese.info.key;

  server_name *.johnvarghese.info johnvarghese.info;

  passenger_ruby /usr/local/rvm/gems/ruby-2.1.0/wrappers/ruby;
  passenger_enabled on;
  root /var/www/johnvarghese.info/current/public;

  location ~* \.(mp4|ogg|webm)$ {
    expires 10d;
    add_header Cache-Control "max-age=864000";
  }

}

临时服务器名为 johnvarghese.info。在生产服务器上,我将所有 johnvarghese.info 实例替换为 servername.com。

我感兴趣的是配置中的最后三行 - 我只想缓存 webm 视频文件(我循环播放)。它在临时服务器上运行良好。下载视频后,我可以关闭笔记本电脑上的无线网络,视频将一直循环播放,无需进一步下载。从第二次开始,控制台中的响应代码每次都是 206。服务器不再受到影响。

在生产服务器上,每次视频循环播放时,服务器都会受到攻击。响应代码为 304(未修改)。如果我关闭笔记本电脑上的无线网络,当视频完成当前播放时,它会停止,因为它无法再次下载以进行重复播放。

为什么同样的配置

  location ~* \.(mp4|ogg|webm)$ {
    expires 10d;
    add_header Cache-Control "max-age=864000";
  }

在这些配置类似的服务器上,生产服务器的工作方式有何不同?我想让生产服务器像暂存服务器一样工作。我应该怎么做?

谢谢

答案1

您应该查看客户端浏览器收到的标头,因为缓存是在客户端浏览器而不是服务器上完成的。Nginx 可以添加自己的标头,这可能会与您的标头冲突,具体取决于您的服务器设置和添加的 Nginx 模块。

为了进一步分析,请在两种情况下添加客户端浏览器收到的标头转储,即在两种情况下,即在两种情况下,都有效。这种比较可能会给我们提供谜团的答案。

有关原因的更多想法请参阅此帖子: Nginx add_header 和缓存控制。建议使用
模块more_set_headersmore_clear_headers来替换或清除标题。

相关内容