如何配置在CentOS 7 Apache的内容缓存

缓存是通过允许经常请求的内容被临时存储在一个方式,允许更快地访问提高服务器性能的方法。这通过削减一些资源密集型操作,加快了处理和交付。通过建立有效的...

什么是缓存?

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

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

当运行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

在实践中,就没有必要配置 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会话或认证的详细信息,SSLStapling
  • 特点 :共享对象缓存来存储复杂的资源,可以帮助SSL会话缓存和Stapling,灵活的后端
  • 缺点 :没有验证机制,需要为更好的性能/灵活的后端配置单独的软件,在代码中的一些错误

细节

键值缓存比文件缓存更复杂,并且具有更集中的优点。 也称为共享对象缓存,Apache的键值缓存主要用于避免重复昂贵的操作,涉及设置客户端对内容的访问,而不是内容本身。 具体来说,它可用于缓存认证详细信息,SSL会话,并提供SSLStapling。

注意
目前,有一些问题, 每个共享对象缓存提供商。 对这些问题的参考将在下面概述。 在评估是否启用此功能时,请考虑这些因素。

实际的缓存通过使用共享对象缓存提供者模块之一来实现。 这些是:

  • mod_socache_dbm :本后端使用简单的dbm数据库引擎,这是一种基于文件的键值存储,它利用散列和固定大小的水桶。 此提供从某些内存泄漏症,因此,对于大多数情况下,建议使用mod_socache_shmcb代替。
  • mod_socache_dc :此提供程序使用distcache会话缓存软件。 这个项目自2004年以来没有更新,甚至没有打包为一些发行,所以使用健康的剂量谨慎。
  • mod_socache_memcache :它使用存储项目的memcache分布式内存对象缓存。 这是多个服务器之间的分布式缓存的最佳选择。 目前,它不能正常到期的条目,但补丁致力于Apache的版本控制了修复该问题的树干。
  • mod_socache_shmcb :目前,这是键值缓存的最佳选择。 这将缓存到共享内存中的循环缓冲区,这将在条目变满时删除条目。 目前,它扼流圈大小超过11K的条目

与上述提供程序模块一起,将需要额外的模块,这取决于正在缓存的对象。 例如,缓存SSL会话或配置SSLStaplingmod_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)

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

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

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 ,并添加socacheAuthBasicProvider列表您提前传统认证方式。 结果将如下所示:

/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连接的握手带来显着的开销。 因此,缓存会话数据以避免针对进一步请求的这个初始化步骤可能潜在地忽略这种惩罚。 共享对象缓存是一个完美的地方。

如果您有SSL已经配置了Apache服务器, 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缓存头,可以重新验证旧条目,可以根据您的需求来部署最大速度或灵活性
  • 缺点 :可能会泄漏敏感数据,如果配置不正确,必须使用额外的模块正确设置缓存策略

细节

HTTP协议鼓励并提供用于沿着内容递送路径高速缓存响应的机制。 Touch内容的任何计算机可以潜在地缓存每个项目一定量的时间,这取决于在内容的起源处阐述的缓存策略和计算机自己的缓存规则。

Apache HTTP缓存机制根据它看到的HTTP缓存策略缓存响应。 这是一个通用的缓存系统,遵守与任何中间服务器将遵循的相同的规则,在交付中有一个手。 这使得此系统非常灵活和强大,并允许您利用您应该已经在您的内容上设置的标题(我们将在下面介绍如何做到这一点)。

Apache的HTTP缓存也称为“三态”缓存。 这是因为它存储的内容可以是三种状态之一。 它可以是新鲜的,这意味着它允许被提供给客户端没有进一步检查,它可以是陈旧的,意味着内容上的TTL已过期,或者如果在缓存中找不到内容,它可能不存在。

如果内容变得陈旧,在下一个请求时,缓存可以通过检查源的内容来重新验证它。 如果没有更改,它可以重置生鲜日期并提供当前内容。 否则,它获取更改的内容并将其存储其缓存策略允许的时间长度。

模块概述

在HTTP缓存逻辑可通过mod_cache模块。 实际的缓存是通过一个缓存提供者来完成的。 通常情况下,高速缓存存储在使用磁盘mod_cache_disk模块,但共享对象缓存也可通过mod_cache_socache模块。

mod_cache_disk磁盘模块高速缓存,因此它可以,如果你从远程位置进行代理的内容,从一个动态的过程产生,或者只是想比你的内容通常驻留在被缓存更快的磁盘上加快速度是有用的。 这是最经过测试的提供商,在大多数情况下可能是您的首选。 缓存是不会自动清洗,所以称为Knifehtcacheclean必须偶尔运行瘦下来缓存。 这可以手动运行,设置为定期cron作业,或者作为后台进程运行。

mod_cache_socache模块缓存共享对象供应商之一(在最后一节讨论的相同)。 这可以潜在地具有比更好的性能mod_cache_disk (取决于哪个共享缓存提供被选中)。 然而,它是更新的,并依赖于共享对象提供程序,它有前面讨论的错误。 综合测试实施之前,建议mod_cache_socache选项。

HTTP缓存放置

Apache的HTTP缓存可以根据您的需要部署在两种不同的配置中。

