如何在Ubuntu14.04上配置Apache内容缓存
什么是缓存?
缓存是一种提高服务器性能的方法,它允许以允许更快访问的方式临时存储常用请求的内容。 这通过减少一些资源密集型操作来加速处理和交付。
通过创建有效的缓存规则,将存储适合缓存的内容,以缩短响应时间、节省资源并最小化负载。 Apache 提供了多种适合加速不同类型操作的缓存。 在本指南中,我们将讨论如何使用各种缓存模块在 Ubuntu 14.04 上配置 Apache 2.4。
要了解有关开发通用缓存策略的更多信息,请查看 这篇文章 。
Apache 中的缓存简介
Apache 可以缓存具有不同程度的复杂性和可扩展性的内容。 该项目根据缓存内容的方法将它们分为三组。 大体分类如下:
- 文件缓存:最基本的缓存策略,它只是在服务器启动时打开文件或文件描述符并保持它们可用以加快访问速度。
- Key-Value Caching:主要用于SSL和身份验证缓存,key-value缓存使用共享对象模型,可以存储重复计算成本高的项目。
- 标准HTTP缓存:最灵活和普遍有用的缓存机制,这种三态系统可以存储响应并在响应过期时对其进行验证。 这可以根据您的特定需求配置为性能或灵活性。
快速浏览以上描述可能会发现上述方法有一些重叠,但同时使用多个策略可能会有所帮助。 例如,为您的 SSL 会话使用键值存储并为响应启用标准 HTTP 缓存可以让您减轻数据源的大量负载并加快客户端的许多内容交付操作。
现在您已经对 Apache 的每个缓存机制有了广泛的了解,让我们更详细地了解这些系统。
文件缓存
总体概述
- 涉及的主要模块:
mod_file_cache
- 主要用例:服务器启动时存储文件内容或文件描述符。 这些是静态表示,在重新启动服务器之前无法可靠地更改。
- Features:简单,提高慢文件系统的性能
- 缺点:实验性功能,不响应文件系统上的更新,必须谨慎使用以适应操作系统的限制,只能用于静态文件
细节
mod_file_cache
模块主要用于加速文件系统慢的服务器上的文件访问。 它提供了两个配置指令的选择,这两个指令都旨在通过在服务器启动时而不是在请求文件时执行一些工作来加速提供静态文件的过程。
CacheFile
指令用于指定磁盘上您希望加速访问的文件的路径。 当 Apache 启动时,Apache 将打开指定的静态文件并缓存文件句柄,避免在请求时打开文件。 可以通过这种方式打开的文件数量取决于您的操作系统设置的限制。
MMapFile
指令也会在 Apache 首次启动时打开文件。 但是,MMapFile
将文件的内容缓存在内存中,而不仅仅是文件处理程序。 这可以提高这些页面的性能,但它有一些严重的限制。 它不会记录已使用的内存量,因此可能会耗尽内存。 另请注意,子进程将复制任何分配的内存,这可能导致资源耗尽比您最初预期的更快。 仅谨慎使用此指令。
这些指令仅在 Apache 启动时进行评估。 这意味着您不能依赖 Apache 来获取启动后所做的更改。 仅在 Apache 会话的生命周期内不会更改的静态文件上使用这些。 根据文件的修改方式,服务器可能会收到更改通知,但这不是预期的行为,并且不会始终正常工作。 如果必须对传递给这些指令的文件进行更改,请在进行更改后重新启动 Apache。
如何启用文件缓存
文件缓存由 mod_file_cache
模块提供。 要使用此功能,您需要启用该模块。
运行 Ubuntu 14.04 时,将安装该模块,但在安装 Apache 时将禁用该模块。 您可以通过键入以下内容启用该模块:
sudo a2enmod file_cache
之后,您应该编辑主配置文件以设置文件缓存指令。 通过键入以下内容打开文件:
sudo nano /etc/apache2/apache2.conf
要设置文件句柄缓存,请使用 CacheFile
指令。 该指令采用文件路径列表,以空格分隔,如下所示:
/etc/apache2/apache2.conf
CacheFile /var/www/html/index.html /var/www/html/somefile.index
当服务器重新启动时,Apache 将打开列出的文件并将它们的文件句柄存储在缓存中以便更快地访问。
相反,如果您希望将一些文件直接映射到内存中,则可以使用 MMapFile
指令。 它的语法与最后一个指令基本相同,因为它只接受一个文件路径列表:
/etc/apache2/apache2.conf
MMapFile /var/www/html/index.html /var/www/html/somefile.index
实际上,没有理由为同一组文件配置 both CacheFile
和 MMapFile
,但您可以在不同的文件组上同时使用这两个文件。
完成后,您可以保存并关闭文件。 通过键入以下内容检查配置文件语法:
sudo apachectl configtest
如果最后一行显示 Syntax OK
,您可以安全地重新启动 Apache 实例:
sudo service apache2 restart
Apache 将重新启动,根据您使用的指令缓存文件内容或处理程序。
键值缓存
总体概述
- 涉及的主要模块:
mod_socache_dbm
、mod_socache_dc
、mod_socache_memcache
、mod_socache_shmcb
- 涉及的支持模块:
mod_authn_socache
、mod_ssl
- 主要用例:存储SSL会话或认证细节,SSL装订
- 特点:共享对象缓存存储复杂资源,可以辅助SSL会话缓存和装订,灵活的后端
- 缺点:没有验证机制,需要配置单独的软件以获得更高性能/更灵活的后端,代码中的一些错误
细节
键值缓存比文件缓存更复杂,并且具有更集中的好处。 也称为共享对象缓存,Apache 的键值缓存主要用于避免重复设置客户端对内容的访问所涉及的昂贵操作,而不是内容本身。 具体来说,它可用于缓存身份验证详细信息、SSL 会话并提供 SSL 装订。
笔记
目前,every 共享对象缓存提供程序存在一些问题。 下面将概述对这些问题的参考。 在评估是否启用此功能时,请考虑这些因素。
实际的缓存是通过使用共享对象缓存提供程序模块之一来完成的。 这些都是:
- mod_socache_dbm:这个后端使用简单的
dbm
数据库引擎,它是一个基于文件的键值存储,利用散列和固定大小的桶。 此提供程序存在一些内存泄漏,因此在大多数情况下,建议使用mod_socache_shmcb
代替。 - mod_socache_dc:此提供程序使用 distcache 会话缓存软件。 该项目自 2004 年以来没有更新,甚至没有为某些发行版打包,因此请谨慎使用。
- mod_socache_memcache:这使用memcache分布式内存对象缓存来存储项目。 这是在多个服务器之间进行分布式缓存的最佳选择。 目前,它没有正确地使条目过期,但是 patch 已提交到 Apache 版本控制的主干以修复该问题。
- mod_socache_shmcb:目前,这是键值缓存的最佳选择。 这缓存到共享内存中的循环缓冲区,当它变满时它将删除条目。 它目前在大小超过 11k 的 条目上阻塞。
除上述提供程序模块外,还需要其他模块,具体取决于缓存的对象。 例如,要缓存 SSL 会话或配置 SSL 装订,必须启用 mod_ssl
,这将分别提供 SSLSessionCache
和 SSLStaplingCache
指令。 同样,要设置身份验证缓存,必须启用 mod_authn_socache
模块,以便可以设置 AuthnCacheSOCache
指令。
如何启用键值缓存
考虑到上述错误和注意事项,如果您仍希望在 Apache 中配置这种类型的缓存,请按照以下说明进行操作。
用于设置键值缓存的方法将取决于它的用途以及您使用的提供程序。 我们将在下面介绍身份验证缓存和 SSL 会话缓存的基础知识。
目前,存在 身份验证缓存 的错误,它阻止将参数传递给缓存提供程序。 因此,任何不提供默认设置的提供商都会遇到问题。
身份验证缓存
如果您使用昂贵的身份验证方法(例如 LDAP 或数据库身份验证),身份验证缓存很有用。 如果每次发出身份验证请求时都必须命中后端,则这些类型的操作会对性能产生重大影响。
设置缓存涉及修改您现有的身份验证配置(我们不会在本指南中介绍如何设置身份验证)。 无论后端身份验证方法如何,修改本身都将大致相同。 我们将使用 mod_socache_shmcb
进行演示。
首先,通过键入以下命令启用 authn_socache
模块和 mod_socache_shmcb
提供程序模块:
sudo a2enmod authn_socache sudo a2enmod socache_shmcb
打开您的主 Apache 配置文件,以便您可以指定此共享缓存后端以用于身份验证:
sudo nano /etc/apache2/apache2.conf
在里面,靠近文件的顶部,添加 AuthnCacheSOCache
指令。 指定应将 shmcb
用作提供程序。 如果之前讨论的阻止选项传递的错误在您阅读本文时已修复,您可以指定缓存的位置和大小。 该数字以字节为单位,因此注释示例将产生 512 KB 的缓存:
/etc/apache2/apache2.conf
AuthnCacheSOCache shmcb # If the bug preventing passed arguments to the provider gets fixed, # you can customize the location and size like this #AuthnCacheSOCache shmcb:${APACHE_RUN_DIR}/auth_cache(512000)
完成后保存并关闭文件。
接下来,打开配置了身份验证的虚拟主机配置页面。 我们假设您使用的是 000-default.conf
虚拟主机配置,但您应该修改它以反映您的环境:
sudo nano /etc/apache2/sites-enabled/000-default.conf
在您配置身份验证的位置,修改块以添加缓存。 具体来说,你需要添加 AuthnCacheProvideFor
告诉它要缓存哪些认证源,使用 AuthnCacheTimeout
添加缓存超时,并将 socache
添加到 AuthBasicProvider
列在您的传统身份验证方法之前。 结果将如下所示:
/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> . . . <Directory /var/www/html/private> AuthType Basic AuthName "Restricted Files" AuthBasicProvider socache file AuthUserFile /etc/apache2/.htpasswd AuthnCacheProvideFor file AuthnCacheTimeout 300 Require valid-user </Directory> </VirtualHost>
上面的示例是用于文件身份验证的,它可能不会从缓存中受益很多。 但是,在使用其他身份验证方法时,实现应该非常相似。 唯一的实质性区别是上述示例中“文件”规范的位置,将使用其他身份验证方法。
保存并关闭文件。 重新启动 Apache 以实现您的缓存更改:
sudo service apache2 restart
SSL 会话缓存
为建立 SSL 连接而必须执行的握手会带来大量开销。 因此,缓存会话数据以避免进一步请求的此初始化步骤可能会规避此损失。 共享对象缓存是一个完美的地方。
如果您已经为 Apache 服务器配置了 SSL,将启用 mod_ssl
。 在 Ubuntu 上,这意味着 ssl.conf
文件已移动到 /etc/apache2/mods-enabled
目录。 这实际上已经设置了缓存。 在里面,你会看到一些像这样的行:
/etc/apache2/mods-enabled/ssl.conf
. . . SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000) SSLSessionCacheTimeout 300 . . .
这实际上足以设置会话缓存。 要对此进行测试,您可以使用 OpenSSL 的连接客户端。 类型:
openssl s_client -connect 127.0.0.1:443 -reconnect -no_ticket | grep Session-ID
如果所有结果中的会话 ID 都相同,则您的会话缓存工作正常。 按 CTRL-C 退出回到终端。
标准 HTTP 缓存
总体概述
- 涉及的主要模块:
mod_cache
- 涉及的支持模块:
mod_cache_disk
、mod_cache_socache
- 主要用例:缓存通用内容
- 功能:可以正确解释 HTTP 缓存标头,可以重新验证过时的条目,可以根据您的需要部署以获得最大速度或灵活性
- Drawbacks:如果配置不正确会泄露敏感数据,必须使用额外的模块来正确设置缓存策略
细节
HTTP 协议鼓励并提供沿内容传递路径缓存响应的机制。 任何接触内容的计算机都可能将每个项目缓存一段时间,具体取决于内容来源处规定的缓存策略和计算机自己的缓存规则。
Apache HTTP 缓存机制根据它看到的 HTTP 缓存策略缓存响应。 这是一个通用的缓存系统,它遵循与任何参与交付的中间服务器相同的规则。 这使得这个系统非常灵活和强大,并允许您利用您应该已经在您的内容上设置的标题(我们将在下面介绍如何执行此操作)。
Apache 的 HTTP 缓存也称为“三态”缓存。 这是因为它存储的内容可能处于三种状态之一。 它可以是新鲜的,这意味着它可以在没有进一步检查的情况下提供给客户端,它可以是陈旧的,这意味着内容的 TTL 已过期,或者如果在缓存中找不到内容,则它可能不存在.
如果内容变得陈旧,则在下一次请求时,缓存可以通过检查源处的内容来重新验证它。 如果它没有改变,它可以重置新鲜日期并提供当前内容。 否则,它会获取更改的内容并将其存储在其缓存策略允许的时间长度内。
模块概述
HTTP 缓存逻辑可通过 mod_cache
模块获得。 实际的缓存是由缓存提供程序之一完成的。 通常,缓存使用 mod_cache_disk
模块存储在磁盘上,但共享对象缓存也可通过 mod_cache_socache
模块获得。
mod_cache_disk
模块缓存在磁盘上,因此如果您从远程位置代理内容、从动态过程生成内容,或者只是尝试通过缓存在比您的内容更快的磁盘上来加快速度,它会很有用通常驻留在。 这是经过最充分测试的提供商,在大多数情况下可能应该是您的首选。 缓存不会自动清理,因此必须偶尔运行一个名为 htcacheclean
的工具来精简缓存。 这可以手动运行,设置为常规 cron
作业,或作为守护程序运行。
mod_cache_socache
模块缓存到共享对象提供者之一(与上一节中讨论的相同)。 这可能比 mod_cache_disk
具有更好的性能(取决于选择的共享缓存提供程序)。 但是,它要新得多,并且依赖于共享对象提供程序,这些提供程序存在前面讨论的错误。 建议在实施 mod_cache_socache
选项之前进行全面测试。
HTTP 缓存放置
Apache 的 HTTP 缓存可以根据您的需要以两种不同的配置进行部署。
如果 CacheQuickHandler
设置为“on”,缓存将在请求处理过程的早期检查。 如果找到内容,将直接提供内容,无需任何进一步处理。 这意味着它非常快,但也意味着它不允许像内容认证这样的过程。 如果缓存中的内容通常需要身份验证或访问控制,如果 CacheQuickHandler
设置为“on”,则 anyone 无需身份验证即可访问该内容。
基本上,这会在您的 Web 服务器前模拟一个单独的缓存。 如果您的 Web 服务器需要进行任何类型的条件检查、身份验证或授权,则不会发生这种情况。 Apache 甚至不会评估 <Location>
或 <Directory>
块中的指令。 注意 CacheQuickHandler
被 default 设置为“on”!
如果 CacheQuickHandler
设置为“关闭”,缓存将在请求处理序列的后期进行显着检查。 将此配置视为在 Apache 处理逻辑和实际内容之间放置缓存。 这将允许在从缓存中检索内容之前运行传统的处理指令。 将此设置为“关闭”会牺牲一些速度来更深入地处理请求的能力。
如何配置标准 HTTP 缓存
为了启用缓存,您需要启用 mod_cache
模块及其缓存提供程序之一。 正如我们上面所说,mod_cache_disk
已经过很好的测试,所以我们将依赖它。
启用模块
在 Ubuntu 系统上,您可以通过键入以下命令启用这些模块:
sudo a2enmod cache sudo a2enmod cache_disk
这将在下次重新启动服务器时启用缓存功能。
您还需要安装 apache2-utils
软件包,其中包含 htcacheclean
实用程序,用于在必要时减少缓存。 您可以通过键入以下内容来安装它:
sudo apt-get update sudo apt-get install apache2-utils
修改全局配置
大多数缓存配置将在单独的虚拟主机定义或位置块中进行。 但是,启用 mod_cache_disk
也会启用可用于指定一些通用属性的全局配置。 现在打开那个文件看看:
sudo nano /etc/apache2/mods-enabled/cache_disk.conf
删除注释后,文件应如下所示:
/etc/apache2/mods-enabled/cache_disk.conf
<IfModule mod_cache_disk.c> CacheRoot /var/cache/apache2/mod_cache_disk CacheDirLevels 2 CacheDirLength 1 </IfModule>
IfModule
包装器告诉 Apache 仅在启用 mod_cache_disk
模块时才担心这些指令。 CacheRoot
指令指定将在磁盘上维护缓存的位置。 CacheDirLevels
和 CacheDirLength
都有助于定义如何构建缓存目录结构。
提供的 URL 的 md5
哈希将被创建为用于存储数据的密钥。 数据将被组织到从每个哈希的开头字符派生的目录中。 CacheDirLevels
指定要创建的子目录的数量,CacheDirLength
指定用作每个目录名称的字符数。 因此,具有上述默认值的 b1946ac92492d2347c6235b4d2611184
的哈希值将归档在 b/1/946ac92492d2347c6235b4d2611184
的目录结构中。 通常,您不需要修改这些值,但最好知道它们的用途。
笔记
如果您选择修改 CacheRoot
值,则必须打开 /etc/default/apache2
文件并修改 HTCACHECLEAN_PATH
的值以匹配您的选择。 这用于定期清理缓存,因此它必须具有正确的缓存位置。
您可以在此文件中设置的其他一些值是 CacheMaxFileSize
和 CacheMinFileSize
设置 Apache 将提交到缓存的文件大小范围(以字节为单位),以及 CacheReadSize
和CacheReadTime
,允许您在发送到客户端之前等待和缓冲内容。 如果内容驻留在此服务器以外的某个地方,这可能很有用。
修改虚拟服务器
大多数缓存配置将发生在更细粒度的级别上,无论是在虚拟主机定义中还是在特定位置块中。
打开您的一个虚拟主机文件以进行后续操作。 我们假设您使用的是本指南中的默认文件:
sudo nano /etc/apache2/sites-enabled
在虚拟主机块中,在任何位置块之外,我们可以开始配置一些缓存属性。 在本指南中,我们假设我们要关闭 CacheQuickHandler
以便完成更多处理。 这让我们可以建立更完整的缓存规则。
我们还将借此机会配置缓存锁定。 这是一个文件锁系统,Apache 在检查内容源以查看内容是否仍然有效时将使用它。 在满足此查询期间,如果对相同内容的额外请求进入,则会导致对后端资源的额外请求,这可能导致负载峰值。
在验证期间为资源设置缓存锁定会告诉 Apache 该资源当前正在刷新。 在此期间,可以为陈旧资源提供指示其状态的警告标头。 我们将使用 /tmp
文件夹中的缓存锁定目录进行设置。 我们将允许最多 5 秒的时间让锁被视为有效。 这些示例直接取自 Apache 的文档,因此它们应该可以很好地用于我们的目的。
我们还将告诉 Apache 忽略 Set-Cookie
标头而不将它们存储在缓存中。 这样做可以防止 Apache 意外地将用户特定的 cookie 泄露给其他方。 Set-Cookie
标头将在标头被缓存之前被剥离。
/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie </VirtualHost>
我们仍然需要为这个虚拟主机实际启用缓存。 我们可以使用 CacheEnable
指令来做到这一点。 如果这是在虚拟主机块中设置的,我们需要提供缓存方法(disk
或 socache
)以及应缓存的请求 URI。 例如,要缓存所有响应,可以将其设置为 CacheEnable disk /
,但如果您只想缓存 /public
URI 下的响应,则可以将其设置为 CacheEnable disk /public
。
我们将通过在特定位置块中启用缓存来采取不同的路线。 这样做意味着我们不必为 CacheEnable
命令提供 URI 路径。 将从该位置提供的任何 URI 都将被缓存。 我们还将打开 CacheHeader
指令,以便我们的响应标头指示缓存是否用于服务请求。
我们将设置的另一个指令是 CacheDefaultExpire
,这样如果内容上没有设置 Expires
和 Last-Modified
标头,我们就可以设置过期时间(以秒为单位)。 同样,我们将设置 CacheMaxExpire
来限制项目将被保存的时间量。 我们将设置 CacheLastModifiedFactor
以便 Apache 可以创建一个过期日期,如果它有一个 Last-Modified
日期,但没有过期。 该因子乘以修改后的时间以设置合理的到期时间。
/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 </Location> </VirtualHost>
配置完所需的所有内容后,保存并关闭文件。
通过键入以下内容检查整个配置是否存在语法错误:
sudo apachectl configtest
如果没有报告错误,请键入以下内容重新启动您的服务:
sudo service apache2 restart
在内容上设置过期和缓存标头
在上面的配置中,我们配置了 HTTP 缓存,它依赖于 HTTP 标头。 但是,我们提供的内容实际上都没有做出智能缓存决策所需的 Expires
或 Cache-Control
标头。 要设置这些标头,我们需要利用更多的模块。
mod_expires
模块可以同时设置Expires
头和Cache-Control
头中的max-age
选项。 mod_headers
模块可用于添加更具体的 Cache-Control
选项以进一步调整缓存策略。
我们可以通过键入以下内容来启用这两个模块:
sudo a2enmod expires sudo a2enmod headers
启用这些模块后,我们可以直接再次修改我们的虚拟主机文件:
sudo nano /etc/apache2/sites-enabled/000-default.conf
mod_expires
模块只提供三个指令。 ExpiresActive
通过将过期处理设置为“on”,在特定上下文中打开过期处理。 其他两个指令彼此非常相似。 ExpiresDefault
指令设置默认过期时间,ExpiresByType
根据内容的MIME类型设置过期时间。 这两个都会将 Expires
和 Cache-Control
“max-age”设置为正确的值。
这两个设置可以采用两种不同的语法。 第一个是简单的“A”或“M”,后跟几秒钟。 这将分别设置与上次“访问”或“修改”内容相关的到期时间。 例如,这两者都会在内容被访问 30 秒后过期。
ExpiresDefault A30 ExpireByType text/html A30
另一种语法允许更详细的配置。 它允许您使用人类更容易计算的秒以外的单位。 它还使用完整的词“访问”或“修改”。 整个过期配置应该用引号括起来,像这样:
ExpiresDefault "modification plus 2 weeks 3 days 1 hour" ExpiresByType text/html "modification plus 2 weeks 3 days 1 hour"
出于我们的目的,我们将设置一个默认过期时间。 我们将首先将其设置为 5 分钟,这样如果我们在熟悉过程中出现错误,它就不会在我们客户的计算机上存储很长时间。 当我们对选择适合我们内容的政策的能力更有信心时,我们可以将其调整为更积极的政策:
/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 ExpiresActive on ExpiresDefault "access plus 5 minutes" </Location> </VirtualHost>
这会将我们的 Expires
标头设置为未来五分钟,并设置 Cache-Control max-age=300
。 为了进一步完善我们的缓存策略,我们可以使用 Header
指令。 我们可以使用 merge
选项来添加额外的 Cache-Control
选项。 您可以多次调用它并添加您想要的任何其他策略。 查看 本指南 以了解您要为内容设置的缓存策略。 对于我们的示例,我们将只设置“public”,以便其他缓存可以确保它们被允许存储副本。
要为我们网站上的静态内容设置 ETags
(用于验证),我们可以使用 FileETag
指令。 这适用于静态内容。 对于动态生成的内容,您的应用程序将负责正确生成 ETags
。
我们使用该指令来设置 Apache 将用于计算 Etag
的属性。 这可以是 INode
、MTime
、Size
或 All
,具体取决于我们是否要在文件的 inode
改变,它的修改时间改变,它的大小改变,或以上所有。 您可以提供多个值,并且可以通过在新设置前加上 +
或 -
来修改子上下文中的继承设置。 出于我们的目的,我们将只使用“all”以便注册所有更改:
/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 ExpiresActive on ExpiresDefault "access plus 5 minutes" Header merge Cache-Control public FileETag All </Location> </VirtualHost>
这会将“public”(用逗号分隔)添加到 Cache-Control
已经拥有的任何值,并将包含一个 ETag
用于我们的静态内容。
完成后,保存并关闭文件。 通过键入以下内容检查更改的语法:
sudo apachectl configtest
如果未发现错误,请重新启动您的服务以实施您的缓存策略:
sudo service apache2 restart
结论
由于有很多选项,使用 Apache 配置缓存似乎是一项艰巨的工作。 幸运的是,从简单开始很容易,然后随着您需要更多复杂性而发展。 大多数管理员不需要每种缓存类型。
配置缓存时,请记住您尝试解决的特定问题,以避免在不同的实现选择中迷失方向。 大多数用户至少会从设置标题中受益。 如果您正在代理或生成内容,设置 HTTP 缓存可能会有所帮助。 如果您使用后端提供程序,共享对象缓存对于存储 SSL 会话或身份验证详细信息等特定任务很有用。 文件缓存可能仅限于系统速度较慢的那些。