如何配置 nginx 以正确向 Safari 提供 mp4 视频?
Posted
技术标签:
【中文标题】如何配置 nginx 以正确向 Safari 提供 mp4 视频?【英文标题】:How to configure nginx to properly serve mp4 videos to Safari? 【发布时间】:2019-02-18 12:47:06 【问题描述】:我正在尝试使用视频标签在 safari 中显示视频。
这是我的 html 的 sn-p:
<video autoplay="" muted="" loop="" preload="auto" poster="http://my.ip.add.ress/static/my_video_image.jpg">
<source src="http://my.ip.add.ress/static/my_video.mp4" type="video/mp4" />
<source src="http://my.ip.add.ress/static/my_video.webm" type="video/webm" />
</video>
静态文件(css、js、图像)正在正确提供。
我遇到的问题是当 safari 请求视频时,nginx 应该返回 206 partial content
响应。但是,它会返回带有整个视频的200 OK
(我认为会返回整个文件)。但 safari 并没有请求整个视频,它使用 range
标头请求了一段视频。
因此这会导致视频无法在 Safari 中播放。就目前而言,我当前的设置适用于 Chrome 和 Firefox。
我正在使用 nginx 来提供视频内容。我想避免使用 3rd 方服务器,因为这是一个小项目:)。
我的问题是如何正确设置 nginx 以向 safari 提供视频?我知道 nginx 忽略了请求中的 range
标头。有没有办法告诉nginx注意那个头?
这是我在/etc/nginx/sites-available/myproject
中的 nginx 配置:
server
listen 80;
server_name my.ip.add.ress;
location = /favicon.ico access_log off; log_not_found off;
location /static/
alias /home/website/my_python_virtual_env/my_project/static_folder_containing_mp4_videos/;
location /
# gunicorn to django
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
这是请求:
Request
Range: bytes=0-1
Accept: */*
Connection: Keep-Alive
Accept-Encoding: identity
DNT: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15
Referer: http://my.ip.add.ress/
X-Playback-Session-Id: 97A1EC54-85A3-42A1-8EA2-8657D03058B6
回复如下:
Response
Content-Type: video/mp4
Date: Thu, 13 Sep 2018 17:48:40 GMT
Last-Modified: Wed, 12 Sep 2018 22:20:39 GMT
Server: nginx/1.14.0 (Ubuntu)
Content-Length: 10732143
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
在有视频功能的网站上,请求/响应如下所示:
Request
GET /big_buck_bunny.mp4 HTTP/1.1
Range: bytes=0-1
Host: clips.vorwaerts-gmbh.de
Accept: */*
Connection: keep-alive
Accept-Encoding: identity
Accept-Language: en-us
DNT: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15
X-Playback-Session-Id: C2EAAF63-1230-44A9-9A16-6332C1EDEBF0
Response
HTTP/1.1 206 Partial Content
ETag: "5416d8-47f21fa7d3300"
Content-Type: video/mp4
Date: Thu, 13 Sep 2018 17:28:47 GMT
Last-Modified: Tue, 09 Feb 2010 02:50:20 GMT
Server: cloudflare
Content-Length: 2
Expires: Fri, 13 Sep 2019 17:28:47 GMT
Connection: keep-alive
Content-Range: bytes 0-1/5510872
Set-Cookie: __cfduid=d2776dbf7a6baaa1b2f2572d600deda141536859727; expires=Fri, 13-Sep-19 17:28:47 GMT; path=/; domain=.vorwaerts-gmbh.de; HttpOnly
Vary: Accept-Encoding
Cache-Control: public, max-age=31536000
CF-RAY: 459c5511b243a064-SLC
CF-Cache-Status: HIT
【问题讨论】:
你看过nginx.com/blog/smart-efficient-byte-range-caching-nginx吗? 【参考方案1】:我觉得发这个很傻,但这是我的问题。
我的 nginx 实例未设置为提供媒体服务。来自/media/
的任何东西都由 django 提供。 Django 不能正确地为 safari 提供 mp4 视频,因为它不适用于 Range
请求。不过,它会为它们提供足够的服务,让 chrome 正常工作! ;)
修复很简单。将/media/
的位置条目添加到我的网站的 nginx.conf 文件中。
server
listen 80;
server_name my.ip.add.ress;
location = /favicon.ico access_log off; log_not_found off;
# still have to have this location entry to serve the static files...
location /static/
alias /home/website/my_python_virtual_env/my_project/static_folder_containing_static_files/;
# Added this location entry to nginx, my videos were NOT in the static folders, they were in the media folders. I feel dumb but hopefully this will help someone else out there!
location /media/
alias /home/website/my_python_virtual_env/my_project/media_folder_containing_mp4_videos/;
location /
# gunicorn to django
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
【讨论】:
我有非常相似的问题:视频不在静态目录中,nginx 根本无法在 chrome+safari 中播放视频。我可以问问题吗? /media/ 目录没有使用以上是关于如何配置 nginx 以正确向 Safari 提供 mp4 视频?的主要内容,如果未能解决你的问题,请参考以下文章
Apache 和 nginx 的终极配置,以正确的方式为所有虚拟主机提供服务
如果在应用引擎上提供的URL中找到灵活的配置,我如何配置我的nginx-app.conf文件来提供/index.php?
Docker + Django + Vue.js + Webpack 如何正确配置 nginx?