MOD_EXPIRES安装和配置 提高网站速率

MOD_EXPIRES安装和配置 提高网站速率

实施这一方法将节省你难以置信数额的带宽,极大地加快你的网站为你的网站访客。基本上,对于图片,CSS , JavaScript以及其他文件可以通过优化更快的下载,告诉你的网站访问者快取记忆体,为他们在某一段时间内。默认的行为是每一次请求检查文件的 last-modified 和/或者 Etag headers。
所以一个用户去/home/index.html,及浏览器缓存所有图象和文件。然后用户离开网站稍后回来,与浏览器发送If-Modified-Since 有条件的GET 请求为每一个缓存的项目时,基本上看,如果文件已被改变和他们必须更新他们的缓存。

当你执行在这篇文章中所述的缓存方法,你可以指定某文件或扩展名被缓存为某一特定数额的时间。这些文件然后缓存在你的网站访客和他们不发送If-Modified-Since头直到设置的缓存时间已经到了。
#================================================= ============================#
# TIME CHEAT SHEET
#================================================= ============================#
# 300 5 M # 604800 1 W
# 2700 45 M # 1814400 3 W
# 3600 1 H # 2419200 1 M
# 54000 15 H # 14515200 6 M
# 86400 1 D # 26611200 11 M
# 518400 6 D # 29030400 1 Y (never expire)

安装mod_expires.so

1)首先找到mod_expires.c文件,进入apache解压后的目录,执行:

cd /data/software/httpd-2.0.63/

find . -name mod_expires.c

ls -l modules/metadata/mod_expires.c

2)执行apxs -i -a -c /data/software/httpd-2.0.63/modules/metadata/mod_expires.c

3)cd /usr/local/apche2.0.63/modules/ 会出现mod_expires.so

到此mod_expires安装完毕。

这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。

这些HTTP头向客户端表明了文档的有效性和持久性。如果有缓存,文档就可以从缓存(除已经过期)而不是从服务器读取。接着,客户端考察缓存中的副本,看看是否过期或者失效,以决定是否必须从服务器获得更新。

简单配置文件如下:

ExpiresActive on

ExpiresByType image/gif “access plus 12 month”

ExpiresByType image/jpeg “access plus 12 month”

### 启用 mod_expires

ExpiresActive On

### 设置 .gif 在被访问过后1个月过期。

ExpiresByType image/gif A2592000

### 其他文件设置为最后修改时间1天后过期

### (用了另外的语法)

ExpiresDefault “modification plus 1 day”

### 在index.html文件应用 Cache-Control头属性

<Files index.html>

Header append Cache-Control “public, must-revalidate”

</Files>

配置

可用的指令如下:

ExpiresActive on|off

ExpiresDefault <code><seconds>

ExpiresByType type/encoding <code><seconds>

1.其中<code>为M或者A

M => Expires Header显示文件将在此文件的修改时间+<seconds>后超时

A => Expires Header显示文件将在此文件的访问时间+<seconds>后超时

2.<seconds>必须为一整数

例如:对于每小时自动生成的文件来说可以设置1小时过期

ExpiresDefault M3600

例如:根据类型设定不同的过期时间

ExpiresByType text/html A604800        # 1周

ExpiresByType image/gif A2592000       # 一个月

ExpiresActive On|Off可以在.htaccess中设置来针对某目录进行开启|关闭。

还有更人性化一点的写法:

ExpiresDefault “<base> [plus] {<num> <type>}*”

ExpiresByTypeDefault type/encoding “<base> [plus] {<num> <type>}*”

其中

1.<base>为:

access

now    等于access

modification

2.plus是可选的

3.<num>必须为整数

4.<type>为:

years/months/weeks/days/hours/minutes/seconds

例如:要使文档在访问后一个月过期,三种写法:

ExpiresDefault “access plus 1 month”

ExpiresDefault “access plus 4 weeks”

ExpiresDeafult “access plus 30 days”

或者更细微的写法:

ExpiresByType text/html “access plus 1 month 15 days 2 hours”

ExpiresByTypes image/gif “modification plus 5 hours 3 minutes”

实现方式:

1、首先判断配置A/M或者人性话的写法也转成<code><seconds> 格式。根据A或者M来取base时间

1)如果是M,base时间为r->finfo.mtime(即文件的修改时间),如果文件不存在本地,返回(但不报错)。

2)如果是A,base时间为r->request_time.这个时间已经存在request结构中;

注意:这里的r->request_time是来自客户端的Request时刻。这样会导致2个问题:

