配置 Apache 2 控制浏览器缓存

今天我们在常见的配置浏览器缓存控制 Apache 2 专用服务器或 VPS 服务器。 缓存是减少服务器资源消耗、带宽利用率并为访问者提供更快的最终用户体验的绝佳工具。 要熟悉缓存概念,只需查看我们的 ‘什么是缓存?‘ 教程。

预检

本文涵盖所有 Apache 2 台运行 mod_expires 和 mod_headers 的服务器 Apache 模块。 这包括但不限于传统的专用服务器和 Cloud 运行许多不同 Linux 发行版的 VPS 服务器:

  • 核心管理的 CentOS 7* 服务器
  • 核心管理的 CentOS 6* 服务器
  • 完全托管的 CentOS 7 cPanel 服务器
  • 完全托管的 CentOS 6 cPanel 服务器
  • 完全托管的 CentOS 7 Plesk Onyx 17 Linux 服务器

注意:运行类似 Linux 发行版的自我管理服务器可以利用本文。 但是,并未专门针对自管理配置提供说明。

本文假定您熟悉以下基本系统管理概念:

  • 标准的 SSH 连接和基本导航 Linux 命令行 shell 环境
  • 在选定的系统编辑器中打开、编辑和保存文件(即 维姆、纳米等……)。
  • 对命令行管道有一定的了解 Linux I/O 重定向

验证模块

我们的服务器通常包括浏览器缓存控制所需的 mod_expires 和 mod_headers 模块。 然而,在我们配置指令之前,我们必须首先确保模块已经安装并且 Apache 2 准备好接受指令。 验证很简单。 我们将使用 apachectl -M 列出已安装的命令 Apache 模块同时通过管道输出 grep 模块名称 命令过滤结果以仅显示具有提供的 module_name 的模块,如下所示:

验证 mod_headers (也称为 Headers_module)通过复制和粘贴以下命令。

apachectl -M | grep header

… 将返回:

headers_module (shared)

验证 mod_expires (也称为过期模块)通过复制和粘贴以下命令。

apachectl -M | grep expires

… 将返回:

expires_module (shared)

运行命令时,这些模块必须出现在输出中。 如果它们没有出现在输出中,它将只是空白,这表明模块没有安装。 如果缺少模块,那么我们需要先安装它们,然后才能继续。

配置指令

我们可以使用以下 example 一种通用配置,通过延长常见静态文件的缓存持续时间来减少服务器资源的压力。 这些类型的文件通常不会在访问之间更改。 因此,无需在每次访问时都下载它们。 现代浏览器能够接受来自网络服务器的指令,这些指令提供关于内容应该被缓存多长时间的建议。 这 example 适用于大多数网站。 但是,您可能需要根据特定内容的需要添加/删除文件类型或调整寿命。

<IfModule mod_expires.c>
# Turn on the module.
ExpiresActive on
# Set the default expiry times.
ExpiresDefault "access plus 2 days"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresByType image/ico "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType text/html "access plus 600 seconds"
</IfModule>

每个指令的解释

这些是开放标签,并且只有在模块 mod_expires 安装在服务器上时才会处理它们之间的指令。

<IfModule mod_expires.c> ... </IfModule>

仅当超过 2 天未访问缓存时才下载所有文件。

ExpiresDefault "access plus 2 days"

仅当超过 1 个月未访问缓存文件时才下载文件。 这包括 jpg、jpeg、gif、png、css、javascript、flash、ico 和 x-icon 文件类型。

ExpiresDefault "access plus 2 days"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresByType image/ico "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"

仅在 10 分钟内未访问缓存副本时才下载文件。

ExpiresByType text/html "access plus 600 seconds"

您可以在 Apache mod_expires 在线文档.

执行

现在我们已经了解了如何配置这些指令,我们需要决定我们的实现方法。 这些指令通常有两种实现方法。 我们将这些分类为便携式或包含方法。

便携式方法

Portable Method 使用 .htaccess 文件来管理哪些目录受我们设置的 mod_expires 配置影响。 这些处理与任何其他 .htaccess 文件更改一样。

  1. SSH/FTP 到服务器
  2. 找到需要启用浏览器缓存的目录。
  3. 修改该目录中的 .htaccess 文件,如果还没有,则创建一个。
  4. 配置指令 上一节。
  5. Save 对文件的更改。
  6. 完毕。

有一个小的瓶颈警告与 .htaccess 文件。 此警告并非特定于 mod_expires,而是整体 Apache 警报包括 .htaccess 文件一般。 为了 .htaccess 文件工作, Apache 必须扫描通向目标文件的每个目录,以查找并应用任何 .htaccess 一路上找到的文件。 这可能会在某些服务器配置上造成 I/O 瓶颈。 我们建议对所有使用 Include 方法 Cloud VPS 服务器可以避免此类问题。

