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

什么是Caching?

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

通过创建有效的缓存规则,适用于缓存的内容将被存储以改善响应时间,节省资源,并最大限度地减少负载。Apache提供各种缓存,适合加快不同类型的操作。

有关开发一般缓存策略的更多信息,请参阅 本文

在Apache中引入缓存

Apache可以缓存具有不同级别的复杂性和可扩展性的内容,该项目根据缓存内容的方法将这些内容分为三组。

  • 文件缓存:最基本的缓存策略,这只是在服务器启动时打开文件或文件描述器,并使其可用来加速访问。
  • 关键值缓存:主要用于SSL和身份验证缓存,关键值缓存使用共享对象模型,可以存储重复计算昂贵的项目。

快速查看上述描述可能会揭示上述方法有一些重叠,但同时使用多个策略可能是有帮助的,例如,使用关键值存储器为您的SSL会话,并允许标准的HTTP缓存响应,可以使您从数据源中获得大量负载,并加快许多内容交付操作为您的客户端。

现在你对Apache的每个缓存机制有了广泛的了解,让我们更详细地看看这些系统。

档案缓存

总体概览

  • 涉及的主要模块: mod_file_cache
  • 主要用例:在服务器启动时存储文件内容或文件描述器 这些是静态表示,直到服务器重新启动为止无法可靠地更改。
  • 功能:简单,提高慢文件系统
  • Drawbacks的性能:实验功能,不响应文件系统的更新,必须节约地使用以适应操作系统的局限性,只能用于静态文件

细节

mod_file_cache模块主要用于加快缓慢文件系统的服务器上的文件访问速度,它提供了两个配置指令的选择,两者都旨在通过在服务器启动时执行部分工作来加速服务静态文件的过程,而不是在请求文件时。

CacheFile指令用于指定您想要加速访问的磁盘上的文件路径.当 Apache 启动时,Apache 会打开已指定的静态文件并缓存文件,避免在需要时打开该文件。

「MMapFile」指令在首次启动Apache时也会打开文件,但是「MMapFile」将文件的内容缓存到内存中,而不仅仅是文件处理器。这使得这些页面的性能更快,但它有一些严重的局限性。它没有记录它所使用的内存量,所以它可以失去内存。 另外,请注意,小程序会复制任何分配的内存,这可能会导致资源的消耗比你最初预期的更快。

这些指令只在Apache启动时进行评估,这意味着您不能依赖Apache在启动后进行更改,只使用这些指令在静态文件上,这些文件不会在Apache会话的生命周期内发生更改。 根据文件的更改方式,服务器可能会收到更改通知,但这不是预期的行为,并且不会总是正常工作。

如何启用文件缓存

文件缓存由mod_file_cache模块提供,要使用此功能,您需要启用该模块。

在运行 Ubuntu 14.04 时,模块将被安装,但在安装 Apache 时将被禁用。

1sudo a2enmod file_cache

之后,您应该编辑主配置文件以设置文件缓存指令。

1sudo nano /etc/apache2/apache2.conf

要设置文件处理缓存,请使用CacheFile指令. 此指令列出了由空格分开的文件路径,如下:

1[label /etc/apache2/apache2.conf]
2CacheFile /var/www/html/index.html /var/www/html/somefile.index

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

相反,如果你想将一些文件直接地图到内存中,你可以使用MMapFile指令. 它的语法基本上与最后一个指令相同,因为它只需要列出一个文件路径:

1[label /etc/apache2/apache2.conf]
2MMapFile /var/www/html/index.html /var/www/html/somefile.index

在实践中,没有理由为相同的文件组配置 both CacheFileMMapFile,但你可以在不同的文件组中使用两者。

当你完成时,你可以保存和关闭文件. 通过键入检查配置文件语法:

1sudo apachectl configtest

如果最后一行是Syntax OK,你可以安全地重新启动你的Apache实例:

1sudo service apache2 restart

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

关键价值缓存

