[Nginx] proxy cache 中对带有 Range header 请求的处理

标签: nginx proxy cache range
20人阅读 评论(0) 收藏 举报
分类:

media 文件下载服务需要一层cache,使用的是 Nginx 的 proxy_cache 模块,文件下载常见的一个需求就是要使用 Range 这个请求header来下载文件的一部分。下面就是测试 proxy_cache 模块,对这种请求的处理。

思考

前提

  • 下载服务本身支持range请求

第一种情况:

请求Range --> nginx proxy cache --> 下载服务
                (缓存文件的一部分)

第二种情况

请求Range --> nginx proxy cache --> 下载服务
               (缓存文整个文件)

测试

  • macos
  • openresty 1.9.7
  • curl

nginx 配置文件

# source site
server {
    listen 10010;
    location / {
        index  index.html index.htm;
    }
}

# cache site
proxy_cache_path /tmp/ngcache levels=1:2 keys_zone=cache_test:2m inactive=30m max_size=10240m;

server {
    listen 10009;
    location / {
        proxy_cache cache_test;

        # no range
        proxy_cache_key $host&uri&is_args&args;
        proxy_cache_valid 200;

        add_header X-Proxy-Cache $upstream_cache_status;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:10010;
    }
}
  • 端口 10009,缓存服务
  • 端口 10010,下载服务,也叫做源站

使用带有 Range 的请求访问源站,保证源站支持这种方式

$ curl -r 0-1 -i http://127.0.0.1:10010

HTTP/1.1 206 Partial Content
Server: openresty/1.9.7.1
Date: Mon, 16 Apr 2018 13:11:19 GMT
Content-Type: text/html
Content-Length: 2
Last-Modified: Tue, 12 May 2015 04:01:15 GMT
Connection: keep-alive
ETag: "55517b0b-264"
Content-Range: bytes 0-1/612

<!%

测试ok

发送带range的请求到缓存服务

$ curl -r 0-1 -i http://127.0.0.1:10009
HTTP/1.1 206 Partial Content
Server: openresty/1.9.7.1
Date: Mon, 16 Apr 2018 13:12:13 GMT
Content-Type: text/html
Content-Length: 2
Connection: keep-alive
Last-Modified: Tue, 12 May 2015 04:01:15 GMT
ETag: "55517b0b-264"
X-Proxy-Cache: MISS
Content-Range: bytes 0-1/612

<!%

返回ok,可以看到 X-Proxy-Cache 是miss的,此时,文件应该缓存到了缓存目录中,下面去看看

查看cache目录

$ sudo tree ngcache
ngcache
└── e
    └── 81
        └── 5ad01815bca14bc0f88a02a882ec881e

sudo cat ngcache/e/81/5ad01815bca14bc0f88a02a882ec881e

看到的结果是 缓存了整个文件

再次使用带有range的请求访问缓存服务,这次的range范围有所改变

$ curl -r 2-10 -i http://127.0.0.1:10009
HTTP/1.1 206 Partial Content
Server: openresty/1.9.7.1
Date: Mon, 16 Apr 2018 13:14:07 GMT
Content-Type: text/html
Content-Length: 9
Connection: keep-alive
Last-Modified: Tue, 12 May 2015 04:01:15 GMT
ETag: "55517b0b-264"
X-Proxy-Cache: HIT
Content-Range: bytes 2-10/612

DOCTYPE h%

可以看到缓存命中了 X-Proxy-Cache 为 hit。

总结

上面的测试和第二个猜想相符合,那为什么会这样呢?在 mailing list中找到了一段讨论

nginx removes Range header (as well as several other headers)
before passing request to upstream to make sure full response will
be cached and other requests for the same uri will be served
correctly.

可以看到 nginx 在往源站发送请求的时候,把range这个header去掉了,所以源站返回给nginx cache的是整个文件,所以缓存的也是整个文件了。

再来看看 ngx_http_proxy_module 的文档

If caching is enabled, the header fields “If-Modified-Since”, “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range”, and “If-Range” from the original request are not passed to the proxied server.
You may be able to make it work by adding something like proxy_set_header Range $http_range, but you will also need to add the range to the cache key, so it probably won’t be too effective (btw, also need to handle the cache in which the original request did not specify a range)

