解决 Nginx 在分发大文件时 Block 浏览器请求的情况

(不要问 Ovear 为什么最近突然诈尸了,我也不知道(:з」∠)

起源

接上一篇,Ovear 买了一大堆奇奇怪怪的 VPS 之后,弄了一个 CDN 又弄了一个图床,又闲得无聊想试试做个视频 CDN,于是在原本的 CDN 上面上传了几个视频文件,然后用浏览器打开,结果发现卡!住!了!,整个请求页面都 Block 住了。然而 Wget 却是没有这个问题(:з」∠)

原因

遇到了这个问题以后, Ovear 开始抓包和日志来诊断问题,发现 Nginx 在回源的时候,会主动忽略 Content-Range, 也就是当浏览器发送带有 Content-Range 的请求的时候, 并且 Nginx 并未缓存,此时 Nginx 就会忽略 Content-Range
并且进行回源缓存整个文件,而此时用户请求的只是文件的一部分,但是也必须等待到 Nginx 缓存到所指定的位置,才会返回。

解决方法

经过查询,Nginx 支持 Cache Lock, 具体的文档可以在这里查看 http://nginx.org/en/docs/http/ngx_http_proxy_module.html。当开启此设置后,Nginx 收到第一个请求后,便会在后台开始缓存。之后的请求全部打回源服务器,这样也就避免了在缓存不完整的情况下阻塞请求

存在的问题

但是这样解决也有一个缺点,当一个新的文件被推上后端服务器的时候,此时 CDN 还没有进行缓存,如果大量用户涌入(比如说新番刚更新的时候),会造成严重的缓存穿透,也就是 CDN 会失效, 流量会穿过 CDN直接打入源服务器。但是 Ovear 的后端服务器宽带还比较充足,目前也暂时不存在,当 CDN 还未缓存完成的时候,有大量用户涌入。

配置

涉及的配置主要有以下几个

解释完涉及的参数之后,我们就可以根据我们目前的目的(分发大型视频、二进制文件)对上面参数进行调整,以便我们进行调整。
最后调整的结果如下

结语

在这里 Ovear 分发的大部分都是,一上线就不进行更改的文件,所以使用过期缓存问题并不大。
经过这样设置后, Nginx 分发大型文件就没有问题了,也不会阻塞浏览器~
最后例行结尾,晒一晒自己的 CDN 嘻嘻。

解决 Nginx 在分发大文件时 Block 浏览器请求的情况 有 5 个评论

  1. 博主没发现评论名字的URL是本窗口跳转么。。。这样直接跳出自己的网站感觉好别扭

发表评论

电子邮件地址不会被公开。 必填项已用*标注