总体概览

  • 主要模块涉及: mod_socache_dbm, mod_socache_dc, mod_socache_memcache, mod_socache_shmcb
  • 支持涉及的模块: mod_authn_socache, mod_ssl
  • 主要用例:存储SSL会话或身份验证细节,SSL堆积
  • 功能:共享对象缓存来存储复杂的资源,可以协助SSL会话缓存和堆积,灵活的后置
  • Drawbacks:没有验证机制,需要配置单独的软件以实现更高性能/灵活的后置,一些错误在

细节

关键值缓存比文件缓存更为复杂,具有更为集中的好处. 也被称为共享对象缓存,Apache的关键值缓存主要用于避免重复与客户端对内容的访问设置有关的昂贵操作,而不是内容本身。

<$>[注] [标签注] 目前,与 every 共享对象缓存提供商存在一些问题. 以下将列出有关问题的参考信息。

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

  • mod_socache_dbm: 此后端使用简单的 dbm 数据库引擎,这是一个基于文件的关键值存储,它使用哈希和固定尺寸的缓存软件。 该提供商患有某些内存泄漏,所以在大多数情况下建议使用 mod_socache_shmcb 代替。
  • mod_socache_dc: 此提供商使用了 distcache 会话缓存软件. 此项目自2004年以来没有更新,甚至没有为某些分布包装,所以使用健康剂量的 caution. * **_modsocache_memcache**: 此提供商使用了 memca 分布式内存对象缓存来存项目。 这是

例如,为了缓存SSL会话或配置SSL堆积,必须启用mod_ssl,这将分别提供SSLSessionCacheSSLStaplingCache指令。

如何启用关键值缓存

考虑到上述错误和警告,如果您仍然希望在Apache中配置此类缓存,请遵循下面的步骤。

设置关键值缓存的方法将取决于它将用于什么以及您正在使用的提供商,我们将在下面讨论认证缓存和SSL会话缓存的基础知识。

