Apache模块 mod_expires

浏览器缓存时间设置

说明允许通过配置文件控制HTTP"Expires""Cache-Control"头内容

模块名expires_module

源文件mod_expires.c

例如,下列3个指令都表示文档默认的有效期是一个月:

ExpiresDefault "access plus 1 month"

ExpiresDefault "access plus 4 weeks"

ExpiresDefault "access plus 30 days"

ExpiresActive 指令

说明启用或禁用产生"Expires:""Cache-Control:"头的功能

语法ExpiresActive On|Off

作用域server config,virtual host, directory, .htaccess

覆盖项Indexes

模块mod_expires

ExpiresByType 指令

说明由MIME类型配置的Expires头的值

语法ExpiresByType MIME-type<code>seconds

作用域server config,virtual host, directory, .htaccess

覆盖项Indexes

模块mod_expires

"M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。

ExpiresDefault 指令

说明默认有效期的计算方法

语法ExpiresDefault <code>seconds

作用域server config,virtual host, directory, .htaccess

覆盖项Indexes

模块mod_expires


示例:

# 启用有效期控制

ExpiresActive On

#写入http头信息max-age=3600

header set cache-control"max-age=3600"

# GIF有效期为1个月

ExpiresByType p_w_picpath/gif A2592000

# HTML文档的有效期是最后修改时刻后的一星期

ExpiresByType text/html M604800


同时存在时谁生效?是否有先后顺序优先级?A与M的区别表象?


Gzip压缩:

所谓gzip,其实在早期的apache1.x系列版本中没有内建网页压缩技术,所以才需要去gzip压缩,apache2官方在开发的时候,就已经把网页压缩考虑进去,内建了mod_deflate模块,所以apache2就不需要使用到mod_gzip了,这两者的工作原理是类似的,还有启用mod_deflate这个网页压缩的模块,功能和效率和mod_gzip是差不多的,甚至还好一些,就不需要再用mod_gzip模块了。

Apache模块 mod_deflate

说明压缩发送给客户端的内容

状态扩展(E)

模块名deflate_module

源文件mod_deflate.c


针对少数类型压缩配置

<Directory"/your-server-root/manual">

AddOutputFilterByType DEFLATE text/html

</Directory>


<Location />

# 插入过滤器

SetOutputFilterDEFLATE

# Netscape 4.x 有一些问题...

BrowserMatch^Mozilla/4 gzip-only-text/html

# Netscape4.06-4.08 有更多的问题

BrowserMatch^Mozilla/4\.0[678] no-gzip

# MSIE 会伪装成 Netscape ,但是事实上它没有问题

BrowserMatch\bMSIE !no-gzip !gzip-only-text/html

# 不压缩图片

SetEnvIfNoCaseRequest_URI \

\.(?:gif|jpe?g|png)$no-gzip dont-vary

# 确保代理不会发送错误的内容

Headerappend Vary User-Agent env=!dont-vary

</Location>


* 不使用任何压缩: 430KB
*
仅使用 gzip: 323KB
*
仅使用 deflate 模块: 247KB



1、基于硬盘文件的缓存

基于硬盘文件存储的缓存由 mod_disk_cache 模块实现,先看个简单的配置例子:

<IfModule mod_cache.c>

CacheDefaultExpire 86400

<IfModule mod_disk_cache.c>

CacheEnable disk /

CacheRoot /tmp/apacheCache

CacheDirLevels 5

CacheDirLength 5

CacheMaxFileSize 1048576

CacheMinFileSize 10

</IfModule>

</IfModule>

把上面的配置加到 Apache 的 httpd.conf 文件中,如果缓存相关的模块都已经编译进了 Apache 的核心,则无需加载模块,直接就能使用上面的指令。指令的详细说明如下:

CacheDefaultExpire:设定缓存过期的时间(秒),默认是1小时,只有当缓存的文档没有设置过期时间或最后修改时间时这个指令才会生效

CacheEnable:启用缓存,第1个参数是缓存类弄,这里当然是 disk了,第2个参数是缓存路径,指的是 url 路径,这里是缓存所有的东西,直接写上“/”即可,如“/docs”则只缓存 /docs 下的所有文件

CacheRoot:缓存文件所在的目录,运行 Apache 的用户(如daemon 或 nobody)要能对其进行读写,如果不清楚的话可以直接设置成 777,请手动建立该目录并设置好访问权限

CacheDirLevels:缓存目录的深度,默认是3,这里设置为5

CacheDirLength:缓存目录名的字符长度,默认是4,这里设置为5

CacheMaxFileSize 和CacheMaxFileSize:缓存文件的最大值和最小值(byte),当超过这个范围时将不再缓存,这里设置为 1M 和 10bytes

基于硬盘文件存储的文件基本上就这些内容,设置好后重启 Apache 应该就能使用了。一切正常的话,可以在缓存目录下看到 Apache 自动建立的一些目录和缓存的数据文件。

2、基于内存的缓存

基于内存的缓存主要由 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>

</IfModule>

简单说一下上面一些指令的意思:

CacheEnable:启用缓存,使用基于内存的方式存储

MCacheMaxObjectCount:在内存中最多能存储缓存对象的个数,默认是1009,这里设置为20000

MCacheMaxObjectSize:单个缓存对象最大为 1M,默认是10000bytes

MCacheMaxStreamingBuffer:在缓冲区最多能够放置多少的将要被缓存对象的尺寸,这里设置为 65536,该值通常小于100000或MCacheMaxObjectSize 设置的值

MCacheMinObjectSize:单个缓存对象最小为10bytes,默认为1bytes

MCacheRemovalAlgorithm:清除缓存所使用的算法,默认是 GDSF,还有一个是LRU,可以查一下Apache 的官方文档,上面有些介绍

MCacheSize:缓存数据最多能使用的内存,单位是 kb,默认是100kb,这里设置为128M

保存重启 Apache 基于内存的缓存系统应该就能生效了,根据需要可以使基于内存的存储或硬盘文件的存储方式一起使用,只要指明不同的URL路径即可。



<IfModule prefork.c>;
serverlimit 768            serverlimit
限制
StartServers 5              
初始启动进程数
MinSpareServers 5          
最小空闲进程数
MaxSpareServers 10          
最大空闲进程数
MaxClients 384              
处理最大并发请求数
MaxRequestsPerChild 0      
单个进程处理请求数 0 为不限制
</IfModule>;

派生

稳定

消耗内存


worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。

ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:

#define DEFAULT_THREAD_LIMIT 64

#define MAX_THREAD_LIMIT 20000

  这两行对应着ThreadsPerChild和ThreadLimit的限制数。最好在configure之前就把64改成所希望的值。注意,不要把这两个值设得太高,超过系统的处理能力,从而因Apache不起动使系统很不稳定。

Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。这两个值位于源码树server/mpm/worker/worker.c中的以下两行:

#define DEFAULT_SERVER_LIMIT 16

#define MAX_SERVER_LIMIT 20000

  需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。下面是worker配置段:

<IfModule worker.c>

StartServers 3

MaxClients 2000

ServerLimit 25

MinSpareThreads 50

MaxSpareThreads 200

ThreadLimit 200

ThreadsPerChild 100

MaxRequestsPerChild 0

</IfModule>