改进 一

如果是一个大文件下载,请求的是文件的一部分,下载的却是整个文件,势必会造成流量暴增,下载很慢,如果我们想要 nginx upstream 也是用range请求到后端,并缓存这部分内容到缓存目录,怎么配置呢?

请求Range --> nginx proxy cache (upsteam range) --> 下载服务
                (缓存文件的一部分)

还是上面的 nginx配置,把 no range 部分替换成

proxy_cache_key $host&uri&is_args&args$http_range;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_cache_valid 200 206; 

测试,没好用,range请求文件可以下载,但是无法缓存,还需要看看怎么回事 !!!

改进二

如果只想对 非Range 的请求缓存,对range的下载请求不做缓存,那么配置中no range 部分替换成

proxy_cache_key $host&uri&is_args&args;  #key中不缓存range信息
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_no_cache $http_range $http_if_range;  #加了一个配置
proxy_cache_valid 200;   

测试ok

查看评论

https在云服务器请求的启用

本课程将详细介绍https,云服务器,SSL证书以及相关的购买,SSL证书在云服务器端的配置,到最后成功发送https请求
  • 2017年03月25日 14:35

Nginx:作为缓存,支持Range回源

一、Range回源 1.1 Nginx的Range回源、ngx_http_slice_module模块、--with-http_slice_module参数         Nginx的ngx_htt...
  • kanguolaikanguolaik
  • kanguolaikanguolaik
  • 2016-03-09 16:40:28
  • 6604

Nginx缓存功能:Proxy_cache与fastcgi_cache区别

proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态。 fastcgi_cache的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容。 prox...
  • cgeeker
  • cgeeker
  • 2013-06-25 18:20:44
  • 2461

nginx 处理header 全攻略

公司的网站要加入动态加速 一个直接的问题是经过转发 客户端请求的头被改了一部分 remote_addr这个被改成了自定义的True-Client-IP 为了不改动已有的程序 需要在nginx那转发的时...
  • vaal_water
  • vaal_water
  • 2010-11-12 10:44:00
  • 17930

nginx proxy_cache 缓存配置

前言: 由于本人工作原因,涉及到网络直播领域,其中视频的回放下载,涉及到了一些视频下载方面的技术。针对于一个完整视频的下载,目前市面上的主流做法是,先将整个视频流切片,存储到文件服务器中,在用户需要...
  • dengjiexian123
  • dengjiexian123
  • 2016-11-29 00:16:58
  • 26106

lua实现跨域请求(Nginx)

lua实现跨域请求(Nginx)基于工作需要,致力于成为合格前端工程师,对于后端的东西当然也得会点。web 服务器是Nginx,写完nginx+lua的token令牌系统后,当然是首要解决跨域的问题,...
  • u010277446
  • u010277446
  • 2017-11-28 14:11:59
  • 212

nginx cache 学习总结

Nginx cache 学习总结   一、nginx cache的基本指令 1.1 proxy_cache    syntax: proxy_cache zone| off; de...
  • hero00e
  • hero00e
  • 2016-10-19 11:55:05
  • 2324

【Nginx的坑】nginx反向代理proxy_set_header自定义header头无效的问题

【Nginx的坑】nginx反向代理proxy_set_header自定义header头无效的问题 nginx underscores_in_headers默认off 用减号-替代下划线符号_,避...
  • lu_wei_wei
  • lu_wei_wei
  • 2016-11-16 16:52:38
  • 3373

nginx内置缓存Proxy_cache

一.http模块加入缓存设置1.加上下面三段(缓存到磁盘)proxy_temp_path /etc/nginx/proxy_temp; proxy_cache_path /etc/nginx/pr...
  • tshangshi
  • tshangshi
  • 2016-07-11 21:47:07
  • 3093

nginx的proxy_cache做网站缓存

为什么要做web cache,我想大家最主要的是解决流量的压力。随着网站流量的提升,如果只是单台机器既处理静态文件,又处理动态脚本,显然效率很难上升,不能处理日益上涨的流量压力。与此同时某些网站的页面...
  • itlqi
  • itlqi
  • 2016-01-15 11:35:31
  • 1022
    个人资料
    持之以恒
    等级:
    访问量: 175万+
    积分: 2万+
    排名: 494