包含方法

与便携式方法相比,包含方法利用了 Apache 包括系统。 Apache 仅在启动时读取包含文件,因此这可以防止上述可移植方法部分中讨论的 I/O 瓶颈。

Include方法的使用一般有两种方式: 全球范围内 或者 每个网站. 任何一种方法都需要在服务器上找到并修改正确的包含文件。 要修改的正确文件取决于分发和服务器管理软件。 我们将在我们支持的各种 Liquid Web CentOS 服务器上讨论这两种方法的正确位置,并在 预检 上一节。

全球包括

全局应用 mod_expires 指令是直截了当的。 它将具有在整个服务器上启用所需指令的效果,影响每个运行的站点 Apache.

核心管理的 CentOS 6 和 7 服务器

1. 通过键入以下命令,在 /etc/httpd/conf.d/ 中创建一个名为 expires.conf 的文件:

vim /etc/httpd/conf.d/expire.conf

2. 将必要的指令添加到文件并保存更改。
该文件应如下所示:

<IfModule mod_expires.c>
# Turn on the module.
ExpiresActive on
# Set the default expiry times.
ExpiresDefault "access plus 2 days"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresByType image/ico "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType text/html "access plus 600 seconds"
</IfModule>

3. 完成,r电子负载 Apache 让服务器查看更改:

Service httpd reload

完全托管的 CentOS 6 和 7 cPanel 服务器

1.创建文件名 pre_virtualhost_global.conf /usr/local/apache/conf/includes/ 如果它不存在。

vim /usr/local/apache/conf/includes/pre_virtualhost_global.conf

2. 将必要的指令添加到文件底部并保存更改。
您的文件可能在此文件中包含其他指令,但底部应如下所示:

<IfModule mod_expires.c>
# Turn on the module.
ExpiresActive on
# Set the default expiry times.
ExpiresDefault "access plus 2 days"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresByType image/ico "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType text/html "access plus 600 seconds"
</IfModule>

3. 重新开始 Apache 服务:

/scripts/restartsrv_apache

如果运行 EasyApache 4:重启 Apache PHP-FPM 服务

/scripts/restartsrv_apache_php_fpm

完全托管的 CentOS 7 Plesk Onyx 17 Linux 服务器

1.在/etc/httpd/conf.d/中创建文件名expires.conf

vim /etc/httpd/conf.d/expire.conf

2. 将必要的指令添加到文件并保存更改。
该文件应如下所示:

<IfModule mod_expires.c>
# Turn on the module.
ExpiresActive on
# Set the default expiry times.
ExpiresDefault "access plus 2 days"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresByType image/ico "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType text/html "access plus 600 seconds"
</IfModule>

3.重启 Apache 服务:

Service httpd restart

每个网站包括

我们也可以使用 Apache 包括在每个虚拟主机级别上,以在单个网站的基础上启用浏览器缓存。 我们将在下面介绍如何在我们的 CentOS 系统上配置这些。

注:每个网站都有 虚拟主机,一个用于 HTTP(端口 80)连接,另一个用于 HTTPS(端口 443)连接。 每个虚拟主机彼此独立。 向 HTTP 虚拟主机添加更改不会自动应用于 HTTPS 虚拟主机,反之亦然。

核心管理的 CentOS 6 和 7 服务器

在核心管理的服务器上进行站点管理的确切方法由服务器所有者决定。 这可能因人而异。 我们将使用默认的 SSL 站点配置文件作为 example 关于如何配置每个网站包括浏览器缓存。 找到必要站点的配置文件后,请执行以下步骤:

1. 找到并打开正在修改的站点的配置文件。

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

2. 在其配置文件中找到站点的虚拟主机行。 虚拟主机节如下所示 example:

<VirtualHost _default_:443>

</VirtualHost

3. 在虚拟主机行之间应用所需的 mod_expires 指令。
结果应类似于以下内容 example:

<VirtualHost _default_:443>

   <IfModule mod_expires.c>
   # Turn on the module.
   ExpiresActive on
   # Set the default expiry times.
   ExpiresDefault "access plus 2 days"
   ExpiresByType image/jpg "access plus 1 month"
   ExpiresByType image/gif "access plus 1 month"
   ExpiresByType image/jpeg "access plus 1 month"
   ExpiresByType image/png "access plus 1 month"
   ExpiresByType text/javascript "access plus 1 month"
   ExpiresByType application/javascript "access plus 1 month"
   ExpiresByType application/x-shockwave-flash "access plus 1 month"
   ExpiresByType text/css "now plus 1 month"
   ExpiresByType image/ico "access plus 1 month"
   ExpiresByType image/x-icon "access plus 1 month"
   ExpiresByType text/html "access plus 600 seconds"
   </IfModule>

