nginx的proxy_cache可以通过缓存首部Cache-Control和Expires进行代理缓存,但是有个参数proxy_cache_revalidate on; 可以有效减少报文的传输。在说这个之前,先看下原理。在HTTP协议中If-Modified-Since和If-None-Match分别对应Last-Modified和ETag。结合Expires为缓存的方式实现减少传输报文的场景。按照RFC2616对HTTP协议的规定,在客户端第二次向服务器发出请求时,对于第一次访问请求的资源如果响应状态为200的资源,那么在这次请求中将会添加一个新的请求头:If-Modified-Since,故名思议,就是询问服务器从这个时间起,或者说是以这个时间为分割点,在这时间点之前有没有修改过这个文档,如果没有修改,那么返回的http状态代码是304.并且同时再次发回响应头Last-Modified,而且这两个头的时间完全相同的。
在计算Etag的时候,会产生CPU的耗费,所以也可以用时间戳,但这样直接使用Last-Modified即可。
在同时使用Expires和Etag时,没有优先级,在满足两者时才会做出决定。
在http的Response的首部中,有transfer-coding域值为chunked。则无法使用304的原理。在tomcat中禁用的方法就是设置返回的缓存,只要返回数据小于这个缓存,则不会开启。
response.setBufferSize(1024 * 1024);
与APP请求的原生流程。看图知道一切。
启用proxy_cache模块的nginx流程。打开代理重新缓存验证。
proxy的cache实现,可以参考猫头哥另外一篇文章
http://phl.iteye.com/blog/2247856
proxy_cache_revalidate on
如果代理的缓存没有过期,则代理缓存可以直接返回304状态码,没有body
如果代理缓存过期,则会向后端应用服务器验证,如果后端服务器返回304,则代理缓存继续使用。
在这个流程中,和上个原生流程中的浏览器的原理是一样的。
另外在proxy_cache中,当启用proxy_cache_min_uses最后一次缓存出发的时候,nginx服务器不会把304透传给应用服务器,而是直接获取最新的数据进行缓存,应用服务器返回200状态码。
response.addHeader("Cache-Control", "max-age=5,s-maxage=15");//, no-store, max-age=0,s-maxage=0
//当只设置Expires的时候,则代理服务器缓存时间使用Expires
response.setDateHeader("Expires", System.currentTimeMillis() + 1000 * 10);
//"If-Modified-Since" , "If-None-Match"
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH");
String e1 = sdf.format(new Date());
response.setHeader("ETag", e1);
//2015-11-13 12:28:00
long d1 = 1447388904765L / 1000 * 1000 + 3600 * 1000; //只能保存秒,毫秒会自动丢失
response.setDateHeader("Last-Modified", d1);
long d = request.getDateHeader("If-Modified-Since"); //格林尼治时间
String e = request.getHeader("If-None-Match");
System.out.println(d);
System.out.println(e);
response.setContentType("text/html");
if (e1.equals(e) && d1 == d) {
response.setStatus(304);
} else {
response.getWriter().write("hello world:" + new Timestamp(System.currentTimeMillis()).toString());
}
nginx的完整配置文件
location /cache_ehcache-2.10.0_web {
proxy_pass http://192.168.56.1:8080/cache_ehcache-2.10.0_web;
proxy_cache_revalidate on;
proxy_cache content; #根keys_zone后的内容对应
proxy_cache_valid 200 304 301 302 1h; #哪些状态缓存多长时间
proxy_cache_methods GET; # 默认是get和head
proxy_cache_valid any 3s; #其他的缓存多长时间
proxy_cache_key $host:$server_port$uri$is_args$args; #通过key来hash,定义KEY的值
#缓存的具体key值是: [host]192.168.56.2 [server_port]8080 [uri]/cache_ehcache-2.10.0_web/expire [is_args] [args]-
proxy_cache_min_uses 3; #只要统一个url,在磁盘文件删除之前,总次数访问到达3次,就开始缓存。
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment; # 如果任何一个参数值不为空,或者不等于0,nginx就不会查找缓存,直接进行代理转发
#增加输出日志
access_log logs/cache.log cache_log;
}
参考文章
http的chunked原理
http://www.cnblogs.com/zhaozhan/archive/2010/08/24/1807639.html
在tomcat中禁用Transfer-Encoding:chunked的办法
http://stackoverflow.com/questions/6299432/how-do-disable-transfer-encoding-in-tomcat-6
- 大小: 21.3 KB
- 大小: 21.9 KB
分享到:
相关推荐
在后续请求中,客户端会在HttpRequest Header中发送If-Modified-Since报头,包含之前接收到的Last-Modified时间。如果服务器上的文件自上次请求后未被修改,服务器将返回304 Not Modified状态码,客户端则直接从本地...
当浏览器再次请求该资源时,会在请求头中添加If-None-Match和If-Modified-Since头信息,服务器通过比较这些头信息与当前资源的ETag和Last-Modified值来判断资源是否被修改。如果资源未修改,服务器将返回304状态码,...
在实际应用中,Nginx往往会同时支持Last-Modified和ETag,以提高缓存效率和准确性。 #### 七、总结 综上所述,了解和掌握浏览器缓存机制及其相关的HTTP头部信息对于优化网站性能至关重要。通过合理配置这些头部...
此外,Nginx还支持Gzip压缩、ETag和Last-Modified头信息,有效减少网络传输量并实现缓存。 **3. 反向代理与负载均衡** Nginx的反向代理功能可以将客户端请求转发到后端服务器集群,隐藏了内部服务器的结构,提高...
- HTTP缓存控制:利用Cache-Control、ETag、Last-Modified等头部实现缓存策略。 5. **反向代理与负载均衡的结合** - 反向代理实现跨域访问,隐藏真实服务器IP。 - 通过反向代理实现负载均衡,提高系统可用性。 ...
3. 使用Nginx的缓存更新策略,如基于文件修改时间或HTTP头部的ETag和Last-Modified进行缓存更新。 配置Nginx缓存通常涉及proxy_cache_path指令来定义缓存目录,以及在location块中启用proxy_cache。例如: ```...
add_header Last-Modified $date_gmt; add_header ETag $etag; expires max; access_log off; break; } ``` `autoindex on` 开启目录索引,让访客可以看到目录中的文件列表。`sendfile on` 提高文件传输效率...
- Last-Modified:提供资源最后修改的时间戳。 - **Gzip压缩**: 提高传输效率,减少带宽消耗。 - `gzip on;` 开启gzip压缩。 - `gzip_comp_level 5;` 设置压缩级别。 - `gzip_types application/javascript text...
HTTP协议提供了多种缓存控制策略,主要包括`Last-Modified/If-Modified-Since`和`Etag/If-None-Match`配合`Cache-Control`使用: - `Last-Modified/If-Modified-Since`:如果服务器返回的资源上次修改时间未变,...
浏览器会根据HTTP响应头中的Cache-Control、ETag、Last-Modified等字段来决定是否缓存资源,并在下次请求时尝试使用缓存副本,减少网络带宽使用。 “4-cdn.rar”指的是内容分发网络(Content Delivery Network)。...
缓存策略可以减少服务器的负担,提高响应速度,例如使用ETag和Last-Modified头实现条件GET。负载均衡则可以在多台服务器之间分配请求,确保任何一台服务器过载时,其他服务器能接续服务。连接管理包括对持久连接的...
通过在浏览器访问localhost:8080后,观察到两次请求的响应头信息中包含了Etag和Last-Modified字段,这些字段用于协商缓存。 #### 缓存命中情况 在不修改文件内容的情况下刷新页面,可以看到对于index.html文件的...
- 缓存策略:如ETag和Last-Modified,避免不必要的数据传输。 - 压缩静态资源:如CSS、JavaScript和图片,减小文件大小。 8. **安全考虑**: - 安全更新:保持服务器软件及时更新,防止已知漏洞被利用。 - 访问...
在实际的配置中,通常还会结合ETag(实体标签)机制,通过ETag和Last-Modified来实现对资源版本的校验,以判断是否需要重新从服务器获取资源。 最后,需要注意的是,当资源更新时,应确保更新的资源有新的URL或者...
- **缓存机制**:HTTP允许客户端缓存资源,通过ETag和If-None-Match或Last-Modified和If-Modified-Since来验证资源是否过期,减少不必要的网络传输。 2. **Tomcat简介**: - **架构**:Tomcat基于Coyote处理器...
CDN的工作原理就是利用这一机制,当客户端请求一个已经被缓存的资源时,CDN节点会向源服务器发送一个带有If-None-Match或If-Modified-Since头部的请求,询问资源是否更新。如果源服务器返回304状态码,CDN则继续使用...
3.缓存机制:利用HTTP缓存策略,如ETag和Last-Modified,减少服务器负载。 六、Web服务器日志分析 1. 日志文件:Web服务器记录所有请求的详细信息,如访问时间、IP地址、请求资源等。 2. 日志分析工具:如AWStats和...
- 结合缓存策略,如ETag和Last-Modified,优化重复访问的性能。 通过以上讨论,我们可以看到,JavaScript在HTML压缩方面扮演着重要的角色,无论是通过使用现成的库,还是自定义脚本,都能有效提升网页加载速度,...