1)客户端时间如果和服务器时间不一致的话,那么很可能我们期望的的expires效果会失去;

2)每个客户端到服务器请求文件时的request_time都不一样,那么如果设置A<seconds>,则客户端将陆陆续续的过期,如果设置 M<seconds>,那么所有的客户端都以服务器端文件的修改时间为基准,将在同一时间过期;(这特别适合于定时更新的文件,比如新闻网页),这样在过期时刻会引起巨大浪涌。

2、根据配置中的seconds得到addtional时间;

3、过期时间expires = base + additional;

4、生成Cache-Control:max-age头(Header),max-age=expires – t->request_time;

ps:其实这里有点多余?

expires = base + additional

base = r->request_time

max-age = expires – t->request_time = (base + additional) – r->request_time = addtional

但是这是错误的。因为过期时间的从r->request_time算起到expires时间结束。如果设置为M那么max-age就不等于addtional。

比如:文件在3小时前修改到现在未动,现在设置M3600,那么max-age=expires-r->request_time = -7200

实际上我们可以看到这样的例子:

5、将expires时间转换成GMT格式,生成Expires头,Expires的值为expires时间的GMT格式。(arp_table_setn()函数)

当Apache返回Response后,我们可以看到同时设置了Cache-Control和Expires头:

注意:返回的头包括它们的值我们都可以在源代码里面修改(这里我已经修改),但是如果不如何HTTP1.1的标准也是没用的。

Appendix:关于HTTP 1.1 Cache

1、当访问一个静态文件后,IE会在本地缓存此文件,如果按Enter,会看到(Cache),表示文件是本地缓存的;

2、如果按F5(不是Ctrl+F5),IE重新发起请求到Web Server,如果没有过期,Web Server返回304:

“GET /index.html HTTP/1.1″ 304 – “-”

Apache会有这种日志。说明Apache接受了请求, 但是除了发生头部外,没传送任何字节:

这里最后一个字段:%b => 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-‘而不是0

如果要减轻backend Server的压力,不要Backed Server接受到任何无用的请求(304),那么在Backend Server前端设置Squid Server,由Squid来返回304.而不到后端Server进行验证而带来大量304请求。

3、Ctrl+F5则相当于一次新的请求,返回码200。

后记:废除mod_expires?

我们看到mod_expires无非就是为我们新增了2个Http Response Header,Apache里面已经有Header指令:

Header add “Expires” “Mon, 28 Jul 2099 23:30:00 GMT”

Header add “Cache-Control” “max-age=31536000″   # 1年

Header add “Cache-Control” “post-check=31536000″

Header add “Cache-Control” “pre-check=31536000″

这样完全可以替代mod_expires.c

注:

1.不论是否有mod_expires,用IE去访问,都会有缓存,而且和有mod_expires的效果一样,既然如此还有安装mod_expires的必要???

2.增加mod_expires前后的差别:安装httpwatch后,看请求的header,发现安装mod之后增加Expires和Cache-Control,

#================================================= ============================#
# TIME CHEAT SHEET
#================================================= ============================#
# 300 5 M # 604800 1 W
# 2700 45 M # 1814400 3 W
# 3600 1 H # 2419200 1 M
# 54000 15 H # 14515200 6 M
# 86400 1 D # 26611200 11 M
# 518400 6 D # 29030400 1 Y (never expire)

mod_expires 模块的主要作用是自动生成页面头部信息中的 Expires 标签和 Cache-Control 标签,从而降低客户端的访问频率和次数,达到减少不必要流量和增加访问速度的目的。

mod_expires 是 apache 众多模块中配置比较简单的一个,它一共只有三条指令:

ExpiresActive
ExpiresByType
ExpiresDefault
ExpiresActive 指令:打开或关闭产生”Expires:”和”Cache-Control:”头的功能。

ExpiresByType 指令:指定MIME类型的文档(例如:text/html)的过期时间。
ExpiresDefault 指令:默认所有文档的过期时间。

过期时间的写法:

