我想从特定网站缓存视频点播。当您打开视频页面时,它首先加载播放器,当您单击播放时,它会加载播放列表文件,其中包含指向不同比特率的组块列表(媒体播放列表)的链接,这些组块列表包含指向视频文件(媒体段)的链接。
对于这些文件中的任何一个,我永远不会得到HIT
- 始终是MISS
。由于有Cache-Control: no-cache
标头字段,我尝试了reply_header_access Cache-Control deny all
和reply_header_replace Cache-Control max-age=3600
,但这没有用。然后我认为请求标头中的cookie可能与它有关 - 但不是:How does Squid deal with Cookies?
我注意到播放列表的Content-Length
字段从201到205不等 - 这可能与它有关吗?但内部的内容总是几乎相同 - 唯一可以改变大小的是内部有 chunklists 的链接,其间有一个随机数(chunklist_w[random-number]_b800000.m3u8
),长度随机数通常是9或10位数。为什么我想从缓存中提供播放列表文件,因此浏览器总是会请求相同的URL,并且该URL将被缓存,因此无需重写URL。
所以从理论上讲,播放列表文件应该只从源(首次请求到代理)请求一次,然后始终从squid缓存以及块列表和媒体文件请求,因为URL保持不变 - 因此没有动态内容。
为什么squid不从缓存中提供此内容? (另一方面,"静态"内容[images,js,css]从缓存提供)
更新#1:我还尝试将maximum_object_size
从4 MB扩展到20 MB,即使所有文件都在2 MB左右。仍然没有。
其他信息:
随机数= 1887187059(10位数)
请求标题:
GET [omitted] HTTP/1.1
Host: [omitted]
Proxy-Connection: keep-alive
X-Requested-With: ShockwaveFlash/21.0.0.197
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Accept: */*
Referer: [omitted]
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,sl;q=0.4
Cookie: PHPSESSID=jfg6j07l9i6bep37jsacig84e1; nocache=0
响应标题:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Server: WowzaStreamingEngine/4.3.0
Cache-Control: max-age=86400
Date: Sat, 09 Apr 2016 14:45:53 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 205
X-Cache: MISS from squid3
X-Cache-Lookup: MISS from squid3:3128
Via: 1.1 squid3 (squid/3.3.8)
Connection: keep-alive
随机数= 204546888(9位数)
请求标题:
GET [omitted] HTTP/1.1
Host: [omitted]
Connection: keep-alive
X-Requested-With: ShockwaveFlash/21.0.0.197
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Accept: */*
Referer: [omitted]
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,sl;q=0.4
Cookie: PHPSESSID=jfg6j07l9i6bep37jsacig84e1; nocache=0
响应标题:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Server: WowzaStreamingEngine/4.3.0
Cache-Control: no-cache
Date: Sat, 09 Apr 2016 14:59:56 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 203
答案 0 :(得分:0)
构成内容缓存的行是:
refresh_pattern \.(ts|m3u8)$ 120 50% 180 override-expire override-lastmod ignore-no-cache
此行告诉缓存管理器,扩展名为.ts
或.m3u8
的文件应该被视为最多3个小时,并且应该覆盖三个HTTP标头字段:Expire,Last-Modified和Cache-控制:无缓存
要详细了解refresh_pattern
,请查看Squid Documentation。
为什么之前没有缓存此内容的选项override-expire
,override-lastmod
,ignore-no-cache
丢失了,因为在缓存方面时间并不重要 - 在我们想要提供服务时这很重要给用户的内容。