如何在Ubuntu 14.04上配置Apache内容缓存

2018-09-25 10:23:41 浏览数 (1)

什么是缓存?

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

通过创建有效的缓存规则,将存储适合缓存的内容,以缩短响应时间,节省资源并最大限度地减少负载。Apache提供了各种适用于加速不同类型操作的缓存。在本指南中,我们将讨论如何使用其各种缓存模块在Ubuntu 14.04上配置Apache 2.4。

要完成本教程,你需要具备以下内容:

  • 一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
  • SSL证书:如何设置此证书取决于你是否拥有可解析该服务器的域名。
    • 如果你有域名,保护你网站的最简单方法是使用腾讯云SSL证书服务,它提供免费的可信证书。腾讯云SSL证书安装操作指南进行设置。
    • 如果你没有域名,建议您先去这里注册一个域名,如果你只是使用此配置进行测试或个人使用,则可以使用自签名证书,不需要购买域名。自签名证书提供了相同类型的加密,但没有域名验证公告。关于自签名证书,你可以参考为Apache创建自签名SSL证书和如何为Nginx创建自签名SSL证书这两篇文章。

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时将禁用该模块。您可以键入以下命令启用该模块:

代码语言:javascript复制
sudo a2enmod file_cache

之后,您应编辑主配置文件以设置文件缓存指令。输入以下命令打开文件:

代码语言:javascript复制
sudo nano /etc/apache2/apache2.conf

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

代码语言:javascript复制
CacheFile /var/www/html/index.html /var/www/html/somefile.index

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

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

代码语言:javascript复制
MMapFile /var/www/html/index.html /var/www/html/somefile.index

在实践中,就没有必要为同组的文件配置 CacheFileMMapFile,但你可以在不同的文件集同时使用。

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

代码语言:javascript复制
sudo apachectl configtest

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

代码语言:javascript复制
sudo service apache2 restart

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

键值缓存

总体概述

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

如何启用键值缓存

考虑到上述错误和警告,如果您仍希望在Apache中配置此类缓存,请按照下面的说明进行操作。

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

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

身份验证缓存

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

设置缓存涉及修改现有的身份验证配置(我们不会在本指南中介绍如何设置身份验证)。无论后端身份验证方法如何,修改本身都将大致相同。我们将用mod_socache_shmcb来演示。

首先,键入以下命令以启用authn_socache模块和mod_socache_shmcb提供程序模块:

代码语言:javascript复制
sudo a2enmod authn_socache
sudo a2enmod socache_shmcb

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

代码语言:javascript复制
sudo nano /etc/apache2/apache2.conf

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

代码语言:javascript复制
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虚拟主机配置,但您应该对其进行修改以反映您的环境:

代码语言:javascript复制
sudo nano /etc/apache2/sites-enabled/000-default.conf

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

代码语言:javascript复制
<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以实现缓存更改:

代码语言:javascript复制
sudo service apache2 restart
SSL会话缓存

必须执行以建立SSL连接的握手会带来很大的开销。因此,缓存会话数据以避免针对进一步请求的该初始化步骤可能会避免这种惩罚。共享对象缓存是一个完美的地方。

如果已为Apache服务器配置了SSL,mod_ssl将被启用。在Ubuntu上,这意味着ssl.conf文件已移至/etc/apache2/mods-enabled目录。这实际上已经设置了缓存。在里面,你会看到一些像这样的行:

代码语言:javascript复制
. . .
​
SSLSessionCache         shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
SSLSessionCacheTimeout  300
​
. . .

这实际上足以设置会话缓存。要测试它,您可以使用OpenSSL的连接客户端。输入:

代码语言:javascript复制
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协议鼓励并提供用于在内容传递路径上缓存响应的机制。任何接触内容的计算机都可能会在一定时间内缓存每个项目,具体取决于内容来源和计算机自己的缓存规则中规定的缓存策略。

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甚至不会评估其中的指令<Location><Directory>块。请注意,默认情况下CacheQuickHandler设置为“on” !

如果将CacheQuickHandler其设置为“off”,则将在请求处理序列中稍后检查高速缓存。可以将此配置视为将缓存放在Apache处理逻辑和实际内容之间。这将允许在从高速缓存检索内容之前运行传统处理指令。将此设置为“off”会以更快的速度进行交易,以便更深入地处理请求。

如何配置标准HTTP缓存

为了启用缓存,您需要启用mod_cache模块以及其中一个缓存提供程序。如上所述,mod_cache_disk经过充分测试,我们将依赖于此。

启用模块

在Ubuntu系统上,您可以通过键入以下内容来启用这些模块:

代码语言:javascript复制
sudo a2enmod cache
sudo a2enmod cache_disk

这将在下次重新启动服务器时启用缓存功能。

您还需要安装apache2-utils软件包,其中包含用于在必要时削减缓存的实用程序htcacheclean。您可以输入以下命令安装:

代码语言:javascript复制
sudo apt-get update
sudo apt-get install apache2-utils
修改全局配置

大多数缓存配置将在单个虚拟主机定义或位置块中进行。但是,启用mod_cache_disk还会启用可用于指定某些常规属性的全局配置。现在打开该文件来查看:

代码语言:javascript复制
sudo nano /etc/apache2/mods-enabled/cache_disk.conf

删除注释后,文件应如下所示:

