Apache 服务器提供了一系列缓存功能,旨在以各种方式提高服务器的性能。很多时候,在一段时间内,一个 URL 对应一个唯一的响应内容,比如静态内容或更新不频繁的动态内容,如果将最终内容缓存起来,下次 Web 服务器接收到请求后可以直接将响应内容返回给浏览器,从而节省大量开销。
什么可以缓存
- 必须为此URL启用缓存
- 如果响应的 HTTP 状态代码不是 200 , 203 , 300 , 301 或 410,则它还必须指定响应首部
Expires
或Cache-Control
- 请求必须是 HTTP GET 请求。
- 如果响应包含
Authorization
首部 ,则它还必须在Cache-Control
响应首部中包含s-maxage
,must-revalidate
或public
选项,否则它将不会被缓存。 - 如果 URL 包含查询字符串,则除非响应通过包含
Expires
或Cache-Control
的max-age
或s-maxage
指令指定显式过期时间,否则不会缓存它。 - 如果响应的状态为 200,则响应还必须包括
Etag
,Last-Modified
或Expires
中的至少一个,或者max-age
或s-maxage
指令。除非CacheIgnoreNoLastMod
指令设为On
。 - 如果响应在
Cache-Control
中包含private
选项,除非CacheStorePrivate
设为On
,否则不会缓存。 - 如果响应在
Cache-Control
中包含no-store
选项,除非CacheStoreNoStore
设为On
,否则不会缓存。 - 如果响应包含包含全部匹配
*
的Vary
,则不会缓存。
确定缓存有效期的规则
- 指定有效期:首先是根据
Expires
或Cache-Control
的max-age
或s-maxage
设置的有效期来确定 - 计算有效期:如果未指定有效期,则根据最后修改时间
Last-Modified
和 计算因子 CacheLastModifiedFactor,计算得来 - 默认有效期:如果没有指定最后修改时间,则采用指令 CacheDefaultExpire 的设定的默认有效期
- 有效期的最大值和最小值限制:
CacheMaxExpire |
CacheMinExpire |
|
---|---|---|
指定的有效期 | 受限 | 不受限 |
计算的有效期 | 受限 | 受限 |
默认有效期 | 不受限 | 不受限 |
缓存处理器
cache_module
模块作为Apache的缓存处理器,提供了一系列指令来控制缓存的行为。
cache_module
模块依赖于特定的实现了缓存管理的模块:磁盘缓存模块 cache_disk_module
和内存缓存模块 cache_socache_module
CacheDisable
描述: 禁用缓存的url
语法: CacheDisable url-string|On
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
状态: Extension
模块: mod_cache
设置为On
表示禁用整个缓存,往往用在配置片段中,禁用符合配置片段条件的所有url的缓存。
CacheEnable
描述: 使用指定的存储管理器启用指定URL的缓存
语法: CacheEnable caceh-type [url-string]
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段
状态: Extension
模块: mod_cache
# Cache /foo下的url
<Location "/foo">
CacheEnable disk
</Location>
# 缓存以foo结束的url
CacheQuickHandler off
<LocationMatch "foo$">
CacheEnable disk
</LocationMatch>
# 缓存所有url
CacheEnable disk /
# ftp协议的url
CacheEnable disk ftp://
# 缓存特定主机(含协议、端口)的url
CacheEnable disk http://www.example.org/
#通过socache调用内存缓存程序,缓存到内存
CacheEnable socache
CacheIgnoreCacheControl
描述: 忽略不向客户端提供缓存内容的请求
语法: CacheIgnoreCacheControl On|Off
语境: 系统配置文件, <VirtualHost>
片段
默认: CacheIgnoreCacheControl Off
状态: Extension
模块: mod_cache
- 默认设为
Off
时,对于包含Cache-Control:no-cache
或Pragma:no-cache
首部的请求,不会从缓存中提供。 - 设为
On
时,即使请求包含no-cache
首部,也会尝试从缓存中提供资源。
CacheIgnoreQueryString
描述: 忽略查询字符串
语法: CacheIgnoreQueryString On|Off
语境: 系统配置文件, <VirtualHost>
片段
默认: CacheIgnoreQueryString Off
状态: Extension
模块: mod_cache
- 默认设为
Off
时,具有查询字符串参数的请求将针对每个唯一查询字符串单独缓存。 - 设为
On
时,针对对不同的查询字符串,只有一份缓存。请求被视为没有查询字符串。
CacheIgnoreNoLastMod
描述: 忽略响应没有 Last Modified
首部的事实
语法: CacheIgnoreNoLastMod On|Off
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheIgnoreNoLastMod Off
状态: Extension
模块: mod_cache
- 默认设为
Off
时,不缓存没有上次修改日期的文档。 - 设为
On
时,即使没有最后修改日期,也应考虑对没有最后修改日期的文档进行缓存。如果文档未提供最后修改日期或到期日期,则CacheDefaultExpire
指令指定的值 将用于生成到期日期。
CacheLastModifiedFactor
描述: 用于根据 LastModified
日期计算到期日的因子。
语法: CacheLastModifiedFactor float
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheLastModifiedFactor 0.1
状态: Extension
模块: mod_cache
如果文档未提供到期日期但提供最后修改日期,则可以根据自上次修改文档的时间来计算到期日。计算方法: 例如,如果文件是在 10 小时前最后修改的, 因子是 0.1,那么到期时间将设置为 10 * 0.1 = 1 小时。如果当前时间是下午 3:00,那么计算的到期日期将是下午 3:00 + 1 小时 = 下午 4:00。如果计算后的到期时间长于 CacheMaxExpire
设定的时间 ,那么后者优先
CacheDefaultExpire
描述: 未指定到期日期时缓存文档的默认持续时间
语法: CacheDefaultExpire Seconds
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheDefaultExpire 3600
状态: Extension
模块: mod_cache
如果文档未提供最后修改日期或到期日期,则 CacheDefaultExpire
指令指定的值 将用于生成到期日期。CacheMaxExpire
设置的值不会覆盖 CacheDefaultExpire
。
CacheMaxExpire
描述: 缓存文档的最长有效期
语法: CacheMaxExpire seconds
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheMaxExpire 86400
状态: Extension
模块: mod_cache
文档最多会在这个秒数内过时。即使文档提供了失效日期,也会强制执行此最大值。
CacheMinExpire
描述: 缓存文档的最短有效期
语法: CacheMinExpire seconds
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheMinExpire 0
状态: Extension
模块: mod_cache
仅在文档未提供有效过期时间时使用才使用此选项。
CacheQuickHandler
描述: 控制是否从快速处理程序运行缓存
语法: CacheQuickHandler On|Off
语境: 系统配置文件, <VirtualHost>
片段
默认: CacheQuickHandler On
状态: Extension
模块: mod_cache
该指令控制处理缓存的阶段:
- 设置为
On
时,缓存在快速处理程序阶段运行。此阶段是服务器的最高性能操作模式,会绕过大多数服务器处理过程,比如权限验证等。 - 设为
Off
时,缓存作为普通处理程序运行,并在处理服务器请求时受到完整的审核,因此此模式比默认模式慢。
磁盘缓存
cache_disk_module
模块实现基于磁盘缓存的存储管理器,通过模块提供的指令控制缓存的位置、行为。
CacheDirLength
描述: 子目录名称中的字符数
语法: CacheDirLength length
语境: 系统配置文件, <VirtualHost>
片段
默认: CacheDirLength 2
状态: Extension
模块: mod_cache_disk
CacheDirLevels
描述: 缓存中子目录的级别数
语法: CacheDirLevels levels
语境: 系统配置文件, <VirtualHost>
片段
默认: CacheDirLevels 2
状态: Extension
模块: mod_cache_disk
CacheMaxFileSize
描述: 要放入缓存中的文档的最大大小
语法: CacheMaxFileSize bytes
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheMaxFileSize 1000000
状态: Extension
模块: mod_cache_disk
CacheMinFileSize
描述: 要放入缓存中的文档的最小大小
语法: CacheMinFileSize bytes
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheMinFileSize 1
状态: Extension
模块: mod_cache_disk
CacheRoot
描述: 存储缓存文件的目录根目录
语法: CacheRoot directory
语境: 系统配置文件, <VirtualHost>
片段
状态: Extension
模块: mod_cache_disk
内存缓存
cache_socache_module
模块实现基于共享对象缓存的存储管理器,通过模块提供的指令控制缓存的位置、行为。
CacheSocache
描述: 要使用的实现共享对象缓存的模块
语法: CacheSocache type[:args]
语境: 系统配置文件, <VirtualHost>
片段
状态: Extension
模块: mod_cache_socache
定义要使用的实现共享对象缓存的模块的名称,后跟该模块的可选参数。已实现共享对象高速缓存的模块有:
- dbm (mod_socache_dbm)
- dc (mod_socache_dc)
- memcache (mod_socache_memcache)
- shmcb (mod_socache_shmcb)
CacheSocache memcache:mem1.example.com:11211,mem2.example.com:11212
CacheSocacheMaxSize
描述: 要放入缓存中的条目的最大大小(以字节为单位)
语法: CacheSocacheMaxSize bytes
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheSocacheMaxSize 102400
状态: Extension
模块: mod_cache_socache
mod_cache_socache模块将仅尝试缓存具有明确内容长度的响应,或者足够小以便一次写入的响应。这样做是为了让 mod_cache_disk模块有机会缓存大于mod_cache_socache模块可缓存的响应。
CacheSocacheMaxTime
描述: 文档放入缓存的最长时间(以秒为单位)
语法: CacheSocacheMaxTime seconds
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheSocacheMaxTime 86400
状态: Extension
模块: mod_cache_socache
设置文档存储在缓存中的最大生命周期(以秒为单位)。此值将覆盖HTTP协议为文档定义的新鲜度生命周期。
CacheSocacheMinTime
描述: 设置文档在共享对象缓存中缓存的超出响应的有效期之外的秒数
语法: CacheSocacheMinTime seconds
语境: 系统配置文件, <VirtualHost>
片段, <Directory>
片段,.htaccess
默认: CacheSocacheMinTime 600
状态: Extension
模块: mod_cache_socache
设置文档在共享对象缓存中的有效期为超出文档本身的有效期之后的秒数。如果文档仅在其有效期中存储,则没有机会重新验证文档以使其再次有效。
疑问: cgi模式的PHP动态页面即使指定了过期时间也不会被缓存