微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nginx 无法加载静态 .mp4

如何解决nginx 无法加载静态 .mp4

设置

  • 我的目标是一个简约的配置,主要基于认设置
  • 目标是提供 10-15 秒、1 到 3 秒长的视频,主要是 2-3 Mb 的视频
  • 我有一个使用官方 Nginx docker 映像运行的 raspBerry

我的假设

  • Nginx一个非常强大的工具,提供了各种优化功能,但如果我只想提供上述视频,它会“开箱即用”

问题

  • 视频根本无法播放
  • 直接访问视频时,我遇到两种情况
    • a) HTTP 200 后跟一个或多个 HTTP 206 Partials,并且视频无法播放,或者

      Partial

    • b) HTTP 200 后跟 Canceled 请求,视频显然也不在这里播放

      Canceled

此外

  • 已测试多个视频(认移动输出、VLC 转换、HandBreak 网络优化)

Nginx(官方镜像提供的认配置)

html {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  include /etc/Nginx/mime.types;
  default_type application/octet-stream;
  gzip on;

  #SSL Settings
  #Logging Settings
}

在 mime.types 中,我确实有视频/mp4。

静态服务文件

视频位于一个文件夹中,该文件夹挂载为 /usr/share/x

server {
  ...

  location / {
    # Default Nginx files
  }

  location ~ \.mp4$ {
    # When I try to use this block,all video request end up being 404s
  }

  location /x/ {
    root /usr/share/;
  }
} 

鉴于这是一个微型应用程序,显然还有其他文件正在提供,并且它们工作正常。位置和路线没有问题,只有视频。

初始请求

GET #### HTTP/1.1
Host: ####
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
sec-ch-ua: ####
sec-ch-ua-mobile: ?0
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: ####
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site: none
sec-fetch-mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip,deflate,br
Accept-Language: en-US,en;q=0.9,hu;q=0.8,sk;q=0.7
sec-gpc: 1

初始响应

HTTP/1.1 200 OK
Server: Nginx/1.14.2
Date: Thu,14 Jan 2021 19:50:01 GMT
Content-Type: video/mp4
Content-Length: 1620690
Last-Modified: Thu,14 Jan 2021 19:05:25 GMT
Connection: keep-alive
ETag: "600095f5-18bad2"
Accept-Ranges: bytes
Content-Security-Policy: upgrade-insecure-requests

第二次请求(导致 HTTP 206)

GET #### HTTP/1.1
Host: ####
Connection: keep-alive
sec-ch-ua: ####
DNT: 1
Accept-Encoding: identity;q=1,*;q=0
sec-ch-ua-mobile: ?0
User-Agent: ####
Accept: */*
sec-fetch-site: same-origin
sec-fetch-mode: no-cors
Sec-Fetch-Dest: video
Referer: ####
Accept-Language: en-US,sk;q=0.7
sec-gpc: 1
Range: bytes=0-

(有时被取消的)部分内容

HTTP/1.1 206 Partial Content
Server: Nginx/1.14.2
Date: Thu,14 Jan 2021 20:03:20 GMT
Content-Type: video/mp4
Last-Modified: Thu,14 Jan 2021 19:05:25 GMT
Connection: keep-alive
ETag: "600095f5-18bad2"
Content-Range: bytes 0-1620689/1620690
Content-Length: 1620690
Content-Security-Policy: upgrade-insecure-requests

最后的想法和问题

我是一名高级前端开发人员。远非高级后端或 DevOps 知识,但我认为我自己做得很好。但是,在过去 2-3 天的大部分时间里,我都在尝试从我的 RaspBerry 中提供小视频。不成功。

  1. 这真的是 Nginx 配置问题吗?
  2. 如果是这样,我错过了什么?我该如何完成这项工作?
  3. 如果这不是 Nginx,还能是什么?

更新 (1):cURL

我选择测试的文件是 1620720 字节。我尝试将其卷曲以查看是否能返回相同的工作视频。

curl https://domain.tld/x/nope.mp4 --output ~/retrieved.mp4

这个新视频有 1620690 字节。比原来的 (gzip?) 少 30,而且它似乎已损坏。我无法在我的机器上播放视频。

在 Firefox 中检查视频,他们似乎做对了:

Corrupted

解决方法

所以。显然,当您跳过某些配置步骤时,更类似于黑客马拉松的方法并不是真正有益的。当你想快速而肮脏地做事情时,因为时间是至关重要的,你仍然应该将 .mp4s 设置为在 git 中被视为二进制文件。 (使用 LFS 更好)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。