代码语言:javascript复制
<IfModule mod_cache_disk.c>
    CacheRoot /var/cache/apache2/mod_cache_disk
    CacheDirLevels 2
    CacheDirLength 1
</IfModule>

IfModule包装告诉Apache如果mod_cache_disk模块被启用就要担心这些指令了。CacheRoot指令指定磁盘上将保留缓存的位置。CacheDirLevelsCacheDirLength都有助于定义如何构建限定缓存目录结构。

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

注意:如果您选择修改该CacheRoot值,则必须打开该/etc/default/apache2文件并修改其HTCACHECLEAN_PATH值以匹配您的选择。这用于定期清理缓存,因此它必须具有缓存的正确位置。

你可以在这个文件中设置一些其他值CacheMaxFileSizeCacheMinFileSize,该设定文件大小的范围在Apache将提交到高速缓存,以及字节CacheReadSizeCacheReadTime,它允许您在发送给客户端之前等待和缓冲内容。如果内容位于此服务器以外的其他位置,则此选项会非常有用。

修改虚拟服务器

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

打开一个要跟随的虚拟主机文件。我们假设您使用的是本指南中的默认文件:

代码语言:javascript复制
sudo nano /etc/apache2/sites-enabled

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

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

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

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

代码语言:javascript复制
<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指令执行此操作。如果在虚拟主机块中设置了这个,我们需要提供缓存方法(disksocache)以及应缓存的请求URI。例如,要缓存所有响应,可以将其设置为CacheEnable disk /,但如果您只想在/publicURI 下缓存响应,则可以将其设置为CacheEnable disk /public

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

我们设置的另一个指令是CacheDefaultExpire,如果内容上既没有设置头文件Expires也没有设置头文件Last-Modified,我们可以设置一个到期时间(以秒为单位)。同样地,我们将设置CacheMaxExpire以限制项目的保存时间。我们将设置CacheLastModifiedFactor以便Apache可以创建到期日期,如果它具有一个Last-Modified日期但没有到期的话。该因子乘以自修改后的时间以设置合理的到期时间。

代码语言:javascript复制
<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>

在配置了所需的所有内容后,保存并关闭文件。

输入以下内容来检查整个配置是否存在语法错误:

代码语言:javascript复制
sudo apachectl configtest

如果未报告任何错误,请键入以下命令重新启动服务:

代码语言:javascript复制
sudo service apache2 restart

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

在上面的配置中,我们配置了HTTP缓存,它依赖于HTTP头。但是,我们所服务的内容实际上并不具备进行智能缓存决策所需的ExpiresCache-Control标头。要设置这些标头,我们需要利用更多的模块。

mod_expires模块可以在Cache-Control标题中设置Expires标题和max-age选项。该mod_headers模块可用于添加更多特定Cache-Control选项以进一步调整缓存策略。

我们可以通过键入以下内容来启用这两个模块:

代码语言:javascript复制
sudo a2enmod expires
sudo a2enmod headers

启用这些模块后,我们可以再次直接修改我们的虚拟主机文件:

代码语言:javascript复制
sudo nano /etc/apache2/sites-enabled/000-default.conf

mod_expires模块仅提供三个指令。在ExpiresActive通过将其设置为“开”在特定上下文匝到期处理。另外两个指令彼此非常相似。ExpiresDefault指令设置默认的到期时间,而ExpiresByType根据内容的MIME类型设置到期时间。这两个都会将ExpiresCache-Control的“max-age”设置为正确的值。

这两个设置可以采用两种不同的语法。第一个是简单的“A”或“M”,后跟几秒钟。这设置了相对于上次“访问”或“修改”内容的最后时间的到期。例如,这两者都会在访问内容后30秒到期。

代码语言:javascript复制
ExpiresDefault A30
ExpireByType text/html A30

另一种语法允许更详细的配置。它允许您使用更容易人类计算的秒数以外的单位。它还使用完整的“访问”或“修改”一词。整个过期配置应保留在引号中,如下所示:

代码语言:javascript复制
ExpiresDefault "modification plus 2 weeks 3 days 1 hour"
ExpiresByType text/html "modification plus 2 weeks 3 days 1 hour"

出于我们的目的,我们只设置默认过期时间。我们将从设置为5分钟开始,这样如果我们在熟悉时犯了错误,它将不会存储在我们客户的计算机上很长时间。当我们对选择适合我们内容的政策的能力更有信心时,我们可以将其调整为更积极的方式:

代码语言:javascript复制
<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的属性。这可以是INodeMTimeSize,或All,这取决于我们是否要修改ETag(每次文件的inode修改,其修改时间的变化,其大小的变化,或者上述所有)。您可以提供多个值,并且可以通过在新设置前加上 -来修改子上下文中的继承设置。出于我们的目的,我们将只使用“all”以便所有更改都已注册:

代码语言:javascript复制
<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静态内容。

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

代码语言:javascript复制
sudo apachectl configtest

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

代码语言:javascript复制
sudo service apache2 restart

结论

因为有很多选项,使得用Apache配置缓存看起来像是一项艰巨的任务。幸运的是,它很容易开始简单,然后随着您需要更多的复杂性而增长。大多数管理员不需要每种缓存类型。

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

想要了解更多关于配置内容缓存的相关教程,请前往腾讯云 社区学习更多知识。


参考文献:《How To Configure Apache Content Caching on Ubuntu 14.04》

0 人点赞