认识缓存之服务器缓存(Apache)
当前web服务器功能异常强大,除了能够提供高性能的HTTP服务,还可以提供反向代理、页面缓存的功能。比较流行的web服务器如:Apache、Nginx。这些服务器都已经提供了成熟的插件,实现缓存功能。只需要我们在安装这些web服务器的时候,将所需的插件编译进去,并通过配置文件配置说明,就可以使用。
一、Apache缓存
1、依赖组件
Apache服务器从2.0开始就已经可以使用缓存模块,但是2.0的时候还是实验性的,到了2.2已经完全可以放心的使用。Apache的缓存实现主要依靠mod_cache、mod_disk_cache、mod_file_cache以及mod_mem_cache。只需在配置编译的时候添加上参数:--enable-cache、--enable-disk-cache、--enable-file-cache、--enable-mem-cache即可。
2、缓存方式
具体来说,Apache的缓存方式有两种:一种是基于磁盘文件的缓存,由mod_disk_cache实现;另一种是使用内存缓存,由mod_mem_cache实现。不过他们都依赖mod_cache模块,mod_cache模块提供了一些缓存配置指令供他们使用。而mod_file_cache模块是搭配mod_mem_cache模块使用的。
3、基于硬盘文件的缓存
基于硬盘文件存储的缓存由mod_disk_cache模块实现,简单配置如下:
<ifModule mod_cache.c> CacheDefaultExpire 86400 <ifModule mod_disk_cache.c> CacheEnable disk / CacheRoot /tmp/apacheCache CacheDirLevels 5 CacheDirLength 5 CacheMaxFileSize 102400 CacheMinFileSize 10 </ifModule mod_disk_cache.c> </ifModule mod_cache.c>
把上面的配置添加到Apache的httpd.conf文件中。上面的指令详细说明如下:
- CacheDefaultExpire:设定缓存过期的时间(秒),模式是1小时,只有当缓存的文档没有设置过期时间或最后修改时间时这个指令才会生效。
- CacheEnable:启用缓存,第一个参数是缓存类型,这里就是disk了。第二个参数是缓存路径,指的是URL路径,这里是缓存所有的东西,直接写上“/”即可,如:“/docs”则只缓存/docs下的所有文件。
- CacheRoot:缓存文件所在的目录,运行Apache的用户(如daemon或nobody)要能对其进行读写,如果不清楚的话可以直接设置成777,请管理员设置该目录的访问控制权限。
- CacheDirLevels:缓存目录的深度,默认是3,这里设置为5。
- CacheDirLength:缓存目录的字符长度,默认是4,这里设置为5。
- CacheMaxFileSize和CacheMinFileSize:缓存文件的最大值和最小值(byte),当超过这个范围时将不再缓存。
4、基于内存的缓存
基于内存的缓存主要由mod_mem_cache模块实现,一个简单配置如下:
<ifModule mod_cache.c> <ifModule mod_mem_cache.c> CacheEnable mem / MCacheMaxObjectCount 20000 MCacheMaxObjectSize 1048576 MCacheMaxStreamingBuffer 65536 MCacheMinObjectSize 10 MCacheRemovalAlgorithm GDSF MCacheSize 131072 </ifModule mod_mem_cache.c> </ifModule mod_cache.c>
上面指令详解如下:
- CacheEnable:启用缓存,使用基于内存的方式存储。
- MCacheMaxObjectCount:在内存中最多能存储缓存对象的个数,默认是1009,这里设置为20000.
- MCacheMaxObjectSize:单个缓存对象最大为多少。默认是10000bytes,这里设置为1M.
- MCacheMaxStreamingBuffer:在缓冲区最多能够放置多少将要被缓存对象的尺寸,这里设置为65536,通常该值小于100000或MCacheMaxObjectSize设置的值。
- MCacheMinObjectSize:单个缓存对象最小为10bytes,默认为1bytes。
- MCacheRemovalAlgorithm:清除缓存所使用的算法,默认是GDSF,还有就是LRU。
- MCacheSize:缓存数据最多使用的内存,单位是kb。默认是100Kb,这是设置为128M。
注意:配置完成后需要重启Apache才能失效。并且根据缓存的需要,可以结合基于内存和硬盘的文件缓存一起使用,只要指明不同的URL路径即可。
5、注意事项
- 要使用缓存,必须使用指令CacheEnable启用它,目前可用的类型为disk或mem,禁止缓存可以使用CacheDisable,如:CacheDisable /private。
- 带缓存的URL返回的状态值必须为:200、203、300、301或410.
- URL的请求方式必须是GET方式。
- 发送请求时,头部中包含“Authorization:”的字符串时,返回的内容将不会被缓存。
- URL包含查询字符串,如:问号?后面的东西,除非返回的内容包含“Expires:",否则不会被缓存。
- 如果返回的状态值是200,则返回的头部信息必须包含以下的一种才能被缓存:Etag、Last-Modified、Expires,除非设置了指令CacheIgnoreNoLastMod On。
- 如果返回内容的头部信息”Cache-Control:“中包含”private“,除非设置了CacheStorePrivate On,否则不会被缓存。
- 如果返回头内容的头部信息”Cache-cotrol:"中包含“no-sotre",除非设置了指令DCacheStoreNoStore On,否则不会被缓存。
- 如果返回内容的头部信息”vary“包含了”*“,不会被缓存。
6、其他一些使用技巧
①如果你的网站有几个文件的访问非常频繁而又不经常变动,则可以在 Apache 启动的时候就把它们的内容缓存到内存中(当然要启用内存缓存系统),使用的是 mod_file_cache 模块,具体如下:
有多个文件可以用空格格开 MMapFile /var/www/html/index.html /var/www/html/articles/index.html
②上面是缓存文件的内容到内存中,除此之外,还可以只缓存文件的打开句柄到内存中,当有请求进来的时候,Apache 直接从内存中获取文件的句柄,返回内容,和 MMapFile 指令很像,具体如下:
CacheFile /var/www/html/index.html /var/www/html/articles/index.html
注意:上面两个指令所缓存的文件如果有修改的话,必须重启 Apache 或使用 graceful 之类的方式强制使 Apache 更新缓存数据,否则当用户访问的时候获取的不是最新的数据。
③有时候需要根据某些特殊的头部信息来决定是否进行缓存,则可以使用如下指令:
当头部信息中包含 Set-Cookie 时则跳过不进行缓存操作 CacheIgnoreHeaders Set-Cookie
④有时候需要缓存的时候跳过 URL 中的查询字符串?使用如下指令:
CacheIgnoreQueryString On
7、更多了解
如果你想要更多了解这方面的内容,请访问:http://www.t086.com/code/apache2.2/caching.html