目前,有一个错误(https://bz.apache.org/bugzilla/show_bug.cgi?id=54342),阻止将论点传递给缓存提供商,因此不提供默认设置的任何提供商都会出现问题。

身份验证缓存

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

设置缓存包括修改您现有的身份验证配置(我们不会在本指南中介绍如何设置身份验证)。

首先,请通过键入authn_socache模块和mod_socache_shmcb提供者模块:

1sudo a2enmod authn_socache
2sudo a2enmod socache_shmcb

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

1sudo nano /etc/apache2/apache2.conf

内部,向文件的顶部,添加AuthnCacheSOCache指令. 指定shmcb应该被用作提供商. 如果以前讨论的阻止选项传输的错误是通过您阅读此时的修复,您可以指定缓存的位置和大小。 数字是字节,所以评论的例子将产生 512 千兆字节缓存:

1[label /etc/apache2/apache2.conf]
2AuthnCacheSOCache shmcb
3
4# If the bug preventing passed arguments to the provider gets fixed,
5# you can customize the location and size like this
6#AuthnCacheSOCache shmcb:${APACHE_RUN_DIR}/auth_cache(512000)

保存并关闭文件,当你完成。

接下来,打开已配置身份验证的虚拟主机配置页面,我们将假设您正在使用000-default.conf虚拟主机配置,但您应该修改它以反映您的环境:

1sudo nano /etc/apache2/sites-enabled/000-default.conf

具体来说,你需要添加AuthnCacheProvideFor,告诉它哪些身份验证源要缓存,添加AuthnCacheTimeout的缓存时间,并在传统身份验证方法之前将socache添加到AuthBasicProvider列表中。

 1[label /etc/apache2/sites-enabled/000-default.conf]
 2<VirtualHost *:80>
 3
 4    . . .
 5
 6    <Directory /var/www/html/private>
 7        AuthType Basic
 8        AuthName "Restricted Files"
 9        AuthBasicProvider socache file
10        AuthUserFile /etc/apache2/.htpasswd
11        AuthnCacheProvideFor file
12        AuthnCacheTimeout 300
13        Require valid-user
14    </Directory>
15</VirtualHost>

上面的例子是用于文件身份验证,这很可能不会从缓存中受益。然而,在使用其他身份验证方法时,实现应该非常相似。

保存并关闭文件. 重新启动 Apache 以实现缓存更改:

1sudo service apache2 restart

SSL 会话缓存

必须执行的握手来建立SSL连接带来了显着的负面影响,因此,缓存会话数据以避免此初始化步骤,以便进一步请求,可能会导致这种处罚。

如果你已经为你的Apache服务器配置了SSL,则将启用mod_ssl。在Ubuntu中,这意味着一个ssl.conf文件已移动到/etc/apache2/mods-enabled目录。

1[label /etc/apache2/mods-enabled/ssl.conf]
2. . .
3
4SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
5SSLSessionCacheTimeout 300
6
7. . .

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

1openssl 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的工具来减轻缓存。

mod_cache_socache模块缓存到共享对象提供商之一(上一节讨论的相同)。这可能比mod_cache_disk具有更好的性能(取决于选择哪个共享缓存提供商)。

HTTP 缓存位置

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

如果CacheQuickHandler设置为启用,则缓存将在请求处理过程中非常早期进行检查.如果发现了内容,则将直接提供,而无需进一步处理。这意味着它非常快,但也意味着它不允许对内容进行身份验证等过程。如果您的缓存中有通常需要身份验证或访问控制的内容,如果CacheQuickHandler设置为启用,则它将可访问任何人(没有身份验证)。

基本上,这模拟了在您的 Web 服务器前面的单独缓存。如果您的 Web 服务器需要进行任何形式的条件检查、身份验证或授权,则不会发生这种情况。

如果CacheQuickHandler设置为关闭,则缓存将在请求处理序列中稍后进行检查。 想想这种配置是将缓存置于您的Apache处理逻辑和您的实际内容之间。 这将允许在从缓存中获取内容之前运行传统的处理指令。

如何设置标准 HTTP 缓存

为了启用缓存,您需要启用mod_cache模块以及其中的一个缓存提供商。

允许模块

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

1sudo a2enmod cache
2sudo a2enmod cache_disk

这将允许下次重新启动服务器的缓存功能。

您还需要安装apache2-utils包,其中包含用于在需要时将缓存配对的htcacheclean实用程序。

1sudo apt-get update
2sudo apt-get install apache2-utils

更改全球配置

大多数缓存配置都会在个别的虚拟主机定义或位置块中进行,但是,启用mod_cache_disk也可以启用一个可用于指定某些一般属性的全球配置。

1sudo nano /etc/apache2/mods-enabled/cache_disk.conf

删除评论后,文件应该是这样的:

1[label /etc/apache2/mods-enabled/cache_disk.conf]
2<IfModule mod_cache_disk.c>
3    CacheRoot /var/cache/apache2/mod_cache_disk
4    CacheDirLevels 2
5    CacheDirLength 1
6</IfModule>

IfModule包装程序告诉Apache只有在启用mod_cache_disk模块时才会担心这些指令。CacheRoot指令规定了磁盘上将维持缓存的位置。

作为存储数据的密钥,将创建所服务的 URL 中的md5哈希。数据将被组织成源于每个哈希的开头字符的目录。CacheDirLevels指定了要创建的子目录的数量,CacheDirLength则指定了作为每个目录的名称使用的字符的数量。因此,使用上述默认值的b1946ac92492d2347c6235b4d2611184的哈希将被存储在一个目录结构中,即b/1/946ac92492d2347c6235b426d11184

<$>[注] [标签注] 如果您选择修改 CacheRoot 值,则必须打开 /etc/default/apache2 文件并修改 HTCACHECLEAN_PATH 值以匹配您的选择。

您可以在此文件中设置的其他一些值是CacheMaxFileSizeCacheMinFileSize,这些值设置了Apache将向缓存承诺的字节中的文件大小范围,以及CacheReadSizeCacheReadTime,允许您在发送到客户端之前等待和缓冲内容。

更改虚拟服务器

大多数缓存配置都会发生在更细微的层面上,无论是在虚拟主机定义中还是在特定位置块中。

我们将假设您正在使用本指南中的默认文件:

1sudo nano /etc/apache2/sites-enabled

在虚拟主机区块中,在任何位置区块之外,我们可以开始配置一些缓存属性. 在本指南中,我们将假设我们想要关闭CacheQuickHandler,以便进行更多处理。

我们还将利用这个机会来配置缓存锁定,这是Apache在检查内容来源时使用的文件锁定系统,以查看内容是否仍然有效。

在验证过程中为资源设置缓存锁会告知Apache当前正在更新该资源,在此期间,可以向已停留的资源提供一个警告标题,说明其状态。我们将在/tmp文件夹中设置缓存锁目录。

我们还会告诉Apache忽略设置cookie标题,不要将其存储在缓存中。这样做将防止Apache意外泄露用户特定的cookie给其他方。

 1[label /etc/apache2/sites-enabled/000-default.conf]
 2<VirtualHost *:80>
 3    ServerAdmin webmaster@localhost
 4    DocumentRoot /var/www/html
 5    ErrorLog ${APACHE_LOG_DIR}/error.log
 6    CustomLog ${APACHE_LOG_DIR}/access.log combined
 7
 8    CacheQuickHandler off
 9
10    CacheLock on
11    CacheLockPath /tmp/mod_cache-lock
12    CacheLockMaxAge 5
13
14    CacheIgnoreHeaders Set-Cookie
15</VirtualHost>

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

我们将采取不同的路径,通过在特定位置块内启用我们的缓存。这样做意味着我们不必向CacheEnable命令提供URI路径。从该位置服务的任何URI都将被缓存。

我们将设置的另一个指令是CacheDefaultExpire,以便我们可以设置一个期限(在秒钟内),如果内容上没有设置ExpiresLast-Modified标题。同样,我们将设置CacheMaxExpire,以限制将保存的项目的时间。

 1[label /etc/apache2/sites-enabled/000-default.conf]
 2<VirtualHost *:80>
 3    ServerAdmin webmaster@localhost
 4    DocumentRoot /var/www/html
 5    ErrorLog ${APACHE_LOG_DIR}/error.log
 6    CustomLog ${APACHE_LOG_DIR}/access.log combined
 7
 8    CacheQuickHandler off
 9
10    CacheLock on
11    CacheLockPath /tmp/mod_cache-lock
12    CacheLockMaxAge 5
13
14    CacheIgnoreHeaders Set-Cookie
15
16    <Location />
17        CacheEnable disk
18        CacheHeader on
19
20        CacheDefaultExpire 600
21        CacheMaxExpire 86400
22        CacheLastModifiedFactor 0.5
23    </Location>
24</VirtualHost>

保存并关闭你的文件,当你配置了你需要的一切。

检查您的整个配置以查找语法错误,键入:

1sudo apachectl configtest

如果没有报告错误,请通过键入以下方式重新启动您的服务:

1sudo service apache2 restart

在内容上设置 expires 和缓存标题

在上述配置中,我们配置了 HTTP 缓存,它依赖于 HTTP 标题. 然而,我们提供的内容中没有任何内容实际上具有所需的过期缓存控制标题来做出智能缓存决策。

mod_expires模块可以在Cache-Control标题中设置Expires标题和max-age选项,可以使用mod_headers模块添加更具体的Cache-Control选项来进一步调整缓存策略。

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

1sudo a2enmod expires
2sudo a2enmod headers

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

1sudo nano /etc/apache2/sites-enabled/000-default.conf

mod_expires模块仅提供三个指令。ExpiresActive通过将其设置为启用在特定情况下启用过期处理。其他两个指令彼此非常相似。ExpiresDefault指令设置了默认过期时间,而ExpiresByType则根据内容的MIME类型设置过期时间。

这两个设置可以采用两种不同的语法。第一个是简单的AM,然后是几秒钟。这就决定了最后一次内容分别访问修改的期限。

1ExpiresDefault A30
2ExpireByType text/html A30

另一个语法允许更简单的配置. 它允许您使用比人类更容易计算的秒别的单位。 它还使用了完整的单词访问修改。 整个到期配置应该保持在引文中,如下:

1ExpiresDefault "modification plus 2 weeks 3 days 1 hour"
2ExpiresByType text/html "modification plus 2 weeks 3 days 1 hour"

对于我们的目的,我们只会设置默认的到期期限,我们将开始设置为5分钟,以便如果我们在熟悉时犯了一个错误,它不会在客户的计算机上存储很长时间。

 1[label /etc/apache2/sites-enabled/000-default.conf]
 2<VirtualHost *:80>
 3    ServerAdmin webmaster@localhost
 4    DocumentRoot /var/www/html
 5    ErrorLog ${APACHE_LOG_DIR}/error.log
 6    CustomLog ${APACHE_LOG_DIR}/access.log combined
 7
 8    CacheQuickHandler off
 9
10    CacheLock on
11    CacheLockPath /tmp/mod_cache-lock
12    CacheLockMaxAge 5
13
14    CacheIgnoreHeaders Set-Cookie
15
16    <Location />
17        CacheEnable disk
18        CacheHeader on
19
20        CacheDefaultExpire 600
21        CacheMaxExpire 86400
22        CacheLastModifiedFactor 0.5
23
24        ExpiresActive on
25        ExpiresDefault "access plus 5 minutes"
26    </Location>
27</VirtualHost>

这将将我们的过期标题设置为未来五分钟,并设置为Cache-Control max-age=300。 为了进一步完善我们的缓存策略,我们可以使用Header指令。 我们可以使用合并选项添加额外的Cache-Control选项。 您可以多次拨打并添加任何您想要的额外策略。 查看 本指南以了解您想为您的内容设置缓存策略。 例如,我们只会设置公共,以便其他缓存可以确保它们可以存储副本。

为了在我们的网站上为静态内容设置ETags(用于验证),我们可以使用FileETag指令。这将对静态内容起作用。对于动态生成的内容,您将负责正确生成ETags

我們使用指令來設定 Apache 將用來計算「Etag」的屬性。這可以是「INode」,「MTime」,「Size」,或「All」,取決於我們想要在檔案的「inode」變更、修改時間變化、大小變化,或上述所有情況下,隨時修改「ETag」時,您可以提供多個值,並且您可以在兒童背景中修改繼承的設定,以「+」或「-」為前方。

 1[label /etc/apache2/sites-enabled/000-default.conf]
 2<VirtualHost *:80>
 3    ServerAdmin webmaster@localhost
 4    DocumentRoot /var/www/html
 5    ErrorLog ${APACHE_LOG_DIR}/error.log
 6    CustomLog ${APACHE_LOG_DIR}/access.log combined
 7
 8    CacheQuickHandler off
 9
10    CacheLock on
11    CacheLockPath /tmp/mod_cache-lock
12    CacheLockMaxAge 5
13
14    CacheIgnoreHeaders Set-Cookie
15
16    <Location />
17        CacheEnable disk
18        CacheHeader on
19
20        CacheDefaultExpire 600
21        CacheMaxExpire 86400
22        CacheLastModifiedFactor 0.5
23
24        ExpiresActive on
25        ExpiresDefault "access plus 5 minutes"
26
27        Header merge Cache-Control public
28        FileETag All
29    </Location>
30</VirtualHost>

这将添加公共(以一个字节分开)到任何值Cache-Control已经有,并将包括一个ETag我们的静态内容。

当你完成时,保存并关闭文件. 通过键入检查你的更改的语法:

1sudo apachectl configtest

如果没有发现任何错误,请重新启动您的服务以执行您的缓存策略:

1sudo service apache2 restart

结论

使用 Apache 配置缓存可能看起来像是一个艰难的工作,因为有多少选项。幸运的是,很容易开始简单,然后增长,因为您需要更多的复杂性。

在配置缓存时,请记住您正在尝试解决的具体问题,以避免在不同的实现选择中迷失。大多数用户至少会从设置标题中受益。如果您正在代理或生成内容,则设置 HTTP 缓存可能有帮助。 共享对象缓存对于存储 SSL 会话或身份验证细节等特定任务是有用的。

Published At
Categories with 技术
comments powered by Disqus