如何在 Ubuntu 14.04 上配置 Apache 内容缓存
什么是缓存?
缓存是一种通过允许以允许更快访问的方式临时存储通常请求的内容来提高服务器性能的方法。这通过减少一些资源密集型操作来加快处理和交付。
通过创建有效的缓存规则,将存储适合缓存的内容以缩短响应时间、节约资源并最大程度地减少负载。 Apache 提供了多种适合加速不同类型操作的缓存。在本指南中,我们将讨论如何使用各种缓存模块在 Ubuntu 14.04 上配置 Apache 2.4。
要了解有关开发通用缓存策略的更多信息,请查看这篇文章。
Apache 缓存简介
Apache 可以缓存具有不同复杂程度和可伸缩性的内容。该项目根据缓存内容的方法将它们分为三组。一般细分是:
- 文件缓存:最基本的缓存策略,这只是在服务器启动时打开文件或文件描述符并保持它们可用以加快访问速度。
- 键值缓存:主要用于 SSL 和身份验证缓存,键值缓存使用共享对象模型,可以存储重复计算成本高的项。
- 标准 HTTP 缓存:最灵活和最常用的缓存机制,这个三态系统可以存储响应并在它们过期时验证它们。这可以根据您的特定需求进行性能或灵活性配置。
快速浏览一下上面的描述可能会发现上面的方法有一些重叠,但同时使用多个策略可能会有所帮助。例如,为您的 SSL 会话使用键值存储并为响应启用标准 HTTP 缓存可以让您减轻数据源的大量负载并加快您的客户端的许多内容交付操作。
现在您对 Apache 的每个缓存机制都有了广泛的了解,让我们更详细地了解这些系统。
文件缓存
总体概述
- 涉及的主要模块:
mod_file_cache
- 主要用例:在服务器启动时存储文件内容或文件描述符。这些是静态表示,在服务器重新启动之前无法可靠地更改。
- 特点:简单,提高慢速文件系统的性能
- 缺点:实验性功能,不响应文件系统上的更新,必须谨慎使用以适应操作系统的限制,只能用于静态文件
细节
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
指令。该指令采用文件路径列表,以空格分隔,如下所示:
CacheFile /var/www/html/index.html /var/www/html/somefile.index
当服务器重新启动时,Apache 将打开列出的文件并将它们的文件句柄存储在缓存中以便更快地访问。
相反,如果您希望将几个文件直接映射到内存中,则可以使用 MMapFile
指令。它的语法与最后一个指令基本相同,因为它只需要一个文件路径列表:
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 装订。
当前,每个 共享对象缓存提供程序都存在一些问题。下面将概述对这些问题的参考。在评估是否启用此功能时将这些考虑在内。
实际缓存是通过使用其中一个共享对象缓存提供程序模块来完成的。这些都是:
mod_socache_dbm
:此后端使用简单的dbm
数据库引擎,这是一个基于文件的键值存储,它使用散列和固定大小的桶。此提供程序存在一些内存泄漏问题,因此在大多数情况下,建议改用mod_socache_shmcb
。mod_socache_dc
:此提供程序使用 distcache 会话缓存软件。该项目自 2004 年以来没有更新过,甚至没有针对某些发行版打包,因此请谨慎使用。mod_socache_memcache
:这使用 memcache 分布式内存对象缓存来存储项目。这是在多个服务器之间进行分布式缓存的最佳选择。目前,它没有正确地使条目过期,但已向 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 的缓存:
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
在您的常规身份验证方法之前列出。结果将如下所示:
<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
目录。这实际上已经设置了缓存。在里面,你会看到这样的几行:
. . .
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 缓存标头,可以重新验证陈旧的条目,可以根据您的需要进行部署以获得最大速度或灵活性
- 缺点:如果配置不正确,可能会泄露敏感数据,必须使用额外的模块来正确设置缓存策略
细节
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。
基本上,这会在您的 Web 服务器前面模拟一个单独的缓存。如果您的 Web 服务器需要进行任何类型的条件检查、身份验证或授权,则不会发生这种情况。 Apache 甚至不会评估
或
块中的指令。请注意,CacheQuickHandler
默认设置为“on”!
如果 CacheQuickHandler
设置为 \off,缓存将在请求处理序列的后面显着检查。将此配置视为将缓存放在 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
删除注释后,文件应如下所示:
<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
标头将在标头被缓存之前被剥离。
<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
日期但没有到期,它就可以创建一个到期日期。该因子乘以修改后的时间以设置合理的过期时间。
<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 分钟,这样如果我们在熟悉过程中犯了错误,它就不会在我们客户的计算机上存储很长时间。当我们对自己选择适合我们内容的政策的能力更有信心时,我们可以将其调整为更具侵略性的内容:
<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
,具体取决于我们是否要修改 ETag
每当文件的 inode
更改、修改时间更改、大小更改或以上所有更改时。您可以提供多个值,并且可以通过在新设置前加上 +
或 -
来修改子上下文中继承的设置。出于我们的目的,我们将只使用 \all 以便注册所有更改:
<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 会话或身份验证详细信息。文件缓存可能仅限于那些系统速度较慢的系统。