文档章节

高性能--web服务器缓存 (2)

小洋哥
 小洋哥
发布于 2014/06/07 04:02
字数 3073
阅读 155
收藏 0

   /**
     *
     *    关于对web服务器缓存(控制期)
     *
     *                                        
                1.web缓存对静态还是动态内容的过期检查
                可能大家对我在上一章中讲到,内容与HTTP头分开存储的, http头中  标记就是判断过期检查的其实就是建立在http协议上的


                举例PHP脚本:  如果要为一个动态内容指定有效期。
                仍然要在 Http响应头中追加Expires标记,如果你对这个动态内容不要这个动态内容缓存的话,那么最简单的办法就是让

                header("Expires: 0");

                这样web服务器就不会把这个动态内容发到缓存区
                Look下面代码:

                *
                **/


                $mod_time = $_SERVER['HTTP_IF_MODIFIED_SINCE'];


                if (strtotime($mod_time) + 20 > time()) {

                 header("HTTP/1.1  304");

                 exit();
                }

                header("Last-Modified:".gmdate("D, d M Y H:i:s")."GMT");

                header("Cache-Control: max-age=10");

                echo  time();

                /**
                *              关闭服务器磁盘缓存, 那么上面代码每到20秒才到服务器去取数据(这个代                  码应该不需要我讲吧)
                *
                *
                现在我开启服务器缓存后,这就意味着刘谦器与动态内容之间
                增加了一块缓存区
                我们现在不断刷新,其结果也刚才是一样的
                说白了就是 咱们的意思就是20后去请求原程序。

                1.Last-Modified ,如果动态内容HTTP协议的头中包含了,Last-Modified ,那么web服务器缓存区的最大默认时间就是这个


                2.配置mod_cache:(手册可见)

                cacheMaxExpire   3600

                这样 web  服务器便可以在日后与Last-Modified的时间进行比较, 判断内容是否过期

                如果动态内容中没有Last-Modified,
                处理方式就是另一个配置
                CacheIgnoreNoLastMod   如果开启那么动态内容将不会被缓存。

                如果没有last-Modified与Expires,那么缓存区就不会缓存他。

                这里有个问题,上一章我们test的时候就没这两个为啥就缓存了。这是个问题?

                其实啊CacheIgnoreNoLastMod 使用它的默认设置 ,就是关闭,缓存区就会记录当当前时间为If-Modified ,并其为最大缓存时间
                本来Apache mod_cache的配置
                CacheIgnoreNoLastMod  这东西就关闭的


                另外就是,如果有些特定的内容不需要缓存,
                比如用户登录后成功生成的包含了登录状态的Cookie,这东西肯定不能缓存涩

                就是要跳过Web缓存区,虽然我们可以采用将
                header("Expires: 0"); 让他不缓存,
                但是还有其他办法,所以这东西要看手册你才能知道的

                Mod_cache提供了:
                CacheIgnoreHeaders  Set-Cookie
                上面的意思就是 凡是要创建浏览器Cookie的内容,都可以跳过缓存区,


                其实说真的,有时候,我时候很迷糊的,
                为啥?
                有些时候程序自身实现的页面缓存(很多框架都有内置的缓存机制)有些时候其实就是多余的,

                原因很简单程序真正运行到那里去的时候,其实也走过了,浏览器缓存,
                web服务器缓存 比如反向代理缓存......  然后才会到框架还是我们自己写的缓存系统,难得你不觉得多余么?

                而且直接告诉浏览器一个 Expires就可以解决问题了。

                说起来,如果实现一个基于Http缓存机制的话,这比较错呢
                如果是基于HTTP的缓存机制,那么扩展性很好,  即使换一台服务器,
                也可以使用反向代理来快速对接。

                我说这些,其实说白了,这种缓存机制的本质就 以URL为主键的Key->value的结构缓存
                所以我们必须要保证所以缓存的动态内容都是唯一的Url,
                比如你可以根据Http请求头中标记来输出不同的内容。你也可以把一些标记放到Url参数中,保证URl的唯一性就可以
                我有时候突然发现自己想实现的东西太了,但是时间也真是不等人呢,每天都忙的半死,              
                静态内容与动态内容的缓存管理,已经完毕


                顺便再提一下缓存”文件描述符号“ 这是只是讨论一下(不要太当真的)

                开发经验比较多的朋友应该知道如果平台的的小文件过多,这样会造成IO开销比较高,
                说白了就是磁盘寻址的问题,所以web服务器一大部分的开销都花在这里的,(闲扯,Lnux上很多小工具非常的不错,里面有追踪工具(strace工具),这工具很厉害,比如我去磁盘目录中打开一个文件,这个磁盘目录中文件多的吓人。
                你用一个追踪工具可以看Open()开打文件的系统的调用情况与时间,你就会明白我说的了,
                如果有这样情况如果你的磁盘有比较好目录结构的话,
                说了吧就不要把很多小文件都放在一个目录下
                有结构分,比以年月日分 等等........

                如果是这样的目录结构打开文件,用工具看一下,效果会好很多的,但是还是很蛋疼,
                我说的流量大web平台
                )
                所以很多人会选择把类似Sesseion这些类的小文件放到Memche中,这种选择其实是很对的,但是还想说一个东西
                Apache的文件描述符号,其实来说呢,也没啥好处,但是我想提一下,

                说到这里我想先回答一个朋友的问题 再说:,

                问题:关于Apace磁盘缓存引擎与内存缓存引擎
                其实很多朋友都会想,Apache为啥官方推荐我们用磁盘缓存,不用他们的内存缓存呢?
                关于多进程下内存共享问题 的开销大,这个不说,简单来说我没看过源码,也看不了源码,
                说不了只是Apache社区上的有些开发者这么说的吧,我没有发言权利。

                但有个问题是。他们官方竟然说我这个磁盘缓存系统不比存储在内存中的慢,
                而且据说还比内存缓存快呢,这一下把我们脑海中内存比磁盘快的观念给有点打破了
                其实来说磁盘确实肯定比内存慢,这点没啥说的,
                他说了2点
                1.我们多进程共享缓冲区
                2.内存映射
                内存映射
                我想专门说一下内存映射问题,其实也就是说理论吧

                大家对Linux研究比较深的人,本人除外哈,除了喜欢看一些破书的角色而已。
                应该知道Linux内核提供一种可以访问磁盘文件的特殊方式,
                它可以将内存中地址和我们要访问的磁盘文件进行关联,
                从而把我对这块内存的访问转换为对磁盘的访问  这东西就叫内存映射技术

                我大家应该能大体明白啥子是内存映射了吧,继续:

                使用内存映射可以提高I/O的性能,他无需使用read()或者write函数等系统函数来访问文件,而是通过mmap()系统函数来建立内存与磁盘文件的关联关系,然后像访问内存一样自由的访问文件。

                同志现在明白了不,继续:

                内存映射分类:
                1.共享型
                2.私有型

                1.共享型,可以将任何对内存的写操作同步到磁盘文件中,
                多个进程都共享任意一个进程对映入内存的修改,
                这个里有个问题就是多进程安全的问题,
                其实可以简单理解为多线程安全问题类似
                一个文件被多个进程映射,那么有需要有同步机制来控制
                这里就有了开销,这样效率就低了

                2.私有性
                他映射的文件只能是读类型文件,所有不会把对内存的写操作
                同步上文件上,而且多个进程不共享修改。


                再来接受一个工具,strace 工具

                在Apache2.0以上都使用了内存的映射的,  

                比如我访问一个小的静态页面,大概200字节  Url:http:/loachost/zb/x/xs/index.html

                apache会选用使用内存映射来读取,
                用 strace 工具追踪 Apache子进程的话,你就发现问题的
                本机没有strace工具没这工具,
                但是我可以大体说一下他调用函数流程

                1. Open("/zb/x/xs/index.html",常量|常量) //打开函数
                2.mmap2(xxx); //映射函数  mmap2是对mmap()函数的扩展,原理一样
                3.writev(xxxxxxxx) ;  //这个函数主要是不把http响应头的信息与 200字节的正文合并,
                并发送到浏览器端,说白了这函数就 就是浏览器接受到Http协议的响应头与内容
                4.munmap();//撤销映射,

                子程序大体就做这几步,你可以用工具追踪一下,一追便知


                顺便再提一个东西,直接I/O这东西,其实本质上给内存映射没多大差别的

                顺便再说一个在I/O操作中,就以java来,但是点到即止哈,
                I/O操作是是不是有一个缓冲区的的概念呢 写buffer  读buffer  StringBuffer  xxxbuffer 对象呢?。
                我保证你去看一下jdk手册保证mmap都有

                其实mysql 的有个Innodb_flush_method ,可以配置innodb支持I/o直接访问的,

                跑题了,继续说 文件描述符号


                由于有大量的小文件,即调用Open系统函数,所有我们可以直接
                考虑将打开后的文件描述缓存到 web服务器内存中,
                这个只能存在本机内存中,因为他描述的是本机上的文件资源,

                Apache提供一个 扩展   mod_file_cache

                我直接贴手册上的,

                Apache模块 mod_file_cache
                说明 提供文件描述符缓存支持,从而提高Apache性能
                状态 实验(X)
                模块名 file_cache_module
                源文件 mod_file_cache.c

                他应该是处于试验阶段的,但是也可以用

                配置:  还是用上面的有Url吧

                CacheFile   /zb/x/xs/index.htm


                但是缓存文件描述符方案只适合与静态文件
                如果有对这些文件的请求,Apache将通过文件描述直接发送出去
                如果是很多的话,只是写正则模糊匹配就行了手册有

                还要重点指出的是:,
                只要配置了,Apache在启动时就会 打开这些文件
                并持续到 Apache关闭为止,有些朋友肯定想到了,如果开启Apache就意味着要打开很多文件的话,那么内存这块肯定会带来很多内存开销,
                还有就是文件更新的话,必须要重启Apache才有效哈,
                缓存文件描述符对于较大的文件来不适用,
                如果是大文件的话,消耗只会是在传送中,而不是在Open,
                听起来挺没用的噶
                我相信有些站点是可以用的,只是我还没用过吧,毕竟咱们了解他的原理,
                说不定那天还真能用呢,其实这个缓存文件描述符思想挺好的
                我建议可以ab工具测试一下配置前后差别与strace工具配合
                完结了.......................................
                *
                */






