通过在Apache中启用缓存来提高网站性能
在Apache中配置缓存
Apache带有三个用于缓存内容的模块,一个模块启用内容,其余两个模块确定缓存存储在磁盘或者内存中的位置。确定用于缓存存储的模块取决于可用硬件资源和性能要求。
从磁盘提供服务速度较慢,但价格较低。从内存提供服务的速度很快,但是在成本和资源消耗上都很昂贵。但是,可以通过将其放置在SSD固态硬盘而不是传统的机械磁盘上来提高磁盘缓存性能。
- 通过验证Apache服务器配置文件中是否存在以下注释,确保Apache正在加载cache_module。
LoadModule cache_module modules/mod_cache.so
- 对于磁盘缓存,请确保Apache正在加载disk_cache_module。查找以下行,不加注释。
LoadModule disk_cache_module modules/mod_disk_cache.so
- 将以下行添加到Apache服务器配置文件(对于全局)或者VirtualHost指令内部(已本地化的应用程序)。
CacheEnable disk / CacheRoot /webapps/cache/app1 CacheDefaultExpire 3600 CacheDisable /wp-admin
缓存启用磁盘/ |
---|
将相对目录“/”缓存到磁盘 |
设置缓存存储目录,所有缓存内容都将保存在该目录中 |
设置相对于原始请求日期的默认过期日期(以秒为单位) |
禁用对选项后面的相对路径的缓存。敏感区域和那些不应该被缓存的应该被添加到这里 |
设置内容过期
缓存需要有效期才能起作用。如果内容没有到期日期,则缓存无法确定其是否陈旧。
使用Apache的Mod_Expires
通过此模块,我们可以根据类型或者匹配字符串整体或者单独定义内容的过期日期。
- 确保将模块加载到Apache中。打开服务器配置文件(在CentOS中为httpd.conf),然后查找此行。如果用'#'注释掉,请取消注释。
LoadModule expires_module modules/mod_expires.so
- 将以下行添加到Apache服务器配置,虚拟主机配置,目录指令或者.htaccess中,具体取决于我们希望在何处设置缓存策略。
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day" </IfModule></pre>
打开mod expires |
设置所有内容的默认过期日期。Access+1天将过期时间设置为内容的访问时间+1天,这意味着它将被缓存24小时 |
- 如果我们要为特定的内容类型分配不同的到期值,除了或者不使用ExpiresDefault选项,我们可以使用ExpiresByType选项。这里有一些例子:
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day" ExpiresByType image/jpg "access plus 5 days" ExpiresByType image/jpeg "access plus 5 days" ExpiresByType image/gif "access plus 5 days" ExpiresByType image/png "access plus 5 days" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year" </IfModule>
在Web应用程序中使用HTTP标头
Web应用程序可以使用HTTP标头参数来定义到期日期和最后修改日期。这为开发人员或者应用程序提供了内容新鲜度控制。如何执行此操作取决于应用程序。
- HTML使用Meta标记并定义内容年龄。在下面的示例中,将缓存设置为专用(仅请求客户端),并将最长生存时间设置为1小时(3600秒)。
<meta http-equiv =" Cache-control" content =" private,max-age:3600">
- PHP使用Header()函数设置文档标题中的内容期限。
header("Cache-Control: private, max-age=3600");
缓存非过期内容
有时我们需要缓存未设置到期日期的内容。如前所述,默认情况下,有效期是缓存机制正常运行所必需的。但是,我们可以指示Apache将默认的到期日期添加到未定义到期日期的内容上,并对其进行缓存。 CacheIgnoreNoLastMod允许我们执行此操作。
- 将CacheIgnoreNoLastMod选项的值为On添加到启用缓存Apache服务器配置文件或者虚拟主机配置文件的位置。
CacheEnable disk / CacheRoot /webapps/cache/app1 CacheDefaultExpire 3600 CacheDisable /wp-admin CacheIgnoreNoLastMod On
防止浏览器缓存内容
上述缓存配置的问题是应用程序的内容缓存在两个位置:客户端和服务器上。如果我们更新了内容并希望用户立即看到它,则他们的本地缓存版本可能还没有过期。我们可以缩短到期时间,但是之后我们可能完全无法实现缓存的目的。
而是通过仅在服务器上启用缓存来完全控制缓存。强制Web浏览器针对每个请求从服务器获取内容,但是例如,除非已对内容进行修改,否则它会提供预处理的Java或者PHP内容。这样可确保用户始终看到最新版本,而不会浪费CPU周期或者不必要的RAM重新处理。
- 将CacheIgnoreCacheControl选项添加到已启用缓存的位置,其中Apache的服务器配置文件或者虚拟主机的配置值为On。这将导致Apache忽略浏览器内容刷新请求。在可能的情况下,所有内容都将从服务器的缓存中提供,直到过期为止。
CacheEnable disk / CacheRoot /webapps/cache/app1 CacheDefaultExpire 3600 CacheDisable /wp-admin CacheIgnoreNoLastMod On CacheIgnoreCacheControl On
- 保存更改。
- 重新启动Apache使更改生效。
WordPress和其他应用程序框架
诸如WordPress之类的框架以及与CodeIgniter相似的框架都通过Index.php路由所有内容。根据我们编写mod_rewrite规则的方式,缓存的内容将无法正确显示。我们可能会发现一个请求的页面,类别等的内容显示在实际请求的位置。
为了解决这个问题,我们需要确保在缓存和提取内容时,Apache的缓存考虑添加到index.php末尾的参数。修改index.php的重写规则,如以下示例所示。
# WordPress Permalink rewrites RewriteBase / RewriteRule ^index.php$ – [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php/ [L]