如何在CentOS7上配置Apache内容缓存

来自菜鸟教程
跳转至:导航、​搜索

什么是缓存?

缓存是一种提高服务器性能的方法,它允许以允许更快访问的方式临时存储常用请求的内容。 这通过减少一些资源密集型操作来加速处理和交付。

通过创建有效的缓存规则,将存储适合缓存的内容,以缩短响应时间、节省资源并最小化负载。 Apache 提供了多种适合加速不同类型操作的缓存。 在本指南中,我们将讨论如何使用各种缓存模块在 CentOS 7 上配置 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 模块提供。 要使用此功能,您需要启用该模块。

运行 CentOS 7 时,安装 Apache 时会安装该模块,但默认配置不加载该模块。 要加载模块,我们将在 /etc/httpd/conf.modules.d 目录中创建一个简单文件来加载模块。 我们将此文件称为 00-cache.conf

sudo nano /etc/httpd/conf.modules.d/00-cache.conf

在内部,我们需要使用 LoadModule 指令来启用我们需要的功能。 将以下行添加到文件中:

/etc/httpd/conf.modules.d/00-cache.conf

LoadModule file_cache_module modules/mod_file_cache.so

完成后保存并关闭文件。

之后,您应该编辑主配置文件以设置文件缓存指令。 通过键入以下内容打开文件:

sudo nano /etc/httpd/conf/httpd.conf

要设置文件句柄缓存,请使用 CacheFile 指令。 该指令采用文件路径列表,以空格分隔,如下所示:

/etc/httpd/conf/httpd.conf

CacheFile /var/www/html/index.html /var/www/html/somefile.index

当服务器重新启动时,Apache 将打开列出的文件并将它们的文件句柄存储在缓存中以便更快地访问。

相反,如果您希望将一些文件直接映射到内存中,则可以使用 MMapFile 指令。 它的语法与最后一个指令基本相同,因为它只接受一个文件路径列表:

/etc/httpd/conf/httpd.conf

MMapFile /var/www/html/index.html /var/www/html/somefile.index

实际上,没有理由为同一组文件配置 both CacheFileMMapFile,但您可以在不同的文件组上同时使用这两个文件。

完成后,您可以保存并关闭文件。 通过键入以下内容检查配置文件语法:

sudo apachectl configtest

如果最后一行显示 Syntax OK,您可以安全地重新启动 Apache 实例:

sudo systemctl restart httpd

Apache 将重新启动,根据您使用的指令缓存文件内容或处理程序。

键值缓存

总体概述

  • 涉及的主要模块mod_socache_dbmmod_socache_dcmod_socache_memcachemod_socache_shmcb
  • 涉及的支持模块mod_authn_socachemod_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,这将分别提供 SSLSessionCacheSSLStaplingCache 指令。 同样,要设置身份验证缓存,必须启用 mod_authn_socache 模块,以便可以设置 AuthnCacheSOCache 指令。

如何启用键值缓存

考虑到上述错误和注意事项,如果您仍希望在 Apache 中配置这种类型的缓存,请按照以下说明进行操作。

用于设置键值缓存的方法将取决于它的用途以及您使用的提供程序。 我们将在下面介绍身份验证缓存和 SSL 会话缓存的基础知识。

目前,存在 身份验证缓存 的错误,它阻止将参数传递给缓存提供程序。 因此,任何不提供默认设置的提供商都会遇到问题。

身份验证缓存

如果您使用昂贵的身份验证方法(例如 LDAP 或数据库身份验证),身份验证缓存很有用。 如果每次发出身份验证请求时都必须命中后端,则这些类型的操作会对性能产生重大影响。

设置缓存涉及修改您现有的身份验证配置(我们不会在本指南中介绍如何设置身份验证)。 无论后端身份验证方法如何,修改本身都将大致相同。 我们将使用 mod_socache_shmcb 进行演示。 这个模块已经在我们的 /etc/httpd/conf.modules.d/00-base.conf 文件中启用。