如果CacheQuickHandler被设定为“on”时,高速缓存将在请求处理过程的早期检查。 如果发现内容,将直接提供,而不进行任何进一步处理。 这意味着它是令人难以置信的快速,但它也意味着它不允许像内容身份验证的过程。 如果在缓存中的内容,通常需要身份验证或访问控制,如果这将是任何人访问无需验证CacheQuickHandler设置为“ON”。

基本上,这将模拟Web服务器前面的单独缓存。 如果您的Web服务器需要执行任何类型的条件检查,身份验证或授权,则不会发生。 Apache甚至不会评估中指令<Location><Directory>块。 注意, CacheQuickHandler被设置为“on” 默认

如果CacheQuickHandler设置为“关”,则缓存将被显著稍后在请求处理顺序进行检查。 将此配置视为将缓存放置在Apache处理逻辑和实际内容之间。 这将允许在从高速缓存检索内容之前运行常规处理指令。 将此设置为“关闭”对于更深入地处理请求的能力有一点速度。

如何配置标准HTTP缓存

为了启用缓存,你需要启用mod_cache模块以及它的缓存供应商之一。 正如我们上文所述, mod_cache_disk是很好的测试,因此我们将依靠这一点。

将htcacheclean设置为自动管理高速缓存

上一个CentOS 7系统中, htcacheclean效用,这是作为它长到削下来缓存中,过程中安装httpd安装。 一个systemd称为单元文件htcacheclean.service默认情况下包括在内。

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

要这样设置,我们将创建一个名为目录httpd.service.requires的范围内/etc/systemd/system目录下。 这可以用于指定相关性httpd.service启动Apache单元的文件:

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

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

sudo nano /etc/sysconfig/htcacheclean

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

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

注意
请记住,如果你改变的值CACHE_ROOT ,您将需要调整值CacheRoot指令,我们将在我们的Apache配置进行设置。

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

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

sudo systemctl restart httpd

修改全局配置

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

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

我们需要添加CacheRoot目录指向应该被用来存储了缓存项目的路径。 这应该总是匹配CACHE_ROOT在发现价值/etc/sysconfig/htcacheclean文件,以便高速缓存可以被正确地管理。 我们也将设置CacheDirLevelsCacheDirLength指令,它们都朝向限定的缓存目录结构将如何构建贡献:

/etc/httpd/conf/httpd.conf
CacheRoot /var/cache/httpd/proxy
CacheDirLevels 2
CacheDirLength 1

CacheDirLevelsCacheDirLength都朝向限定的缓存目录结构将如何构建作出贡献。 一个md5被服务的URL的哈希会用于存储数据的密钥来创建。 的数据将被组织成从每个散列的开始字符衍生目录。 CacheDirLevels指定创建子目录的数目和CacheDirLength指定多少个字符作为各目录的名称来使用。 这样的哈希b1946ac92492d2347c6235b4d2611184与上面显示的默认值将在目录结构备案b/1/946ac92492d2347c6235b4d2611184 通常,您不需要修改这些值,但是了解它们的用途是很好的。

你可以在这个文件中设置一些其他值CacheMaxFileSizeCacheMinFileSize其中设置文件大小的范围,以字节为Apache将提交到高速缓存,以及CacheReadSizeCacheReadTime ,它可以让你等待,发送到客户端之前缓冲区的内容。 如果内容驻留在除此服务器之外的其他位置,这可能很有用。

修改虚拟服务器

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

打开其中一个虚拟主机文件。 我们假设你正在使用一个名为site.conf您在/etc/httpd/conf.d本指南中的目录:

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

我们将采用不同的方法,通过在特定位置块中启用缓存。 这样做意味着我们没有提供一个URI路径CacheEnable命令。 将从该位置提供的任何URI都将被缓存。 我们也将打开CacheHeader指令,使我们的响应头将指示缓存是否被用来服务请求或没有。

我们将设置另一个指令是CacheDefaultExpire这样我们就可以设置过期(以秒为单位),如果既没有Expires也不是Last-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头和max-age在选项中Cache-Control头。 mod_headers模块可用于更具体的添加Cache-Control选项调整缓存策略进一步。 默认情况下,这两个模块都在CentOS 7 Apache软件包中启用。

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

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

mod_expires模块提供只有三个指令。 ExpiresActive通过将其设置为“ON”打开在一定的语境中到期处理。 其他两个指令是非常相似的。 所述ExpiresDefault指令设置的默认期满时间,并且ExpiresByType根据MIME类型的内容的设置的到期时间。 这两项将设置ExpiresCache-Control “最大年龄”为正确的值。

这两个设置可以采用两种不同的语法。 第一个是简单的“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 这可能是INodeMTimeSize ,或All依靠,如果我们要修改ETag每当文件的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>

这将增加“公开”(用逗号分隔)到任何价值Cache-Control已经并将包括ETag为我们的静态内容。

完成后,保存并关闭文件。 键入以下内容以检查更改的语法:

sudo apachectl configtest

如果未找到错误,请重新启动服务以实施缓存策略:

sudo systemctl restart httpd

结论

使用Apache配置缓存看起来像一个令人沮丧的工作,由于有多少选项。 幸运的是,它很容易开始简单,然后增长,因为你需要更复杂。 大多数管理员不需要每种缓存类型。

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