“access plus 1 month”
“access plus 4 weeks”
“now plus 30 days”
“modification plus 5 hours 3 minutes”
A2592000
M604800
access、now及A 三种写法的意义相同,指过期时间从访问时开始计算。
modification及M 的意义相同,指过期时间是以被访问文件的最后修改时间开始计算。
所以,后一种写法只对静态文件起作用,而由脚本生成的动态页面不受它的作用。
如下:
第一个解决办法是Apache模块mod_expires 1.3 2.0 2.2
ExpiresActive On
ExpiresDefault A300
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A2592000
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A604800
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A300
第二个解决办法是mod_headers 1.3 2.0 2.2
# YEAR
<FilesMatch “\.(flv|gif|ico)$”>
Header set Cache-Control “max-age=2592000″
</FilesMatch>
# WEEK
<FilesMatch “\.(pdf|swf|js|css)$”>
Header set Cache-Control “max-age=604800″
</FilesMatch>
# NEVER CACHE
<FilesMatch “\.(html|cgi|php|htm)$”>
Header set Expires “Thu, 01 Dec 2003 16:00:00 GMT”
Header set Cache-Control “no-store, no-cache, must-revalidate”
Header set Pragma “no-cache”
</FilesMatch>
注:用filesmatch和files在htaccess文件
这里是Headers当下载一个JPEG图像的时候,
这个缓存方案实施后和没有缓存时的效果。
JPEG 没有缓存的时
Last-Modified: Wed, 22 Feb 2006 12:16:56 GMT
ETag: “b57d54-45e7″
Accept-Ranges: bytes
Content-Length: 17895
Connection: close
Content-Type: image/jpeg
缓存过的
Cache-Control: max-age=2592000
Expires: Tue, 28 Mar 2006 16:23:52 GMT
Last-Modified: Wed, 22 Feb 2006 12:16:56 GMT
ETag: “b57d54″
Accept-Ranges: bytes
Content-Length: 17895
Connection: close
Content-Type: image/jpeg
Content-Language: en
附:
apache配置文件例子:
example 1
# htm files are php
AddHandler application/x-httpd-php .php .htm
# setup errordocuments to local php file
ErrorDocument 404 /cgi-bin/error.htm
ErrorDocument 403 /cgi-bin/error.htm
ErrorDocument 500 /cgi-bin/error.htm
# Turn on Expires and set default expires to 3 days
ExpiresActive On
ExpiresDefault A259200
# Set up caching on media files for 1 month
<FilesMatch “\.(ico|gif|jpg|jpeg|png|flv|pdf|swf|mov|mp3|wmv|pp t)$”>
ExpiresDefault A2419200
Header append Cache-Control “public”
</FilesMatch>
# Set up 2 Hour caching on commonly updated files
<FilesMatch “\.(xml|txt|html|js|css)$”>
ExpiresDefault A7200
Header append Cache-Control “private, must-revalidate”
</FilesMatch>
# Force no caching for dynamic files
<FilesMatch “\.(php|cgi|pl|htm)$”>
ExpiresDefault A0
Header set Cache-Control “no-store, no-cache, must-revalidate, max-age=0″
Header set Pragma “no-cache”
</FilesMatch>
example 2
# htm files are php
AddHandler application/x-httpd-php .php .htm
# setup errordocuments to local php file
ErrorDocument 404 /cgi-bin/error.htm
ErrorDocument 403 /cgi-bin/error.htm
ErrorDocument 500 /cgi-bin/error.htm
# Turn on Expires and set default to 0
ExpiresActive On
ExpiresDefault A0
# Set up caching on media files for 1 year (forever?)
<FilesMatch “\.(ico|flv|pdf|mov|mp3|wmv|ppt)$”>
ExpiresDefault A29030400
Header append Cache-Control “public”
</FilesMatch>
# Set up caching on media files for 1 week
<FilesMatch “\.(gif|jpg|jpeg|png|swf)$”>
ExpiresDefault A604800
Header append Cache-Control “public, proxy-revalidate”
</FilesMatch>
# Set up 2 Hour caching on commonly updated files
<FilesMatch “\.(xml|txt|html|js|css)$”>
ExpiresDefault A7200
Header append Cache-Control “private, proxy-revalidate, must-revalidate”
</FilesMatch>
# Force no caching for dynamic files
<FilesMatch “\.(php|cgi|pl|htm)$”>
ExpiresDefault A0
Header set Cache-Control “no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform”
Header set Pragma “no-cache”
</FilesMatch>

需要提醒您的是,经过Expires处理的URL地址,可以被浏览器及代理服务器缓存,请只在需要的地方使用。

时间: 2025-01-08 13:03:32

MOD_EXPIRES安装和配置 提高网站速率的相关文章

win7下IIS安装与配置运行网站

1.打开控制面板,点击程序和功能: 2.点击打开或关闭Windows功能进行安装: 3.等待进入安装界面,需要几十秒左右: 4.找到Internet信息服务,将Web管理工具和万维网服务所有勾上,然后点确定,安装需要几分钟时间: 5.IIS成功安装后打开控制面板下的管理工具: 6.双击“Internet 信息服务(IIS)管理器”进去设置: 7.在网站处右键点添加网站: 8.输入网站名称,物理路:径为指定网站发布的路径,IP地址(I):选本机的IP地址或全部未分配,最后点确定,注意:端口不要改,

