关于服务器负载优化WordPress的步骤?


Answers:


32

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

来自最后一个链接的一些性能信息(设置似乎与其他链接有所不同):

因此,我决定尽可能在wordpress前面放置一个代理以实现静态缓存。所有未经身份验证的流量都直接从nginx文件缓存中提供,将某些请求(例如RSS feed生成)从6页/秒提高到7000+页/秒。钱币。Nginx还处理日志记录和gzip压缩,使较重的后端修补程序可以发挥最大作用:仅在需要时才提供动态wordpress页面。

...

在nginx上–它是如此高效,令人恐惧。我从未见过即使在我们最重的负载下,它也不会使用超过10到15兆的RAM和一瞬间的CPU。我们的神经节图不会说谎:我们将内存需求减少了一半,将传出网络吞吐量提高了一倍,并完全平衡了负载。自设置以来,我们基本上没有任何问题。


有没有关于使用Nginx节省速度的统计信息?
Mike Lee,2010年

迈克,我添加了另一个链接,以及该帖子中的一些信息。
特拉维斯·诺斯卡特

我将主博客从运行Apache的1G服务器迁移到运行Nginx的512M服务器。尽管RAM减少,但运行更平稳。诚然,我还有其他服务正在1G服务器上运行(电子邮件,imap,mailman以及其他一些低流量网站)。
Dougal Campbell 2012年

在nginx上运行WordPress的NB与将nginx用作Wordpress之前的代理缓存不同。
山姆

26

设置客户端有效期,例如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

您可以合理地预压缩所有文件(7-zip是一个很好的工具),然后将其上传到与刚刚压缩的文件相同的位置。更改.htaccess以提供预压缩的文件,如下所示。需要注意的是,如果/当您更新内容时,您需要记住将其重新压缩。除了解析.htaccess之外,这还减少了CPU开销。

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请求以及压缩的内容和未压缩的内容。也可以查看其中的到期标头。您很快就会看到可以改善的地方。


2
如果有人计划复制/粘贴您的重写,则存在一个“ ReWrite”实例应予以纠正。
杰里米·L 2010年

2
哪个实例?
CAD bloke'Dec

@Nerdling您能否指出哪个实例需要修复?我想使用上面的代码。
helgatheviking 2012年

它可能与Apache的更高版本中弃用的mod gzip有关。最近,我不得不将其更改为mod deflate。
CAD bloke

2
对于.htaccess的一组好的默认值,HTML5 Boilerplate项目提供了一个模板。 github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess
Paul Sheldrake

21

将您运行的插件数量减少到仅实际需要的数量。特别要注意的是,即使在页面上未使用该代码时,也会在每次页面加载时添加javascript和CSS代码的插件。

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

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

查看“缩小”选项是否对您有用(某些插件生成的js / css无法很好地缩小,因此请确保在激活“缩小”功能后测试您的网站)。

如果您完全控制MySQL服务器,请确保已打开query_cache。使用MySQL调整脚本查找其他方法来优化数据库配置。

如果由于某些原因使用CDN有问题,请在您的Apache设置中配置mod_expires。对于图像,CSS,JavaScript,视频,音频等静态类型,请设置合理的有效期限。


14

运行memcached并使用对象缓存来减少数据库查询的数量。这将从数据库而不是页面缓存数据。不知道w3-total-cache是​​否已经这样做。

确保您正在运行诸如APC之类的操作码缓存。(还有其他几种可用。)


2
APC确实使wordpress的响应速度更快,尤其是管理页面。但是,WP-SuperCache和APC之间存在一些潜在的配置冲突。这些似乎不会影响W3缓存。
WhSteSidE

Mark Jaquith对此发表了出色的文章:WordPress的APC对象缓存后端。您可以在APC上愉快地使用batcache
icc97 2014年

8

除了使用磁盘缓存插件(如wp-cache)之外,还可以将博客放在具有“ noatime”属性设置的主机卷上。否则,通过SSH进入您的主机(如果您的网络主机提供了此功能),然后每隔几天就在您的文件上定期运行以下命令:

chattr -R +A ~/*

〜/ *表示“我的主目录下的文件”。您可以根据需要更改该路径。如果您的网络主机提供了此功能,也可以在cpanel中的cron作业上进行设置。

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

有时,您的网站被蜘蛛锤打。您可以使用SpyderSpanker或Chennai Central之类的工具来过滤蜘蛛,这些蜘蛛无助于将更多网页排名带到您的网站上,而只是放慢速度,然后通过随机发送蜘蛛来节制好蜘蛛(例如Google,Bing等) HTTP 304未修改的消息。

我看到的另一件事就是插件编写得不好。如果您学习如何制作插件,您将开始了解某些插件的编码效率低下,甚至发现定时炸弹,例如填充,填充但永不清除的数据库表,用于存储诸如传入的连接数据之类的东西。

除了此处的所有其他解决方案之外,您还可以通过将博客托管在几台Web节点PC上来创建博客的WordPress Web场,这些PC全部连接回一个数据库和一个文件的单个磁盘卷(例如通过NFS挂载的卷) )。查看Ultra Monkey,了解如何进行所有操作。


7

我的头上有几个答案:

1)在可能/可行的情况下,通过连接JavaScript和CSS来最小化浏览器必须向您的主机发出的HTTP请求的数量。

2)尽可能将服务于第三方CDN的图像/媒体卸载到第三方CDN,尤其是在使用共享主机的情况下。

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

3a)尝试使用在首页上完整显示一些特色帖子的主题,以及所有其他较旧的帖子作为摘录。


2
+1减少了帖子数量,这极大地促进了免费活动。人们真的不需要看到10个旧帖子,我只将conf设置为8个。
ripper234 2011年

7

缓存WordPress菜单还可以提高性能。特别是如果您有很多页面或庞大的菜单结构,则应考虑这一点。

只需2个简单步骤即可完成。首先,创建一个获取或创建菜单的函数,而不是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为s get_cached_menu。现在,每次调用菜单时,您只有一个Databasequery,而不是整个Menubuilding。

菜单不会经常更改-但是您还必须加入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 ); 

}

下次调用该页面时将生成菜单-并使用缓存的版本,直到有人再次更新菜单为止。

更新后的版本

感谢@helgatheviking指出了和ID之间的错误。我更新了功能,使其与theme_positionmenu(用于直接调用菜单)一起使用。

菜单始终以菜单名称而不是主题中的位置保存。


这似乎是一个很酷的主意。我的代码有问题。当我们清除瞬态时,the $nav_menu_selected_id是一个数字,而在调用get_cached_menu()the时menu_id是一个字符串变量,因为该参数成为该<ul>元素的CSS ID 。
helgatheviking 2012年

5

使用为优化而修剪的数据库类。我们在编写自己的代码方面有很好的经验,可以减少内存使用量和数据库访问速度。紧接着,您可以通过做一些同样有用的小更改来优化数据库结构本身。

数据库类代码的一部分可以在wordpress 跟踪中找到,但没有进入内核(票号11799及相关)。


有趣的解决方案。如果有人也有兴趣,这是Trac Ticket的URL:core.trac.wordpress.org/ticket/11799
Mike Lee 2010年

4

对于一个人流量大的站点,您应该针对当前内容调整所有MySQL缓冲区。无论WordPress的版本如何,MySQL层都可以计算其配置

实际上,如果您具有InnoDB数据而未启用innodb_file_per_table,则需要通过将每个表分段到其自己的物理表空间中来清理InnoDB即使硬件有限,也可以进行适当的MySQL调整。有很多方案可以进行这种InnoDB优化

恕我直言,您无法在不知道要配置的数据量的情况下为my.cnf规划良好的设置。您将必须定期将生产中的当前数据集加载到暂存环境中,进行优化,并忽略要在生产服务器的my.cnf中配置的数字。


3

您可以启用全局输出压缩。如果浏览器支持的话,这将自动压缩所有输出内容。这将大大减少传输文件的大小,但会增加CPU负载。


这将使您的网站“感觉”变慢得多。雅虎!技术文档建议您在头尾之后和主体开始之前冲洗代码,以便脚本和样式可以开始加载。通过缓冲整个页面,可以防止这种情况的发生,因此页面“感觉”很慢,因为用户必须等待WordPress呈现整个页面,然后用户才能看到任何内容。
WhSteSidE

Scott并不是在谈论缓冲整个页面,而是在使用apache输出压缩。那是不同的,只有当您通过输出缓冲区使用PHP输出压缩时,这才具有您模糊描述的缺陷。但是总之,并不是总之,因为最后,缓冲输出可以使事情变得更快。这与服务器上的I / O有关。
hakre

3

我最近在休斯敦WordCamp上谈到了这个主题。以上所有建议都是非常重要的,重要的是要确保所有前端材料都得到充分优化,然后您才能开始处理缓存和服务器性能问题。

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

另外,如果您使用许多社交媒体按钮,则可以自定义脚本,以使其在页面完全加载后加载到iframe中。我写了一个有关如何使用TweetMeMe re tweet按钮(自从Twitter发布了自己的reweet按钮以来已作废)的教程,但是仍然可以应用于其他共享按钮。

为了提高服务器性能,可以将Nginx用作静态内容的前端代理,Apache可以处理大量的PHP和MySQL。


2

既然没有人提及,与任何LAMP设置一起提高服务器性能的最重要步骤之一就是切换到apache worker thread和mod_fcgid。

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


我以前曾尝试过此方法,但从未能够运行稳定的apache worker + fcgi环境。如果有人知道在Ubuntu下对此有一些好的设置说明,请发布它们。我特别希望获得能详细说明影响FCGI行为的Apache配置指令的说明,并说明如何对其进行调整可能会影响内存使用量,性能等方面的指令。在代理缓存服务器中。
Dougal Campbell

定义稳定。我的安装运行非常稳定,但是您的配置中需要2GB的RAM。您只需要阅读和调整即可。apache关于fcgi的文档相当丰富。
meshfields 2011年

3
尝试检查virtualmin.com它非常稳定和自由
Ünsal科尔克马兹

1

检查插件速度减慢的指南

有一个非常漂亮的简单插件,称为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. 请注意您停用插件的顺序

您的电子表格应类似于

+-------+-------+-------+-------+--------+
| Run 1 | Run 2 | Run 3 | Order | Plugin |

因此,如果停用插件后页面响应时间显着增加,那么您可以查看是否可以避免使用该插件。

我发现了两个导致mqtranslate和“(相当老但不错)”的Multi-level Navigation Plugin变慢的插件


phantomjs和selenium(或类似的东西)自动执行此过程真的很酷,因此它会自动运行并在最后吐出一些报告。
Paul Sheldrake 2014年

-1

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

配置完其余插件功能后,请为您的网站设置Cloudflare。确保也在“扩展”下的W3总缓存设置中启用Cloudflare。

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

在Cloudflare中,将缓存级别设置为标准,并将浏览器缓存过期时间设置为至少20小时以上。启用Always Online™,以便即使您的服务器出现故障,Cloudflare也会从其缓存中提供网站的静态页面。同时启用其自动缩小功能(记住为什么我要求您不启用缩小功能是W3 Total Cache?因为Cloudflare会更好!)然后将Rocket Loader™设置为自动。

这是Rocket Loader的摘要:

  • 通过捆绑JavaScript文件甚至第三方资源来减少网络请求的数量,以避免减慢页面渲染速度。

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

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

可以在此处找到更多信息。

如果可能的话切换到WordPress的创世纪框架,因为他们是干净的没有任何膨胀。创世纪的创建考虑了速度和SEO。我本人已经对其进行了测试,并且我的PageSpeed得分很好。另外,如果您使用的是Genesis,请不要忘记在W3 Total Cache设置中启用片段缓存。

由于现在您将Cloudlfare用作CDN,因此可以使用TingPNG的“ Imagify ”或“ Compress JPEG&PNG images ”之类的插件来压缩图像。两者都是WordPress.org插件存储库中提供的免费插件。此外,Imagify支持强大的有损压缩算法。

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

然后安装“ Use Google Libraries ”插件。此插件可让您的WordPress网站使用Google的AJAX库API CDN,而不是直接从WordPress安装中提供这些文件。

一些好处是:

  • 增加了用户已经缓存这些文件的机会。
  • 减轻服务器的负担。
  • 使用库的压缩版本(如果可用)。
  • Google的服务器设置为与请求的浏览器协商HTTP压缩。

最后但并非最不重要的一点是,使用Ruhani Rabin 的' WP-Optimize '插件来清理和优化数据库。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.