打开您的主 Apache 配置文件,以便您可以指定此共享缓存后端以用于身份验证:

sudo nano /etc/httpd/conf/httpd.conf

在里面,靠近文件的顶部,添加 AuthnCacheSOCache 指令。 指定应将 shmcb 用作提供程序。 如果之前讨论的阻止选项传递的错误在您阅读本文时已修复,您可以指定缓存的位置和大小。 该数字以字节为单位,因此注释示例将产生 512 KB 的缓存:

/etc/httpd/conf/httpd.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)

完成后保存并关闭文件。

接下来,打开配置了身份验证的虚拟主机配置页面。 我们假设您正在使用位于 /etc/httpd/conf.d 目录中的名为 site.conf 的虚拟主机配置,但您应该修改它以反映您的环境:

sudo nano /etc/httpd/conf.d/site.conf

使用身份验证设置的基本虚拟主机可能如下所示:

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    <Directory /var/www/html/private>
        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/.htpasswd
        AuthBasicProvider file
        Require valid-user
    </Directory>
</VirtualHost>

在您配置身份验证的位置,修改块以添加缓存。 具体来说,你需要添加 AuthnCacheProvideFor 告诉它要缓存哪些认证源,使用 AuthnCacheTimeout 添加缓存超时,并将 socache 添加到 AuthBasicProvider列在您的传统身份验证方法之前。 结果将如下所示:

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    <Directory /var/www/html/private>
        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/apache/.htpasswd
        AuthBasicProvider socache file
        AuthnCacheProvideFor file
        AuthnCacheTimeout 300
        Require valid-user
    </Directory>
</VirtualHost>

上面的示例是用于文件身份验证的,它可能不会从缓存中受益很多。 但是,在使用其他身份验证方法时,实现应该非常相似。 唯一的实质性区别是上述示例中“文件”规范的位置,将使用其他身份验证方法。

保存并关闭文件。 通过键入以下内容检查您的更改是否有语法错误:

sudo apachectl configtest

如果未发现语法错误,请重新启动 Apache 以实现您的缓存更改:

sudo systemctl restart httpd

SSL 会话缓存

为建立 SSL 连接而必须执行的握手会带来大量开销。 因此,缓存会话数据以避免进一步请求的此初始化步骤可能会规避此损失。 共享对象缓存是一个完美的地方。

如果您已经为 Apache 服务器配置了 SSL,将启用 mod_ssl(如果没有,请使用 yum 安装 mod_ssl 模块)。 在 CentOS 7 上,这意味着 ssl.conf 文件将在 /etc/httpd/conf.d 目录中可用。 这实际上已经设置了缓存。 在里面,你会看到一些像这样的行:

/etc/httpd/conf.d/ssl.conf

. . .