PHP提高网站性能的一些方法

前段时间面试问到了这个问题,回答的不是很全面,就去问了度娘,得到了一些比较全的答案,由于出处较多就没法确定原文出处了.下面是分享的答案. 一.大型网站性能提高策略: 大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器.高性能的数据库.高效率的编程语言.还有高性能的Web容器.这几个解决思路在一定程度上意味着更大的投入. web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如Jav

Nginx入门--安装和配置

Nginx简介 nginx是一款由俄罗斯程序设计师Lgor Sysoev开发的高性能HTTP和反向代理服务器软件.它可以运行在UNIX.GNU/Linux.BSD以及Microsoft等操作系统中轻量级的服务器软件,目前世界排名第三,第一占据大部分的市场份额的是apache,第二的是微软公司的IIS站的比重大约是23%.nginx自开发出来04年公布出来市场份额逐年上升,到今年年底已经达到14%左右,所拥有的功能是前两者所没有的,估计占据市场份额还要不断增大,因此好好学习一下这个流行的服务器软件

Linux学习之CentOS--CentOS6.4下Mysql数据库的安装与配置【转】

如果要在Linux上做j2ee开发,首先得搭建好j2ee的开发环境,包括了jdk.tomcat.eclipse的安装(这个在之前的一篇随笔中已经有详细讲解了Linux学习之CentOS(七)--CentOS下j2ee环境搭建),如果要开发web项目,我们当然可以安装一个myeclipse到Linux系统上去,这个安装方法和安装eclipse完全相同,就没有记录下来了,有了jdk.tomcat.eclipse我们就已经能进行我们的程序开发了,但是如果要做一个项目,哪怕是小的不能再小的项目都离不开数

90后90网论坛量大从优 虚拟化基础架构Windows 2008篇之11-WSUS服务器的安装与配置

无论是数据中心还是在企业网络中,大多数Windows操作系统都要及时地更新补丁.对于家庭用户来说,或者对于大多数的企业用户来说,习惯于从Windows Update站点在线升级,或者使用第三方的工具(例如360)从Microsoft站点下载升级(360本身不提供补丁及镜像).但是,当网络中的服务器及工作站数量较多,并且产品较多时,都从Microsoft网站升级,一是速度慢,二是会占用大量的互联网带宽.另外,尤其是在云计算的数据中心,配置新的虚拟服务器是很简单.容易的事情,例如配置一台虚拟机只需要

nginx安装及配置详解

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日.其将源代码以类BSD许可证的形式发布,因它的稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名.2011年6月1日,nginx 1.0.4发布. 依赖: yum groupinstall "Developmen

CentOS安装与配置LNMP

本文PDF文档下载:http://www.coderblog.cn/doc/Install_and_config_LNMP_under_CentOS.pdf 本文EPUB文档下载:http://www.coderblog.cn/doc/Install_and_config_LNMP_under_CentOS.epub 原文链接:http://www.coderblog.cn/article/36/ CentOS安装与配置LNMP(1):Nginx安装与常用命令 Nginx是一个轻量级的HTTP服

Linux CentOS下安装、配置mysql数据库

如果要在Linux上做j2ee开发,首先得搭建好j2ee的开发环境,包括了jdk.tomcat.eclipse的安装(这个在之前的一篇随笔中已经有详细讲解了Linux学习之CentOS(七)--CentOS下j2ee环境搭建),如果要开发web项目,我们当然可以安装一个myeclipse到Linux系统上去,这个安装方法和安装eclipse完全相同,就没有记录下来了,有了jdk.tomcat.eclipse我们就已经能进行我们的程序开发了,但是如果要做一个项目,哪怕是小的不能再小的项目都离不开数

LVS+Nginx(LVS + Keepalived + Nginx安装及配置)

(也可以每个nginx都挂在上所有的应用服务器) nginx大家都在用,估计也很熟悉了,在做负载均衡时很好用,安装简单.配置简单.相关材料也特别多. lvs是国内的章文嵩博士的大作,比nginx被广泛接受还要早7年,并且已经被红帽作为了系统内置软件,可谓很牛了.lvs相对于nginx来说配置上就要相对复杂一些. 但是,有时候我们会看到大牛们分享的经验里面是lvs+nginx作为负载均衡了,一直想不明白这是个什么道理. 为什么会出现两者被同时使用呢?其实,这要从两者的各自优势来说了. nginx用