原文出自http://mark.koli.ch/2010/09/understanding-the-http-vary-header-and-caching-proxies-squid-etc.html
作者是Mark S. Kolich
就是简单的对vary进行一下介绍,方便大家理解,下面是一个简单的翻译
我从来没有过多关注http的vary header。事实上,我非常幸运在过去的很长时间避开了它给我带来的问题,所以就没引起我的关注,但是,如果你最终要配置一个高性能的反向代理服务器, 那么理解vary header并且它对于你的缓存策略意味着什么事非常有必要的。
下面是一个关于我最近处理关于squid,apache的一个有趣的问题,并且这个问题很难找出竟然是和vary response header有关。
1 关于vary的一些基本信息
流行的缓存代理服务器,像squid,通常会根据请求的URI和 vary response header的内容产生一个hash值。当缓存服务器接收到一个请求的时候,它会根据输入产生一个hash,之后检查缓存看是否已经有这个资源在硬盘上或 者在内存中匹配这个hash值。缓存服务器以此来判断命中与否。
而vary response header告诉缓存服务器使用什么判断一个请求的资源是fresh还是stale的,一个简单的vary header包括:
- Vary: Accept-Encoding
- Vary: Accept-Encoding,User-Agent
- Vary: X-Some-Custom-Header,Host
- Vary: *
根据http标准,vary 的值表明需要哪些request header去充分决定一个response是否是fresh的,缓存服务器是否可以不用重新确认就使用一个reponse。
2 缓存遇到的问题
我配置squid作为一个轮询的负载均衡服务器和一个反向代理缓存服务器,在apache服务器的前面,每个apache服务器都运行着我的web应用,我严格配置squid缓存.json文件24个小时。
我打开了一个web浏览器,我访问了一个我认为已经被缓存的URL。
- GET /path/big.json HTTP/1.1
- Host: app.kolich.local
- User-Agent: Firefox
- HTTP/1.0 200 OK
- Date: Fri, 24 Sep 2010 23:09:32 GMT
- Content-Type: application/json;charset=UTF-8
- Content-Language: en-US
- Vary: Accept-Encoding,User-Agent
- Age: 1235
- X-Cache: HIT from cache.kolich.local
- X-Cache-Lookup: HIT from cache.kolich.local:80
- Content-Length: 25090
- Connection: close
很好,它已经被缓存了,然后我在另一台机器上打开了第二个web浏览器(注:是一个不同类型的浏览器),这一次,注意一下X-Cache:MISS
- GET /path/big.json HTTP/1.1
- Host: app.kolich.local
- User-Agent: Chrome
- HTTP/1.0 200 OK
- Date: Fri, 24 Sep 2010 23:11:45 GMT
- Content-Type: application/json;charset=UTF-8
- Content-Language: en-US
- Vary: Accept-Encoding,User-Agent
- Age: 4
- X-Cache: MISS from cache.kolich.local
- X-Cache-Lookup: MISS from cache.kolich.local:80
- Content-Length: 25090
- Connection: close
wow,看看它,我请求了一个完全一样的资源,只是从一个不同的浏览器 上,现在我看到了一个MISS。这肯定不是我想看到的结果,我当然需要需要同样的缓存对象而无论到底是谁请求了这个资源。如果就这样放着的话,这个缓存服 务器只会是一个每一个浏览器都会有一份拷贝的缓存,而不是一个全局的缓存。
3 解决方案,检查你的vary header
观察上面两个请求,注意User-Agent header和Vary header,虽然两个请求都是请求同一个资源,但是squid把这个两个请求看做是不同的了,这是怎么发生的呢,我们看一下Vary header:
- Vary: Accept-Encoding,User-Agent
它告诉squid请求的URI,Accept-Encoding header和User-Agent header应该包括在hash值内去决定在缓存上的对象是可用的。很明显的,任何一个(URI, Accept- Encoding,"Firefox")组合的hash值和(URI, Accept-Encoding, "Chrome")组合产生的hash值都是不匹配的,所以squid才认为这两个请求是请求不同的内容的。
为了解决这个问题,我找到了烦人的附加在我的Vary response header上的User-Agent是从哪来的,原来是在apache自带的mod_deflate模块,推荐的mod_deflate的配置包括如果 一个response没有被mod_deflate压缩话就默认附加User-Agent在Vary header后面。这是推荐的apache配置中关于mod_deflate的相关行:
- SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
- Header append Vary User-Agent env=!dont-vary
我删除掉了上面的这两行,重启了apache然后squid会忽略掉请求的浏览器客户端的类型。本质上说,我通过移除Vary header中的User-Agent告诉squid不要再去关心用户的浏览器类型,然后问题就解决了。
http://shunter.blog.51cto.com/2183398/1076521
相关推荐
FRP,全称Fast Reverse Proxy,是一款高效且功能强大的内网穿透工具。它的设计目标是帮助用户在没有公网IP的情况下,能够将内网服务暴露到公网,使得远程访问变得简单易行。FRP不仅适用于个人用户,也广泛应用于企业...
《深入理解Rack反向代理:基于rack-reverse-proxy库》 在Web开发领域,Rack框架是Ruby社区中一个非常重要的组件,它提供了一种标准化的方式来构建Web服务器和应用程序之间的接口。而rack-reverse-proxy则是Rack生态...
反向代理(Reverse Proxy)是一种常用的网络架构模式,通过使用反向代理,可以将客户端的请求转发到内部服务器,提高了网络安全性和负载均衡能力。 在本文中,我们将介绍如何使用 Nginx 配置反向代理,实现 ...
3. **压缩头部**:对HTTP头部进行压缩,减少不必要的数据传输。 4. **服务器推送**:服务器可以预测客户端可能需要的资源并主动推送,减少了额外的请求延迟。 **HTTPS协议** HTTPS是HTTP协议与SSL/TLS协议的结合,...
快速http反向代理 ... proxy "github.com/yeqown/fasthttp-reverse-proxy/v2" ) var ( proxyServer = proxy . NewReverseProxy ( "localhost:8080" ) // use with balancer // weights = map[string]p
例子 var SimpleReverseProxy = require('simple-reverse-proxy');new SimpleReverseProxy(['http://localhost:10001','http://localhost:10002','http://localhost:10003'], {agent: false}).listen(10000);[10001,...
safrp(simple and fast reverse proxy)是一个基于Go的内网穿透软件Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高...
《Elixir反向代理插件reverse_proxy_plug的深度解析》 在当今互联网技术日新月异的时代,高效、安全的网络服务成为了开发者们追求的目标。Elixir,一种基于BEAM虚拟机的函数式编程语言,以其并发能力、低延迟和高...
safrp cn/safrp(Simple and fast reverse proxy)是基于Go语言开发的一个轻量级和可定制化功能的内网穿透软件,支持 TCP、UDP、SSH、HTTP、HTTPS、WebSocket 协议的数据转发。可根据场景在服务端或内网中进行限流、...
http proxy forward proxy reverse proxy
内网穿透工具FRP(全称:Fast Reverse Proxy)是一种高效、轻量级的网络穿透解决方案,主要用于解决在内网环境下,外部网络无法直接访问内网服务的问题。它通过搭建一个代理服务器,允许内网中的设备通过这个代理来...
`proxy_set_header`指令用于传递客户端信息给后端服务。 反向代理还可以与Docker结合使用,特别是在多容器环境中。`nginx-proxy`是一个流行的Docker容器,它可以自动处理容器的网络配置,为每个容器分配一个虚拟...
java-websocket-reverse-proxy 我发现的大多数Java websocket示例都是基于或包含诸如STOMP之类的消息传递协议的。 该示例是研究如何代理任何消息内容而无需担心消息传递协议的结果。 Websocket反向代理的Java实现。 ...
反向代理使用进行简单的反向代理设置。描述这是一个使用 gem 设置的简单 Web 应用程序。 该应用程序允许通过在... 我们是一家对优质代码充满热情的数字通信机构,如果您正在使用这个库,我们可能想。执照该项目在 MIT
这个"reverse-proxy"项目可能包含了一个或多个JavaScript文件,用于配置和处理代理逻辑。其中,核心库如`http`、`https`或第三方库如`http-proxy-middleware`、`http-proxy`等,通常会被用来创建代理服务器。 以下...
Google反向代理[Nginx]可配置的Nginx com代理反Google产品,可单独使用Archivo默认的默认网站-可用nano / etc / nginx / sites-可用/默认pegar lo siguiente:配置... proxy_set_header User-Agent $http_user_agent ;
dsm-reverse-proxy-websocket, Synology DSM 6反向代理的配置修复以处理 web socket dsm-reverse-proxy-websocketSynology DSM 6反向代理的配置修复以处理 web socket在修改 portal.mustache 之前,请先对它的进行 ...
Reverse_proxyphp反代的几个demo:.htaccess:注意前面有个'.',隐藏文件,也是配置文件,作用:URL重写,将其放置网站根目录即可。1.php中修改第三行host即可使用,能反代百度的基本功能,但是不太完善。2.php使用...
信息安全Reverse学习资料:测试题目;入门指导;学习资料。
基本目标 镜像站点,并输出,用于替代nginx的反向代理 已经实现 v1 全站的反代 v1 header跟随跳转 v1 cookies的基本适配 计划中 缓存的建立更新、删除 cookies和session的同步等功能的实现 ip地址的穿透 ...