在服务器负载和网站速度方面优化WordPress的步骤?

时间:2010-08-12 作者:Paul Sheldrake

除了安装W3 Total Cache或其他缓存插件外,我还可以采取哪些步骤来确保我的主题和网站尽可能快地运行。

15 个回复
SO网友:Travis Northcutt

您可以在Nginx上安装WordPress。有许多资源可以帮助您:

最后一个链接中的一些性能信息(看起来与其他链接的设置略有不同):

所以我决定在wordpress前面尽可能多地放置一个代理到静态缓存。所有未经身份验证的流量都直接从nginx文件缓存提供服务,将一些请求(如RSS提要生成)从每秒6页提高到每秒7000多页。哦。Nginx还处理日志和gzip,让较重的后端apaches做他们最擅长的事情:只在需要时提供动态wordpress页面。

。。。

在nginx上–它的效率如此之高,令人恐惧。我从未见过它使用超过10到15兆的内存和一点CPU,即使是在我们最重的负载下。我们的ganglia图没有撒谎:我们将内存需求减半,传出网络吞吐量翻倍,负载完全平衡。自从我们建立这个系统以来,我们基本上没有遇到任何问题。

SO网友:CAD bloke

为css、图像、JavaScript等不需要为每个页面视图重新下载的内容设置客户端过期时间。到目前为止,这对我的网站加载时间影响最大。最快的下载是从未发生过的下载。。。

# BEGIN Expire headers
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 7200 seconds"
  ExpiresByType image/x-icon "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 2592000 seconds"
  ExpiresByType text/javascript "access plus 2592000 seconds"
  ExpiresByType application/x-javascript "access plus 2592000 seconds"
  ExpiresByType text/html "access plus 7200 seconds"
  ExpiresByType application/xhtml+xml "access plus 7200 seconds"
</IfModule>
# END Expire headers

# BEGIN Cache-Control Headers
<IfModule mod_headers.c>
  <FilesMatch "\\\\.(ico|jpe?g|png|gif|swf|gz)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch "\\\\.(css)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch "\\\\.(js)$">
    Header set Cache-Control "max-age=2592000, private"
  </FilesMatch>
<filesMatch "\\\\.(html|htm)$">
Header set Cache-Control "max-age=7200, public"
</filesMatch>
# Disable caching for scripts and other dynamic files
<FilesMatch "\\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
# END Cache-Control Headers
您可以尽可能预先准备gzip(7-zip是一个很好的工具)&;将其上载到刚才gzip的文件所在的位置。改变htaccess提供预压缩文件,如下所示。这里需要注意的是,如果/当您更新内容时,您需要记住重新gzip它们。除了解析之外,这还减少了CPU开销。htaccess。

