浏览器缓存和服务器缓存
浏览器缓存即http缓存;浏览器缓存根据是否需要向服务器重新发起HTTP请求将缓存过程分为两个部分,分别是 强制缓存 和 协商缓存 。
浏览器第一次请求资源的时候服务器会告诉客户端是否应该缓存资源,根据响应报文中HTTP头的缓存标识,决定是否缓存结果,是则将请求结果和缓存标识存入浏览器缓存中。如下图:
1强制缓存 :浏览器会对缓存进行查找,并根据一定的规则确定是否使用缓存。
强制缓存的缓存规则?
HTTP/10 Expires 这个字段是绝对时间,比如2018年6月30日12:30,然后在这个时间点之前的请求都会使用浏览器缓存,除非清除了缓存。
这个字段的缺点就是只会同步客户端的时间,这就有可能修改客户端时间导致缓存失效。
HTTP/11 cache-Control 这个是11的时候替换Expires的,它会有几种取值:
public :所有内容都将被缓存(客户端和代理服务器都可缓存)
private :所有内容只有客户端可以缓存, Cache-Control的默认取值
no-cache :客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
no-store :所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存
max-age=xxx (xxx is numeric) :缓存内容将在xxx秒后失效
比如max-age=500,则在500秒内再次请求会直接只用缓存。
优先性:cache-Control > Expires
如果同时存在,cache-Control会覆盖Expires。
这个字段的缺点就是:
如果资源更新的速度是秒以下单位,那么该缓存是不能被使用的,因为它的时间单位最低是秒。
如果文件是通过服务器动态生成的,那么该方法的更新时间永远是生成的时间,尽管文件可能没有变化,所以起不到缓存的作用。
上图中浏览器缓存中存在该资源的缓存结果,并且没有失效,就会直接使用缓存的内容。
上图中浏览器缓存中没有该资源的缓存结果和标识,就会直接向服务器发起HTTP请求。
2协商缓存: 浏览器的强制缓存失效后(时间过期),浏览器携带缓存标识请求服务器,由服务器决定是否使用缓存。
服务器决定的规则?
控制协商缓存的字段有 Last-Modified / If-Modified-Since 和 Etag / If-None-Match。
①Last-Modified 是服务器返回给浏览器的本资源的最后修改时间。
当下次再次请求的时候,浏览器会在请求头中带 If-Modified-Since ,即上次请求下来的 Last-Modified 的值,
然后服务器会用这个值和该资源最后修改的时间比较,如果最后修改时间大于这个值,则会重新请求该资源,返回状态码200。
如果这个值和最后修改时间相等,则会返回304,告诉浏览器继续使用缓存。
② Etag 是服务器返回的一个hash值。
当下次再次请求的时候,浏览器会在请求头中带 If-None-Match ,即上次请求下来的 Etag 值,
然后服务器会用这个值和该资源在服务器的 Etag 值比较,如果一致则会返回304,继续使用缓存;如果不一致,则会重新请求,返回200。
二、服务器缓存
上面是一个简单的流程图:
用户1访问A页面,服务器解析A页面返回给用户1,同时在服务器内存上做一定映射,把A页面缓存在硬盘上面
用户2访问A页面,服务器直接根据内存上的映射找到对应的页面缓存,直接返回给用户2,这样就减少了服务器对同一页面的重复解析
服务器缓存和浏览器缓存的区别:
服务器缓存是把页面缓存到服务器上的硬盘里,而浏览器缓存是把页面缓存到用户自己的电脑里
Nginx服务器
Nginx是一个高性能的HTTP和反向代理服务器。具有非常多的优越性:
在连接高并发的情况下,Nginx是Apache服务器不错的替代品,Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。
Nginx提供了expires、etag、if-modified-since指令来实现浏览器缓存控制。
nginx -s reload#重新加载配置文件
nginx -s reopen#重新打开log文件
nginx -s stop#快速关闭nginx服务
nginx -s quit #优雅的关闭nginx服务,等待工作进程处理完所有的请求
Nginx设置静态文件的缓存过期时间
location ~\(js|css|html|png|jpg)$ {
expires 3d;
}
expires 3d; //表示缓存3天
expires 3h; //表示缓存3小时
expires max; //表示缓存10年
expires -1; //表示永远过期。
如果设置为-1在js、css等静态文件在没有修改的情况下返回的是http 304,如果修改返回http 200
对于静态资源会自动添加ETag,可以通过添加etag off指令禁止生成ETag。如果是静态文件,那么Last-Modified值为文件的最后修改时间。
在开发调试web的时候,经常会碰到因浏览器缓存(cache)而经常要去清空缓存或者强制刷新来测试的烦恼,提供下apache不缓存配置和nginx不缓存配置的设置。在常用的缓存设置里面有两种方式,都是使用add_header来设置:分别为Cache-Control和Pragma。
location ~ \(css|js|swf|php|htm|html )$ {
add_header Cache-Control no-store;
add_header Pragma no-cache;
}
nginx gzip压缩
使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。
主要在nginx服务端将页面进行压缩,然后在浏览器端进行解压和解析,
目前大多数流行的浏览器都迟滞gzip格式的压缩,所以不用担心。
默认情况下,Nginx的gzip压缩是关闭的,同时,Nginx默认只对text/html进行压缩
gzip on;
ersio #开启gzip压缩输出
gzip_http_vn 10 ;#默认11
#其中的gzip_http_version的设置,它的默认值是11,就是说对HTTP/11协议的请求才会进行gzip压缩
#如果我们使用了proxy_pass进行反向代理,那么nginx和后端的upstream server之间是用HTTP/10协议通信的。
gzip_vary on ;
#和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,
#所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
gzip_comp_level 6;
#设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大 1-9
gzip_proxied any;
#Ngnix作为反向代理的时候启用
#expample:gzip_proxied no-cache;
# off – 关闭所有的代理结果数据压缩
# expired – 启用压缩,如果header中包含”Expires”头信息
# no-cache – 启用压缩,如果header中包含”Cache-Control:no-cache”头信息
# no-store – 启用压缩,如果header中包含”Cache-Control:no-store”头信息
# private – 启用压缩,如果header中包含”Cache-Control:private”头信息
# no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息
# no_etag – 启用压缩,如果header中包含“ETag”头信息
# auth – 启用压缩,如果header中包含“Authorization”头信息
# any – 无条件压缩所有结果数据
gzip_types text/html ;#压缩的文件类型
#设置需要压缩的MIME类型,非设置值不进行压缩
#param:text/html|application/x-javascript|text/css|application/xml
gzip_buffers 16 8k; #设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间
#设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间
# param1:int 增加的倍数
# param2:int(k) 后面单位是k
# example: gzip_buffers 4 8k;
# Disable gzip for certain browsers
gzip_disable “MSIE [1-6](!SV1)”; #ie6不支持gzip,需要禁用掉ie6
问题一:如何架设缓存DNS服务器 Windows Server配置缓存DNS:
安装DNS后,不设置任何zone。只通过forwarder、root hint对名称进行解析。参考:
technetmicrosoft/217396
有问题的话你可以直接到微软的论坛提问:socialtechnetmicrosoft/Forums/en-us/home
问题二:服务器缓存怎么设置啊 双核cpu 用ok缓存,是单核心cpu用liunx的缓存
问题三:怎么搭建一个tair缓存服务器 能啊,不过不知你要怎么做。
一般来说,对企业级用户才需要这些功能。主要就是避开上网高峰期,利用夜间来把网页等内容缓存下来,到了白天再用,再打开时可以看到网页是前一天或当天凌晨的。不过,不要紧,一点“刷新”就好了,因为大部分内容都下来了,改动也就很少,浏览网页的速度也就很快了。
方法我知道有两种,都是基于系统服务器的:1 WINDOWS系统下可以装一个ISA2000之类的软件,它可以提供防火墙、NAT、缓存三大功能。这个软件一时半会说不清楚,你可以自己下一个下来慢慢来,并不是很难。2 LINUX系统下也可以实现,在安装了一个叫squid的服务后,这个功能就可以再通过配置来实现,不过配置全是用命令,有点困难了。
最后,建议用ISA来做,或者找些专用的小软件之类的。顺便问一下,你该不是在开网吧,自学吧。
问题四:如何将一个页面缓存一天,服务器该如何设置 16G20台 安装2008SP2 系统自己缓存就可以了 查看原帖>>
问题五:linux网吧缓存服务器如何架设 现成的缓存服务器MQCache,下载安装,省时又省力
问题六:Win2003系统缓存怎么设置(服务器) 20分 的电脑--属性---高级----性能“设置”---高级---虚拟内存“设置”,可修改页面大小等。。。
问题七:16G服务器,怎么设置缓存啊! - 16G20台 安装2008SP2 系统自己缓存就可以了 查看原帖>>
问题八:如何在IIS里设置服务器端缓存时间? 设置IIS缓存的方法
1测试,可以缓存整个Share工程(经测试IIS中的缓存测试对ASPX页面不起作用,估计与页面压缩的设置原理一样);
2需要设置缓存的工程: Share,Portal(根据IIS日志分析报告中的“Most Requested Directories”得出);
3设置的方法:
第一步:
打开 IIS 配置管理工具(Internet 信息服务(IIS)管理器)。
选中一个目录(或者网站,如果您想为所有站点配置,请选择点中“网站”那个图标),点“属性”按钮,会弹出一个配置窗口
第二步:
选择“HTTP 头” TAB 标签,然后您会看到:“自定义 HTTP 头”一栏。
第三步:
点旁边的“添加(D)”按钮,来添加上那条命令。
在弹出的窗口中:“自定义 HTTP 头名(C)”中输入:“Cache-Control”,在“自定义 HTTP 头值(U)”中输入:“Must-revalidate”。
Cache-Control头的参数设置:
Public 响应会被缓存,并且在多用户间共享。
Private 响应只能够作为私有的缓存,不能再用户间共享。
No-cache 响应不会被缓存
No-store 响应不会被缓存,并且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个。
Max-age=#seconds 响应将会某个指定的秒数内缓存,一旦时间过了,就不会被缓存。
Must-revalidate 响应会被重用来满足接下来的请求,但是它必须到服务器端去验证它是不是仍然是最新的。
注意:
如果你要想在iis中配置缓存,请参阅微软的知识技术文章:
・ How to Modify the Cache-Control HTTP Header When You Use IIS
不知道这样可以 不可以啊。
问题九:做前端静态资源缓存服务器有哪些成熟易搭建的方案 我现在是把阿里云的 CDN 直接解析到 OSS 。
每天的 PV , 1 万到 5 万。
然而才用了一个多月就跑了 300+G 流量。 036/GB 。泪。
阿里云的 CDN 实在是太贵了,用峰值带宽的话,根本就不能控制成本啊!万一有个用户 100M 水管,那一天岂不是要付 100 块钱?
所以还不如选一个好一点的 BGP 线路机器反代到 OSS 。
自己用 squid 搭建吗?
如果主站是 HTTPS 的, squid 能配置 SSL 吗?还是说要 nginx 配置 SSL 以后再去反代 squid ,然后 squid 反代 oss ?
有没有配置脚本?
还是装个 AMH/WDCP 之类面板,然后可以傻瓜化配置?
对主机磁盘 IO 、内存有什么要求?
问题十:安装秒开缓存服务器后怎么检测数据是否走缓存了? 两个:
一是设置浏览器,以IE为例,打开工具-Internet选项-Internet临时文件里的设置,改为每次访问时检查
二是设置服务器端,以IIS为例,设置内容过期为立即过期,那这样每次都会从服务器下载新的数据,代价是服务器的带宽占用大幅度上升
0条评论