/**
* web服务器缓存响应结果
*
1.web服务器本质就是URL映射
模拟场景:
当Browser(浏览器)==》WebServer 发送请求后
WebServer的(剥开不少实际过程进入到本质)工做:
1.解析URL
2.完成URL到实际内容或者资源的映射(URL对应内容或者资源)
3.处理请求并生成响应内容的过程
明白了WebServer的工做,咱们大致就能明白URL映射了
这一个系列工做就比如
http:xxx.xx.xxx/xx/ss/xx/xxx.html ====> (具体磁盘上的资源)
这是一个对应关系
2.缓存响应结果
你们也许想到了,咱们为何不把这些对应的关系缓存器来呢?
例如不少时候,一个URL在比较长的时间里对应一个惟一的响应内容
列如静态内容或者更新不频繁的的动态内容,若是缓存下来,下次Web服务器即可以在下次收到请求后当即拿出缓存好的响应结果内容返回给浏览器,那么这一个操做行为是在全部的操做步骤之上完成的,那么相应的会节省时间与提升性能.
3.怎么实现?
1.首先弄清楚,缓存内容应该存储在什么地方
通常来讲: 俩地方本机内存与磁盘上
也能够采用分布式设计,存储到其余服务器上内存与磁盘
主流的Web服务器基本上均可以提供相似的服务
Apache: 提供2个扩展
mod_disk_cache: 提供磁盘缓存存储引擎(用磁盘存储)
mod_mem_cache 提供内存缓存存储引擎(用内存存储)
注意1 :在启用上面两个扩展之间必定要开启mod_cache.so扩展,由于这是存储缓存管理的主程序,
你能够理解为入口程序, 这里面管理了这个两种存储引擎
注意2: mod_mem_cahe模块的使用
主要是 Mod_mem_cahe实现 机制致使它在Apache多进程模型下共享内存的开销比较大
官方推荐是使用mod_disk_cache,他是多个进程共享缓冲区,而且因为缓冲区与内存映射的关系
访问速度要超过Mod_mem_cache
另外Lighttpd ,NIginx也有相似的缓存机制,好比 lighttpd 提供 mmod_trigger_b4_dl 模块能够在响应数据输出以前将它缓存到Memcahce缓存服务器中,并随后请求的Url映射之间检查缓存,本质是相同
注意:配置前,我要求对一个静态文件进行压力test.
压力 test工具为 ab.exe
简单说一下ab工具使用,主要用测试平台的吞吐率等
cmd>ab.exe –n 请求总次数 -c 并发数 请求页面的url
或者进入到apache的bin目录中
举例: 并发请求为10 总请求为1000 在未使用web缓存前 的并发test
cmd>ab.exe -n 1000 -c 10 http://localhost/RenMeng/index.html
test结果:php
配置:html
注意:看手册上面有毕竟详细的配置,也介绍
我在windows上 test的, Linux要先编译一下,(这个东西不必说了吧)
配置具体都相似
配置我是从手册上拷贝下来的 用了IF判断语句的,能够直接用, 我只是说一下
磁盘缓存引擎的配置,内存缓存引擎哥们大家本身去看手册就能够了,并且手册里面很是详细介绍,而且还有其余的用法与指令,我没法所有说明web
LoadModule cache_module modules/mod_cache.so
<IfModule mod_cache.c>
#LoadModule disk_cache_module modules/mod_disk_cache.so
# If you want to use mod_disk_cache instead of mod_mem_cache,
# uncomment the line above and comment out the LoadModule line below.
<IfModule mod_disk_cache.c>
#CacheRoot 指定缓存内容的存储目录
CacheRoot F:/PHPenv/Apache1/CacheRoot
#CacheEnable 指示缓存的指定了缓存引擎
# "/"意思的是缓存将根目录下的全部的请求都进行缓存
# 好比:你只是想缓存站点下的某一个目录,好比图片目录
# 那么就这么配置 CacheEnable disk / images
CacheEnable disk /
#CacheDirLevels
#CacheDirLength
# 这两个参数,指定缓存目录分级结构,为减小同一 个目录有大量文件的查找开销,
CacheDirLevels 5
CacheDirLength 3
</IfModule>
LoadModule mem_cache_module modules/mod_mem_cache.so
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>
# When acting as a proxy, don't cache the list of security updates
CacheDisable http://security.update.server/update-list/
</IfModule>
配置完毕后重启,数据库
手动请求页面http://localhost/RenMeng/index.html 并生成缓存apache
截图windows
具体说一下后端
navjMyA.data缓存的正文信息就是内容
navjMyA.header http头信息浏览器
分开存储的好处是,缓存过时检查提供了方便,只须要检查HTTP头信息的文件便可缓存
如今压力test的结果服务器
看一下test结果那么咱们很轻易的看了性能的提高
补偿说一下
其实单纯的html页面,性能的提高并非很让人惊讶的,
我说一个,高性能平台或者大规模分布式都会用的,
”动态内容缓存“
就本人粗浅的了解通常是用分布式memcache来作,memcache其实不是性能最优的选择,可是基本上大型平台都会用他,主要是memcache能分布式开发,综合来讲用他比较好。
最优选择是APC ,
顺便说一下APC分:
1.数据缓存方法 (这个东西就专门用来缓存动态内容的)
2.Opcode缓存功能 (这东西用来作脚本加速的,说白说本质就是把代码弄成二进制。把搞成编译型的)
我想说一下APC缓存,是动态程序自身实现的缓存机制的最好表现了,
它比Xcache ,memcahe分布式 ,比硬盘缓存的性能都高不少。
很差意思,本PC没法进行test,可是确实是这样的。
可是没法作分布式开发,因此你们最后选择memcahe来作,
可是他的性能确实是最好的,相比与其余的。
可是我想说若是web服务器缓存与APC缓存相比来讲话,以动态内容为例子
首先我没法给出Test结果,可是我能确定,
web服务器缓存比Apc缓存的性能至少高出2个倍
惊讶吧!就是至少高出2倍,
你们应该很难相信我说的是动态内容的缓存结果
我虽然没法给出测试数据,可是我讲一下原理,大家确定能认同
好比:
1.咱们如今访问一个http:xxx.xx.com/index.php?xa=2&xs=4&xd=cc
2.要链接数据库,先数据库进行查询
APC怎么作,在Linux平台上tracer工具对进程进行追踪话更好能体现我说的
把代码缓存起来,说白了只是代码,对数据库还同样的请求,
web服务器缓存呢,从,磁盘的角度来看,他实际上只是对静态文件的请求
同志们明白了吧。单纯性能来讲很是好,
可是也有个问题,这个问题很致命
本来动态内容请求会很快得到缓存,
可是它如何知道缓存是否过时,以及如何控制缓存的有效期的,毕竟是动态内容呢。
下回再来唠叨这个问题,其实看手册也能知道的,算了,我刚才介绍了一下,内容与HTTP头分开存储的,
http头中标记就是判断过时检查的
备注:
顺便说一个Web服务器作反向代理(Reverse Proxy),
就是webserver工做的第一步后,进行将请求转发到后端的服务器,这会增长网络IO开销,之后有时间会专门讨论这一问题。
待续.....................