RewriteEngine on
#Check to see if browser can accept gzip files. If so and we have it - serve it!
ReWriteCond %{HTTP:accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
#make sure there\'s no trailing .gz on the url
ReWriteCond %{REQUEST_FILENAME} !^.+\\.gz$
#check to see if a .gz version of the file exists.
RewriteCond %{REQUEST_FILENAME}.gz -f
#All conditions met so add .gz to URL filename (invisibly)
RewriteRule ^(.+) $1.gz [QSA,L]
这只是一个粗糙的答案。这个主题有很多变化。我在博客上发表了这方面的文章,并在网站上添加了很多更深入的文章http://icanhazdot.net/2010/03/23/some-wordpress-stuff/. 阅读这些内容,更重要的是,我所指的参考资料——它们是很好的资源。

请注意,如果您经常修补,那么用户将需要刷新其缓存。

我发现一个非常有用的插件是wp-minify. 要注意的是,你应该排除页面特定的项目(联系人表单、首页滑块等),这样你就不会重新下载每个页面的整套css、JS等。这是缩小、合并和;压缩你的基线CSS、JS等。它大大减少了http请求。Wp minify可以很好地使用超级缓存,也可以使用我在上面详细介绍的到期标头。

在Firebug(Firefox)或类似软件中使用Yslow来监控您的http请求,以及哪些是压缩的,哪些不是压缩的。看看里面的过期标题。你很快就会看到你可以改进的地方。

SO网友:Dougal Campbell

尽可能减少你运行的插件数量,只满足你真正需要的插件。尤其要注意在每次加载页面时添加javascript和CSS代码的插件,即使这些代码没有在页面上使用。

如果您是从头开始创建自己的主题,请分解CSS,以便仅在需要时加载特定页面模板或视图类型(单篇文章、存档、类别等)所需的功能。

配置W3TC以使用CDN(如Amazon CloudFront或W3TC支持的任何其他CDN)。

查看缩小选项是否适合您(一些插件生成的js/css不能很好地缩小,因此请确保在激活缩小功能后测试您的站点)。

如果完全控制MySQL服务器,请确保已打开query\\u缓存。使用MySQL tuning script 找到其他优化数据库配置的方法。

如果由于某种原因使用CDN有问题,请在apache设置中配置mod_expires。为静态类型(如图像、css、javascript、视频、音频等)设置尽可能长的过期时间。

SO网友:Annika Backstrom

memcached 并使用object cache 减少数据库查询的数量。这会缓存数据库中的数据,而不是页面。不确定w3 total cache是否已执行此操作。

确保您正在运行操作码缓存,如APC. (还有其他几种。)

SO网友:Volomike

除了使用像wp cache这样的磁盘缓存插件外,还可以将日志放在设置了“noatime”属性的主机卷上。否则,使用SSH连接到您的主机(如果您的webhost提供),并每隔几天对您的文件例行运行以下命令:

chattr -R +A ~/*
~/*表示“我的主目录下的文件”。你可以根据自己的意愿改变这条路。如果您的Web主机提供,您还可以在cpanel中的cron作业上设置此选项。

有关atime属性的更多信息,请参阅this. 它大大提高了Linux磁盘读取性能。

有时你的网站会被蜘蛛攻击。你可以使用SpyderSpanker或Chennai Central之类的工具来过滤那些不会给你的网站带来更多页面排名的爬行器,只会降低它的速度,然后通过向它们发送随机的HTTP 304未修改消息来限制好的爬行器(如Google、Bing等)。

我看到的另一件事就是写得很差的插件。如果您学习了如何制作插件,您就会开始看到一些插件的编码效率低下,甚至会发现定时炸弹,例如一个数据库表,它会不断填充,而且永远不会被清除,存储诸如传入连接数据之类的内容。

除了这里的所有其他解决方案之外,您还可以通过在多台web节点PC上托管博客来创建WordPress web场,这些PC都连接回一个数据库和一个文件磁盘卷(例如通过NFS装载的卷)。退房Ultra Monkey 如何让这一切继续下去。

SO网友:ZaMoose

我脑海中浮现出几个答案:

1) 尽可能/实际地将JavaScript和CSS连接在一起,从而最大限度地减少浏览器向主机发出的HTTP请求数。

2) 将尽可能多的图像/媒体服务转移到第三方CDN上,尤其是在使用共享托管的情况下。

3) 尝试减少您在首页上显示的帖子数量,以减少总呈现时间。

3a)尝试使用一个主题,在头版上完整展示一些特色帖子,并将所有其他旧帖子作为摘录。

SO网友:fischi

缓存WordPress菜单还可以提高性能。特别是如果你有很多页面或一个巨大的菜单结构,这应该被考虑。

分两个简单步骤完成。首先,创建一个获取或创建菜单的函数,而不是调用wp_nav_menu 直接地

function get_cached_menu( $menuargs ) {

    if ( !isset( $menuargs[\'menu\'] ) ) {

        $theme_locations = get_nav_menu_locations();
        $nav_menu_selected_id = $theme_locations[$menuargs[\'theme_location\']];
        $termslug = get_term_by( \'id\', $nav_menu_selected_id, \'nav_menu\' );
        $transient = \'menu_\' . $termslug->slug . \'_transient\';

    } else {

        $transient = \'menu_\' . $menuargs[\'menu\'] . \'_transient\';

    }


    if ( !get_transient( $transient ) ) { // check if the menu is already cached

        $menuargs[\'echo\'] = \'0\'; // set the output to return
        $this_menu = wp_nav_menu( $menuargs ); // build the menu with the given $menuargs
        echo $this_menu; // output the menu for this run
        set_transient( $transient, $this_menu ); // set the transient, where the build HTML is saved

    } else {

        echo get_transient( $transient ); // just output the cached version

    }

}
在主题中,替换wp_nav_menu她和谁在一起get_cached_menu. 现在,每次调用菜单时,都有一个数据库查询,而不是整个菜单构建。

菜单不会经常更改,但你也必须连接到wp_update_nav_menu 删除旧瞬态的操作。

这样做:

add_action(\'wp_update_nav_menu\', \'my_delete_menu_transients\');

function my_delete_menu_transients($nav_menu_selected_id) {

    $termslug = get_term_by( \'id\', $nav_menu_selected_id, \'nav_menu\' );

    $transient = \'menu_\' . $termslug->slug . \'_transient\';

    delete_transient( $transient ); 

}
菜单将在下次调用页面时生成,并使用缓存版本,直到有人再次更新菜单。

Updated Version

感谢helgatheviking指出Slug和ID之间的错误。我更新了这些函数,使其既适用于theme_positionmenu (用于直接调用菜单)。

菜单总是使用菜单的名称保存,而不是主题中的位置。

SO网友:hakre

使用为优化而修剪的数据库类。我们在使用自己的代码以减少内存使用和数据库访问速度方面取得了良好的经验。接下来,您可以通过一些小的更改来优化数据库结构本身,这些更改也会起到很大的作用。

部分数据库类代码可以在wordpress trac中找到,它没有进入core(Ticket #11799 and related).

SO网友:RolandoMySQLDBA

对于一个流量很大的站点,您应该调整所有MySQL缓冲区,以适应当前的内容。不管WordPress的版本是什么,the MySQL layer can have its configuration computed.

事实上,如果您有InnoDB数据,但没有启用InnoDB\\u file\\u per\\u table,you need to cleanup InnoDB by segmenting each table into its own physical tablespace. 可以进行适当的MySQL调优even if you have a limited hardware. 有many scenarios for doing such InnoDB optimizations.

嗯,你不能为我的计划好的设置。cnf,而不知道要配置的数据量。您必须定期将当前数据集从生产环境加载到暂存环境中,执行优化,并在my中提供要配置的数字。生产服务器的cnf。

SO网友:Scott M.

您可以启用全局output compression. 如果浏览器支持,这将自动gzip所有内容。这大大减少了传输的文件大小,但确实增加了CPU负载。

SO网友:Chris_O

我最近在WordCamp Houston. 以上所有建议都很好,重要的是确保所有前端都得到了充分优化,然后就可以开始处理缓存和服务器性能问题了。

渐进式渲染将使页面感觉更快,因为用户将在页面完全加载之前看到页面内容。要做到这一点,请确保任何阻塞js都位于页面的最底部,css位于顶部。

此外,如果您使用许多社交媒体按钮,您可以自定义脚本,使其在页面完全加载后加载到iframe中。我写了一篇关于如何使用TweetMeMe re-tweet按钮的教程(自从Twitter发布了自己的retweet按钮后,现在已经过时了),但仍然可以应用于其他共享按钮。

为了提高服务器性能,请将Nginx作为静态内容的前端代理,Apache处理繁重的PHP和MySQL提升。

SO网友:stevek-pro

由于还没有人提到这一点,结合任何LAMP设置来提高服务器性能的最重要步骤之一就是切换到apache worker线程和mod\\u fcgid。

这释放了我的虚拟专用服务器上500MB的内存。

SO网友:icc97

检查插件减速指南Page Load Time, 这会将计时器添加到页面页脚。实际上只有四行代码:

<?php
function ur_pageload_footer() {
    printf(__(\'Page in %s seconds\', \'pageload\'), timer_stop());
}
add_action(\'wp_footer\', \'ur_pageload_footer\')
然后:

  1. 创建一个电子表格
  2. 列出所有活动插件,并将它们放在那里
  3. 刷新页面三次,记录每一次页面加载时间
  4. 逐个检查插件,将其停用
  5. 重复步骤3
  6. 注意停用插件的顺序
    1. 电子表格应该是这样的

      +-------+-------+-------+-------+--------+
      | Run 1 | Run 2 | Run 3 | Order | Plugin |
      
      因此,如果停用某个插件后,页面响应时间显著增加,那么您可以看看是否可以避免使用该插件。

      我发现有两个插件导致“显著”的速度减慢mqtranslate 和(相当老但很好的)Multi-level Navigation Plugin.

SO网友:Antony Agnel

坚持使用W3 Total Cache插件在WordPress中实现缓存功能。从插件的设置页面启用页面缓存和数据库缓存。确保选择“可选PHP缓存(APC/APCu)”作为缓存机制。不要在W3 Total Cache中启用任何缩小,因为您有很多机会破坏站点的外观和/或功能。我们将把它留给Cloudflare。

配置完其余插件功能后,请为您的网站设置Cloudflare。确保在“Extensions”下的W3 Total Cache设置中也启用了Cloudflare。

Cloudflare是一个内容交付网络,它缓存站点中的所有静态内容(图像文件、CSS、JS、文档等),并从其全球服务器将其提供给访问者。这有助于加快页面加载时间并减少服务器上的负载。获取Cloudlfare签出缓存的文件类型列表this list. 此外,Cloudflare还有一个免费计划。

在Cloudflare中,将缓存级别设置为standard,并将浏览器缓存过期时间设置为至少大于20小时。启用始终在线™ 因此,即使您的服务器宕机,Cloudflare也会从缓存中为您的网站的静态页面提供服务。还可以启用其自动缩小功能(还记得我为什么要求您不要启用缩小是W3 Total Cache吗?因为Cloudflare做得更好!)然后设置火箭装载机™ 至自动。

以下是火箭装载机的工作节选:

通过捆绑JavaScriptFile,甚至第三方资源来减少网络请求的数量,以避免减慢页面呈现速度。

异步加载脚本,包括第三方脚本,以便它们不会阻止页面内容立即加载。

在本地缓存脚本(使用本地存储,在大多数浏览器和智能手机上可用),因此除非必要,否则不会重新获取脚本。

可以找到更多信息here.

如果可能,切换到WordPress的Genesis框架,因为它们没有any 膨胀。Genesis的构建考虑到了速度和SEO。我自己也做过测试,我的PageSpeed成绩很好。此外,如果您使用的是Genesis,那么不要忘记在W3 Total cache设置中启用片段缓存。

由于现在您正在使用Cloudlfare作为CDN,因此可以使用诸如“Imagify”或“Compress JPEG&;等插件;PNG图像\'通过TingPNG压缩图像。两者都是WordPress上提供的免费插件。org插件库。此外,Imagify支持强大的有损压缩算法。

最后,从WordPress存储库中安装“从静态资源中删除查询字符串”插件,以便从CSS&;等静态资源中删除查询字符串;JS文件。这是因为资源具有“?”或“&;”一些代理缓存服务器(记住,Cloudflare也是一个代理缓存服务器)不会缓存URL中的内容。

然后安装“使用谷歌库”插件。该插件允许WordPress站点使用Google的AJAX库API CDN,而不是直接从WordPress安装中提供这些文件。

其中一些好处是:

增加用户缓存这些文件的可能性

  • 减轻服务器的额外负载
  • 使用压缩版本的库(如果可用)
  • 谷歌的服务器设置为与请求浏览器协商HTTP压缩

    希望这能回答您关于优化WordPress以减少服务器负载的问题。

  • SO网友:Jesse Nickles

    对于整个服务器;堆栈(&Q);除此之外,我还建议你this question (还有我的答案),其中讨论了几个项目,包括DNS、SSL、数据中心、操作系统和LEMP堆栈。我的回答的本质是将KVM云服务器与Nginx、PHP-FPM和Redis对象缓存一起使用。

    但这条线索的本质更多地集中在WordPress本身以及相关的最佳实践上,因此我将从更狭义的角度提及几件事:

    首先,way too much emphasis is put on cache "plugins" 在WordPress社区。这是因为共享Apache主机仍然占据着市场的主导地位,并且由于各种可用性原因,大多数低端web主机在默认情况下都避免激活服务器级缓存(如果有的话)。

    在提出这一问题后的几年里,有几位;“保险费”;web主机变得越来越流行,其中一些主机的主机内置了服务器级缓存(这些缓存通常构建在Nginx、Redis或Varnish上,尽管一些基于cPanel的主机现在使用Litespeed缓存)。Nginx FastCGI缓存可以说是服务器级缓存中最健壮的选项,也是最不容易发生冲突的。WordPress的某些缓存插件确实与Nginx集成,但这相当愚蠢,只会增加更多的膨胀。

    其次a CDN is all but expected these days. “许多”;“保险费”;默认情况下,主机提供CDN,用于从世界各地的边缘节点为您的静态资产提供服务,或者您可以使用第三方服务。最流行的选项是CloudFlare,因为它是免费的CDN(和SSL代理)。请记住,CDN不提供HTML内容,这就是为什么服务器级缓存很重要的原因。

    第三,在我的经验中(除了托管),性能低下的最常见原因是第三方脚本和资产的问题——换句话说,items that your website is loading from other servers, 例如跟踪和广告脚本、小部件和表单、视频和媒体,以及许多其他内容。即使这些东西(在后台)加载异步/延迟,由于经常加载的资产的巨大规模和数量,仍然可能导致重大问题。有时,插件或主题也会导致这种情况:例如,我看到WP主题加载了20多种谷歌字体变体!

    第四,是教育问题general theme and plugin bloat. 他们中的一些人不仅嵌入了远程服务器的第三方资产,而且他们中的一些人也编写了可怕的代码,导致数据库崩溃等。即使代码质量很好,也有太多的站长认为他们可以使用非常臃肿的主题以及页面生成器插件、页面生成器附加组件和大量其他插件,然后简单地安装一个缓存/速度插件来缩小或延迟加载所有内容。。。不,事情不是这样的。拥有数百个DOM元素和数十个CSS/JS文件总是会导致性能问题,无论发生什么。最快的加载选项将始终是一个带有硬编码HTML的自定义编码WordPress主题,一个单一样式。css文件(内联加载),以及最少量的轻量级和编码良好的插件。。。时期

    最后,(是的,常见的)是avoiding "stupid" mistakes. 我数不清有多少次我看到一个客户端网站花了30多秒加载,却发现他们的主题试图加载几个丢失的文件,导致404个未找到的错误,或者他们的主页背景;动画“;大小为50MB!

    记住,没有;“快速修复”;缓存插件,你可以安装,可以取代常识的解决方案,并在你的设计决策合理。

    结束

    相关推荐