it-swarm.cn

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

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

80
Paul Sheldrake

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

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

所以我决定尽可能在wordpress前面将代理放到静态缓存中。所有未经过身份验证的流量都直接从nginx文件缓存中提供,将一些请求(例如RSS源生成)从6页/秒提取到7000多页/秒。钱币。 Nginx还处理日志记录和gzipping,让较重的后端apach执行他们最擅长的操作:仅在需要时提供动态wordpress页面。

...

在nginx上 - 它非常有效,令人恐惧。我从来没有看到它使用超过10到15兆的RAM和一点CPU,即使在我们最重的负载下。我们的神经节图表不是谎言:我们将内存需求减半,使我们的传出网络吞吐量翻倍,并完全消除了我们的负载。自从我们设置以来,我们基本上没有任何问题。

31
Travis Northcutt

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

# 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。除了解析.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可以很好地运行supercache,也可以使用我在上面详述的过期标头。

在Firebug(Firefox)或类似程序中使用Yslow来监控您的http请求以及压缩的内容和内容。看看那里的到期标题。你很快就会看到你可以改进的东西。

26
CAD bloke

将运行的插件数量最小化到您真正需要的数量。特别要注意在每个页面加载时添加javascript和CSS代码的插件,即使该页面上没有使用该代码也是如此。

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

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

看看Minify选项是否适合你(一些插件生成的js/css不会很好地缩小,所以一定要在激活minify功能后测试你的网站)。

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

如果由于某种原因使用CDN存在问题,请在Apache安装程序中配置mod_expires。设置到期时间,只要合理的静态类型,如图像,CSS,JavaScript,视频,音频等。

21
Dougal Campbell

运行 memcached 并使用 对象缓存 减少数据库查询的数量。这会缓存数据库中的数据,而不是页面。不确定w3-total-cache是​​否已经这样做了。

确保您正在运行像 _ apc _ 这样的操作码缓存。 (还有几个可用。)

14
Annika Backstrom

除了使用像wp-cache这样的磁盘缓存插件之外,还可以将博客放在主机卷上,该卷上设置了“noatime”属性。否则,SSH进入您的主机(如果您的webhost提供)并且每隔几天在您的文件上定期运行此命令:

chattr -R +A ~/*

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

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

有时你的网站被蜘蛛锤击。您可以使用像SpyderSpanker或Chennai Central这样的工具来过滤掉那些无法为您的网站带来更多网页排名而只是放慢速度的蜘蛛,然后通过随机发送它们来扼杀好蜘蛛(如Google,Bing等) HTTP 304未修改的消息。

我看到的另一件事是编写糟糕的插件。如果你学习如何制作插件,你就会开始看到一些插件的编码效率低下,甚至找不到时间炸弹,比如填充和填充数据库表,永远不会被清除,存储传入的连接数据等内容。

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

8
Volomike

我的头脑中有几个答案:

1)通过在可能/实用的情况下连接JavaScript和CSS,最大限度地减少浏览器必须向主机发出的HTTP请求数。

2)尽可能多地将您的图像/媒体服务卸载到第三方CDN,特别是如果您使用共享主机。

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

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

7
ZaMoose

缓存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替换为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指出了slugs和ID之间的错误。我更新了函数,因此它与theme_positionmenu一起工作(用于直接调用菜单)。

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

7
fischi

使用修剪的数据库类进行优化。我们用自己的代码很好地体验了内存使用和数据库访问速度。接下来,您可以通过一些很小的更改来优化数据库结构本身。

部分数据库类代码可以在wordpress trac中找到,它没有成为核心( Ticket#11799和相关 )。

5
hakre

对于高度流量的站点,您应该为现在的内容调整所有MySQL缓冲区。无论WordPress的版本如何, MySQL层都可以计算其配置

事实上,如果你有InnoDB数据而没有启用innodb_file_per_table, 你需要通过将每个表分割成它自己的物理表空间来清理InnoDB 。有可能进行不错的MySQL调优 即使您的硬件有限 。有 许多情况下进行这样的InnoDB优化

恕我直言,如果不知道要配置的数据量,你无法为my.cnf规划好的设置。您必须定期将生产中的当前数据集加载到临时环境中,执行优化并在生产服务器的my.cnf中配置要配置的数字。

4
RolandoMySQLDBA

我最近在 WordCamp Houston 上谈到了这个主题。所有上述建议都很棒,重要的是确保所有前端内容都经过全面优化,然后您就可以开始处理缓存和服务器性能问题。

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

此外,如果您使用大量社交媒体按钮,则可以自定义脚本,以便在页面完全加载后将其加载到iframe中。我写了一个关于如何使用TweetMeMe re Tweet按钮的教程(现在已经过时,因为Twitter发布了他们自己的转发按钮),但仍然可以应用于其他共享按钮。

对于服务器性能,将Nginx视为静态内容的前端代理,Apache处理重PHP和MySQL提升。

3
Chris_O

你可以启用全局 输出压缩 。如果浏览器支持,这将自动gzip一切自动出去。这大大减少了传输文件的大小,但确实增加了CPU负载。

3
Scott M.

由于没有人提及它,与任何LAMP设置一起提高服务器性能的最重要步骤之一是切换到Apache工作线程和mod_fcgid。

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

2
nottinhill

检查插件的速度慢下来

有一个非常简单的插件名为 页面加载时间 ,它会为页面页脚添加计时器。它实际上只有四行代码:

<?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 (相当古老但很好) 多级导航插件

1
icc97