</VirtualHost>

4.重启 Apache 服务

Service httpd restart

完全托管的 CentOS 6 和 7 cPanel 服务器

cPanel提供了丰富的模板系统,可以用来修改 Apache 根据需要的行为。 需要一个特定的目录结构来确保我们的修改通过更新、升级和重新启动持续存在。 该系统在 EasyApache 3 和 EasyApache 4 系统上的工作方式相同。

每个站点都可以处理其自定义包含文件集。 这些需要位于以下位置:


HTTP 虚拟主机:
/etc/apache2/conf.d/userdata/std/2_4///.conf


HTTPS 虚拟主机:
/etc/apache2/conf.d/userdata/ssl/2_4///.conf

上面的路径中有三个变量需要调和:

  • <用户> 替换为必要帐户的用户名。
  • <域> 替换为站点的完全限定 domain.tld 名称。 (减去 www. 前缀)
  • <包括名称> 替换为包含文件的名称。 这应该反映包含的目的。 EG expires.conf

1. 这些 目录默认不存在,需要创建。 一旦你知道了细节,这可以很容易地完成 mkdir -p 像这样的命令:

HTTP 虚拟主机:

mkdir -p /etc/apache2/conf.d/userdata/std/2_4/myuser/example.com/

HTTPS 虚拟主机:

mkdir -p /etc/apache2/conf.d/userdata/ssl/2_4/myuser/example.com/

2. 创建目录后,我们现在可以创建包含文件,将其命名为 expires.conf。
HTTP 虚拟主机:

vim /etc/apache2/conf.d/userdata/std/2_4/myuser/example.com/expires.conf

HTTPS 虚拟主机:
vim /etc/apache2/conf.d/userdata/ssl/2_4/myuser/example.com/expires.conf

3. 将必要的 mod_expires 指令添加到两个 expires.conf 文件中。 完成后它们应该与此类似:

<IfModule mod_expires.c>
# Turn on the module.
ExpiresActive on
# Set the default expiry times.
ExpiresDefault "access plus 2 days"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresByType image/ico "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType text/html "access plus 600 seconds"
</IfModule>

4. 现在我们需要让 cPanel 重建 Apache 应用新包含的配置。

/usr/local/cpanel/scripts/rebuildhttpdconf

5.重启 Apache 更新运行配置:
/usr/local/cpanel/scripts/restartsrv_apache

6.如果运行EasyApache 4,重启 Apache PHP-FPM 服务也是:
/usr/local/cpanel/scripts/restartsrv_apache_php_fpm

在 cPanel 中还有其他处理虚拟主机的方法。 一个用户将包含应用于所有主机或所有 HTTPS 主机甚至所有主机。 有关 cPanel 虚拟主机包含系统的更深入解释, 访问 官方 cPanel 在线文档.

完全托管的 CentOS 7 Plesk Onyx 17 Linux 服务器

Plesk 提供了一个强大的包含和模板系统,用于在单个虚拟主机的基础上修改虚拟主机条目。 这些在以下文件中完成:

注意:我们需要更换 example.com 与您的域名(减去 www. 前缀)。
/var/www/vhosts/system/example.com/conf/vhost_ssl.conf

这里的目录结构应该已经存在。 但是,这些 vhost.conf 和 vhost_ssl.conf 文件默认不存在,需要创建。

1. 创建所需的包含文件:
HTTP 虚拟主机:

touch /var/www/vhosts/system/example.com/conf/vhost.conf

HTTPS 虚拟主机:
touch /var/www/vhosts/system/example.com/conf/vhost_ssl.conf

2. 应用必要的 mod_expires 指令修改 vhost.conf 和 vhost_ssl.conf。 完成后,每个文件应类似于以下内容:

<IfModule mod_expires.c>
# Turn on the module.
ExpiresActive on
# Set the default expiry times.
ExpiresDefault "access plus 2 days"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresByType image/ico "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType text/html "access plus 600 seconds"
</IfModule>

3. 让 Plesk 为相关站点重建配置。
/usr/local/psa/admin/sbin/httpdmng --reconfigure-domain example.com

4.重启 Apache 服务:
service httpd restart

Plesk 模板和包含系统非常强大,允许集成许多其他常见的 Apache 指令。 访问 Plesk Onyx 在线文档 了解更多关于利用其功能的信息。