聊聊高并发系统之HTTP缓存
对于静态资源会自动添加ETag,可以通过添加“etag off”指令禁止生成ETag.如果是静态文件Last-Modified是文件的最后修改时间;Expires是根据当前服务端系统时间算出来的.如上nginx配置的计算逻辑(实际计算逻辑比这个多,具体参考官方文档): if (expires == NGX_HTTP_EXPIRES_ACCESS ||r->headers_out.last_modified_time == -1) { max_age = expires_time; expires_time += now; } if-modified-since此指令用于表示nginx如何拿服务端的Last-Modified和浏览器端的If-Modified-Since时间进行比较,默认“if_modified_since exact”表示精确匹配,也可以使用“if_modified_sincebefore”表示只要文件的上次修改时间早于或等于浏览器短的If-Modified-Since时间,就返回304. nginx proxy expires使用nginx作为反向代理时,请求会先进入nginx,然后nginx将请求转发给后端应用.如下图所示: 首先配置upstream: upstream backend_tomcat { server 192.168.61.1:9080 max_fails=10 fail_timeout=10s weight=5; } 接着配置location: location = /cache { proxy_pass http://backend_tomcat/cache$is_args$args; } 接下来我们可以通过如http://192.168.61.129/cache?millis=1471349916709访问nginx,nginx会将请求转发给后端java应用.也就是说nginx只是做了相关的转发(负载均衡),并没有对请求和响应做什么处理. 假设对后端返回的过期时间需要调整,可以添加expires指令到location: location = /cache { proxy_pass http://backend_tomcat/cache$is_args$args; expires 5s; } 然后再请求相关的URL,将得到如下响应: 过期时间相关的响应头被expires指令更改了,但是Last-Modified是没有变的. 即使我们更改了缓存过期头,但nginx本身没有对这些内容做缓存,每次请求还是要到后端验证的,假设在过期时间内,这些验证在nginx这一层验证就可以了,不需要到后端验证,这样可以减少后端的很大压力.即整体流程是: 1、浏览器发起请求,首先到nginx,nginx根据url在nginx本地查找是否有文档缓存; 2、nginx没有找到本地缓存,则去后端获取最新的文档,并放入到nginx本地缓存中;返回200状态码和最新的文档给浏览器; (编辑:淮安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |