Answers:
您可以在Nginx上安装WordPress。有很多资源可以帮助您:
来自最后一个链接的一些性能信息(设置似乎与其他链接有所不同):
因此,我决定尽可能在wordpress前面放置一个代理以实现静态缓存。所有未经身份验证的流量都直接从nginx文件缓存中提供,将某些请求(例如RSS feed生成)从6页/秒提高到7000+页/秒。钱币。Nginx还处理日志记录和gzip压缩,使较重的后端修补程序可以发挥最大作用:仅在需要时才提供动态wordpress页面。
...
在nginx上–它是如此高效,令人恐惧。我从未见过即使在我们最重的负载下,它也不会使用超过10到15兆的RAM和一瞬间的CPU。我们的神经节图不会说谎:我们将内存需求减少了一半,将传出网络吞吐量提高了一倍,并完全平衡了负载。自设置以来,我们基本上没有任何问题。
设置客户端有效期,例如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请求以及压缩的内容和未压缩的内容。也可以查看其中的到期标头。您很快就会看到可以改善的地方。
将您运行的插件数量减少到仅实际需要的数量。特别要注意的是,即使在页面上未使用该代码时,也会在每次页面加载时添加javascript和CSS代码的插件。
如果要从头开始创建自己的主题,请分解CSS,以便仅在需要时才加载特定页面模板或视图类型(单个帖子,档案,类别等)所需的功能。
将W3TC配置为使用CDN(例如Amazon CloudFront或W3TC支持的其他任何CDN)。
查看“缩小”选项是否对您有用(某些插件生成的js / css无法很好地缩小,因此请确保在激活“缩小”功能后测试您的网站)。
如果您完全控制MySQL服务器,请确保已打开query_cache。使用MySQL调整脚本查找其他方法来优化数据库配置。
如果由于某些原因使用CDN有问题,请在您的Apache设置中配置mod_expires。对于图像,CSS,JavaScript,视频,音频等静态类型,请设置合理的有效期限。
运行memcached并使用对象缓存来减少数据库查询的数量。这将从数据库而不是页面缓存数据。不知道w3-total-cache是否已经这样做。
确保您正在运行诸如APC之类的操作码缓存。(还有其他几种可用。)
除了使用磁盘缓存插件(如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,了解如何进行所有操作。
我的头上有几个答案:
1)在可能/可行的情况下,通过连接JavaScript和CSS来最小化浏览器必须向您的主机发出的HTTP请求的数量。
2)尽可能将服务于第三方CDN的图像/媒体卸载到第三方CDN,尤其是在使用共享主机的情况下。
3)尝试减少在首页上显示的帖子数量,以减少总渲染时间。
3a)尝试使用在首页上完整显示一些特色帖子的主题,以及所有其他较旧的帖子作为摘录。
缓存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_position
和menu
(用于直接调用菜单)一起使用。
菜单始终以菜单名称而不是主题中的位置保存。
$nav_menu_selected_id
是一个数字,而在调用get_cached_menu()
the时menu_id
是一个字符串变量,因为该参数成为该<ul>
元素的CSS ID 。
使用为优化而修剪的数据库类。我们在编写自己的代码方面有很好的经验,可以减少内存使用量和数据库访问速度。紧接着,您可以通过做一些同样有用的小更改来优化数据库结构本身。
数据库类代码的一部分可以在wordpress 跟踪中找到,但没有进入内核(票号11799及相关)。
对于一个人流量大的站点,您应该针对当前内容调整所有MySQL缓冲区。无论WordPress的版本如何,MySQL层都可以计算其配置。
实际上,如果您具有InnoDB数据而未启用innodb_file_per_table,则需要通过将每个表分段到其自己的物理表空间中来清理InnoDB。即使硬件有限,也可以进行适当的MySQL调整。有很多方案可以进行这种InnoDB优化。
恕我直言,您无法在不知道要配置的数据量的情况下为my.cnf规划良好的设置。您将必须定期将生产中的当前数据集加载到暂存环境中,进行优化,并忽略要在生产服务器的my.cnf中配置的数字。
您可以启用全局输出压缩。如果浏览器支持的话,这将自动压缩所有输出内容。这将大大减少传输文件的大小,但会增加CPU负载。
我最近在休斯敦WordCamp上谈到了这个主题。以上所有建议都是非常重要的,重要的是要确保所有前端材料都得到充分优化,然后您才能开始处理缓存和服务器性能问题。
渐进式渲染将使您的页面感觉更快,因为用户将在页面内容完全加载之前看到它们。为此,请确保任何阻塞的js位于页面的最底部,而css位于顶部。
另外,如果您使用许多社交媒体按钮,则可以自定义脚本,以使其在页面完全加载后加载到iframe中。我写了一个有关如何使用TweetMeMe re tweet按钮(自从Twitter发布了自己的reweet按钮以来已作废)的教程,但是仍然可以应用于其他共享按钮。
为了提高服务器性能,可以将Nginx用作静态内容的前端代理,Apache可以处理大量的PHP和MySQL。
既然没有人提及,与任何LAMP设置一起提高服务器性能的最重要步骤之一就是切换到apache worker thread和mod_fcgid。
这释放了我的虚拟专用服务器上的500MB内存。
有一个非常漂亮的简单插件,称为Page Load Time,它为页面页脚添加了计时器。它实际上只有四行代码:
<?php
function ur_pageload_footer() {
printf(__('Page in %s seconds', 'pageload'), timer_stop());
}
add_action('wp_footer', 'ur_pageload_footer')
然后:
您的电子表格应类似于
+-------+-------+-------+-------+--------+
| Run 1 | Run 2 | Run 3 | Order | Plugin |
因此,如果停用插件后页面响应时间显着增加,那么您可以查看是否可以避免使用该插件。
我发现了两个导致mqtranslate和“(相当老但不错)”的Multi-level Navigation Plugin变慢的插件。
坚持使用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安装中提供这些文件。
一些好处是:
最后但并非最不重要的一点是,使用Ruhani Rabin 的' WP-Optimize '插件来清理和优化数据库。
希望这能回答您有关优化WordPress以减少服务器负载的问题。