© 著作权归作者所有

共有 人打赏支持
小洋哥
粉丝 23
博文 73
码字总数 39565
作品 0
成都
程序员
私信 提问
服务器后端开发系列——《实战Nginx高性能Web服务器》

1、高性能Web服务器Nginx的配置与部署研究(1)Nginx简介及入门示例 内容:概述Nginx的背景知识和简单的入门实例。 2、高性能Web服务器Nginx的配置与部署研究(2)Nginx入门级配置与部署及“...

晨曦之光
2012/04/24
251
0
《Nginx高性能Web服务器》系列分享专栏

《Nginx高性能Web服务器》系列分享专栏 [作者:Poechant] Nginx是目前最流行的基于BSD-like协议、轻量级、高性能的HTTP服务器、反向代理服务器和电子邮件(SMTP/POP3/IMAP)服务器。CSDN的Ngi...

开元中国2015
12/01
0
0
LAMP网站架构分析

转自:http://www.williamlong.info/archives/1908.html LAMP(Linux-Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统,Apache网 络服务器,MySQL数据库,P...

长征4号
2017/07/05
0
0
认识IO的问题才能更好的设计和开发出高并发和高性能的系统

【IO的概述】 计算机中的IO,主要是本地磁盘IO和网络IO。 下面是关于IO速度的几个基本知识。 网络IO肯定是本地最快,局域网次之,跨机房、跨城市、跨运营商会变慢。 局域网的传输速度比SSD卡...

一凡Sir
05/28
0
0
Nuster 1.7.9.8 发布,高性能缓存服务器

高性能 Web 缓存服务器 nuster 1.7.9.8 已发布。本次更新主要添加根据 Host, 根据 Path 和根据正则来删除缓存的功能。 本次更新 Added Purge cache by host Purge cache by path Purge cach...

nuster
03/21
542
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 修改导航显示选项

选择 子页面(Child pages)来在边栏中查看当前页面的子页面。 选择 页面树(Page tree)来查看整个空间的页面树,扩展当前的页面。 你也可以选择是否完全隐藏导航显示选项或者添加你希望可见...

honeymose
31分钟前
0
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部