SSLSessionCache         shmcb:/run/httpd/sslcache(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_diskmod_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> 块中的指令。 注意 CacheQuickHandlerdefault 设置为“on”!

如果 CacheQuickHandler 设置为“关闭”,缓存将在请求处理序列的后期进行显着检查。 将此配置视为在 Apache 处理逻辑和实际内容之间放置缓存。 这将允许在从缓存中检索内容之前运行传统的处理指令。 将此设置为“关闭”会牺牲一些速度来更深入地处理请求的能力。

如何配置标准 HTTP 缓存

为了启用缓存,您需要启用 mod_cache 模块及其缓存提供程序之一。 正如我们上面所说,mod_cache_disk 已经过很好的测试,所以我们将依赖它。

设置 htcacheclean 以自动管理缓存

在 CentOS 7 系统上,在 httpd 安装期间安装了 htcacheclean 实用程序,该实用程序用于随着缓存的增长而减少缓存。 默认包含一个名为 htcacheclean.servicesystemd 单元文件。

如果您计划设置缓存,最好将此服务配置为自动运行。 服务文件实际上是服务的守护进程,以可配置的时间间隔运行清理操作。 但是,默认情况下,Apache 启动时没有启动它的机制。

为了进行设置,我们将在 /etc/systemd/system 目录中创建一个名为 httpd.service.requires 的目录。 这可用于指定启动 Apache 的 httpd.service 单元文件的依赖关系:

sudo mkdir -p /etc/systemd/system/httpd.service.requires

之后,我们可以将htcacheclean.service单元文件链接到这个目录。 这将导致 htcacheclean 服务在启动 Apache 时定期启动并清理缓存:

sudo ln -s /usr/lib/systemd/system/htcacheclean.service /etc/systemd/system/httpd.service.requires

您可以通过编辑 /etc/sysconfig 目录下的 htcacheclean 文件来配置 htcacheclean 选项,包括清洁间隔:

sudo nano /etc/sysconfig/htcacheclean

在这里,您可以修改清理间隔、缓存根、最大缓存大小以及该实用程序的任何其他选项:

/etc/sysconfig/htcacheclean

INTERVAL=15
CACHE_ROOT=/var/cache/httpd/proxy
LIMIT=100M
OPTIONS=

笔记

请记住,如果您更改 CACHE_ROOT 的值,您将需要调整我们将在 Apache 配置中设置的 CacheRoot 指令的值。


完成后,保存并关闭文件。

重启Apache启动htcacheclean自动清理缓存:

sudo systemctl restart httpd

修改全局配置

大多数缓存配置将在单独的虚拟主机定义或位置块中进行。 但是,也有一些全局配置项应该用于设置一些通用属性。 打开您的主要 Apache 配置文件以配置这些项目:

sudo nano /etc/httpd/conf/httpd.conf

我们需要添加 CacheRoot 目录以指向应该用于存储我们的缓存项目的路径。 这应该始终与 /etc/sysconfig/htcacheclean 文件中的 CACHE_ROOT 值匹配,以便可以正确管理缓存。 我们还将设置 CacheDirLevelsCacheDirLength 指令,它们都有助于定义如何构建缓存目录结构:

/etc/httpd/conf/httpd.conf

CacheRoot /var/cache/httpd/proxy
CacheDirLevels 2
CacheDirLength 1

CacheDirLevelsCacheDirLength 都有助于定义如何构建缓存目录结构。 提供的 URL 的 md5 哈希将被创建为用于存储数据的密钥。 数据将被组织到从每个哈希的开头字符派生的目录中。 CacheDirLevels 指定要创建的子目录的数量,CacheDirLength 指定用作每个目录名称的字符数。 因此,具有上述默认值的 b1946ac92492d2347c6235b4d2611184 的哈希值将归档在 b/1/946ac92492d2347c6235b4d2611184 的目录结构中。 通常,您不需要修改这些值,但最好知道它们的用途。

您可以在此文件中设置的其他一些值是 CacheMaxFileSizeCacheMinFileSize 设置 Apache 将提交到缓存的文件大小范围(以字节为单位),以及 CacheReadSizeCacheReadTime,允许您在发送到客户端之前等待和缓冲内容。 如果内容驻留在此服务器以外的某个地方,这可能很有用。

修改虚拟服务器

大多数缓存配置将发生在更细粒度的级别上,无论是在虚拟主机定义中还是在特定位置块中。

打开您的一个虚拟主机文件以进行后续操作。 我们假设您在本指南的 /etc/httpd/conf.d 目录中使用了一个名为 site.conf 的文件:

sudo nano /etc/httpd/conf.d/site.conf

在虚拟主机块中,在任何位置块之外,我们可以开始配置一些缓存属性。 在本指南中,我们假设我们要关闭 CacheQuickHandler 以便完成更多处理。 这让我们可以建立更完整的缓存规则。

我们还将借此机会配置缓存锁定。 这是一个文件锁系统,Apache 在检查内容源以查看内容是否仍然有效时将使用它。 在满足此查询期间,如果对相同内容的额外请求进入,则会导致对后端资源的额外请求,这可能导致负载峰值。

在验证期间为资源设置缓存锁定会告诉 Apache 该资源当前正在刷新。 在此期间,可以为陈旧资源提供指示其状态的警告标头。 我们将使用 /tmp 文件夹中的缓存锁定目录进行设置。 我们将允许最多 5 秒的时间让锁被视为有效。 这些示例直接取自 Apache 的文档,因此它们应该可以很好地用于我们的目的。

我们还将告诉 Apache 忽略 Set-Cookie 标头而不将它们存储在缓存中。 这样做可以防止 Apache 意外地将用户特定的 cookie 泄露给其他方。 Set-Cookie 标头将在标头被缓存之前被剥离。

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    CacheQuickHandler off

    CacheLock on
    CacheLockPath /tmp/mod_cache-lock
    CacheLockMaxAge 5

    CacheIgnoreHeaders Set-Cookie
</VirtualHost>

我们仍然需要为这个虚拟主机实际启用缓存。 我们可以使用 CacheEnable 指令来做到这一点。 如果这是在虚拟主机块中设置的,我们需要提供缓存方法(disksocache)以及应缓存的请求 URI。 例如,要缓存所有响应,可以将其设置为 CacheEnable disk /,但如果您只想缓存 /public URI 下的响应,则可以将其设置为 CacheEnable disk /public

我们将通过在特定位置块中启用缓存来采取不同的方法。 这样做意味着我们不必为 CacheEnable 命令提供 URI 路径。 将从该位置提供的任何 URI 都将被缓存。 我们还将打开 CacheHeader 指令,以便我们的响应标头指示缓存是否用于服务请求。

我们将设置的另一个指令是 CacheDefaultExpire ,这样如果内容上没有设置 ExpiresLast-Modified 标头,我们就可以设置过期时间(以秒为单位)。 同样,我们将设置 CacheMaxExpire 来限制项目将被保存的时间量。 我们将设置 CacheLastModifiedFactor 以便 Apache 可以创建一个过期日期,如果它有一个 Last-Modified 日期,但没有过期。 该因子乘以修改后的时间以设置合理的到期时间。

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    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 systemctl restart httpd

在内容上设置过期和缓存标头

在上面的配置中,我们配置了 HTTP 缓存,它依赖于 HTTP 标头。 但是,我们提供的内容实际上都没有做出智能缓存决策所需的 ExpiresCache-Control 标头。 要设置这些标头,我们需要利用更多的模块。

mod_expires模块可以同时设置Expires头和Cache-Control头中的max-age选项。 mod_headers 模块可用于添加更具体的 Cache-Control 选项以进一步调整缓存策略。 这两个模块在 CentOS 7 Apache 软件包中默认启用。

我们可以直接再次修改我们的虚拟主机文件以开始配置这些项目:

sudo nano /etc/httpd/conf.d/site.conf

mod_expires 模块只提供三个指令。 ExpiresActive 通过将过期处理设置为“on”,在特定上下文中打开过期处理。 其他两个指令彼此非常相似。 ExpiresDefault指令设置默认过期时间,ExpiresByType根据内容的MIME类型设置过期时间。 这两个都会将 ExpiresCache-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/httpd/conf.d/site.conf

<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    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 的属性。 这可以是 INodeMTimeSizeAll,具体取决于我们是否要在文件的 inode 改变,它的修改时间改变,它的大小改变,或以上所有。 您可以提供多个值,并且可以通过在新设置前加上 +- 来修改子上下文中的继承设置。 出于我们的目的,我们将只使用“all”以便注册所有更改:

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    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 systemctl restart httpd

结论

由于有很多选项,使用 Apache 配置缓存似乎是一项艰巨的工作。 幸运的是,从简单开始很容易,然后随着您需要更多复杂性而发展。 大多数管理员不需要每种缓存类型。

配置缓存时,请记住您尝试解决的特定问题,以避免在不同的实现选择中迷失方向。 大多数用户至少会从设置标题中受益。 如果您正在代理或生成内容,设置 HTTP 缓存可能会有所帮助。 如果您使用后端提供程序,共享对象缓存对于存储 SSL 会话或身份验证详细信息等特定任务很有用。 文件缓存可能仅限于系统速度较慢的那些。