高流量WordPress博客的优化

老罗被折腾得够惨,王小峰老师的WordPress博客又开始打起了摆子。同学们都觉得心里拔凉拔凉的,有些人问我,是不是WordPress无法用于高访问量的博客建设。我认为不然。今天分享下我的经验和看法,欢迎讨论。

WordPress是一款非常流行的免费开源Blog平台,但是由于其扩展性和兼容性的“负担”,性能问题一直颇受争议。我07年从LBS转换到WordPress的时候,周围许多优秀的PHP程序员都嘲笑过它的PHP代码。然而,经过数年的使用,尤其是对整个WordPress生态链的了解,我越来越肯定:WordPress其实可以做的很好,只是你还没有找到合适的方法而已。

我认为,高流量WordPress博客可以从以下几点入手进行优化:

  1. 使用LAMP架构而不是WAMP(Windows-Apache-MySQL-PHP)
    我对服务端的原理知之甚少,但就我使用LAMP和WAMP的经验来看,前者在性能、稳定性上都占有几大优势。相比WAMP,Linux服务成本极低,而且相比Windows,Linux的理念本身也更为专注于服务器管理和操作。例如,使用wget升级WordPress,下载插件,都十分方便;使用mysqldump和crontab备份数据也安全、简便、可靠。
  2. 安装wp-super-cache等静态缓存插件
    我的博客一直使用wp-super-cache,效果很好。它能够极大程度地节约PHP的执行成本和数据库查询的压力。下载地址。(最好是在LAMP下,我没有测试过WAMP的情况)
    不过,安装了这款插件之后,PHP端对客户端的API就全部失效了。例如你无法在PHP端获得客户端的浏览器类型、版本、Referer值等。如果有相关功能,这时候需要一些JavaScript技巧来改善。例如用jQuery的
  3. 制定一些插件
    如果你的访问量足够高,那么绝对有必要亲自动手或者请懂WordPress系统的人来制定一些插件。很多插件为了考虑兼容性(包括服务器端、客户端),采用了很保守的设计。而针对你自身的系统,这些保守的设计很可能就成为了累赘。例如我自己有一套jQuery的库,就不必再用插件自带的jQuery或者其他Javascript库了;插件还有一个问题也是免费开源软件的通病:规范程度不够好,质量参差不齐,一些插件在存档页面去连评论的数据,就很浪费资源了。
  4. Feed和图片独立
    Feed和图片完全没有必要自己负担:
    a、Feed可以使用FeedBurner(最近Google的动作应该会让河蟹的风险降到最低),也可以使用Feedsky;
    b、图片可以使用Google的Picasa,如果实在觉得麻烦,在上传图片之前,切记裁剪、缩放一下图片,一般来说都可以压缩到100K以内(可以压缩掉90%的体积)
  5. 可以考虑用Nginx代替Apache
    我并不了解Nginx和Apache的内部原理,但我的直觉告诉我,Nginx的效率要高于Apache – 理由是,当我从Apache迁移到Nginx之后,一直没有开super-cache,速度居然也很不错。现在,Alexa排名前100的网站中有2个使用了Nginx(Nginx官方统计)
    值得一提的是,换了Nginx之后,super-cache的rewrite规则不如htacces那么好配置,搜索“Nginx+Super+Cache”会看到很多说明,不再赘述。
Advertisements

64 thoughts on “高流量WordPress博客的优化

  1. 我对服务端的原理知之甚少,但就我使用LAMP和WAMP的经验来看,后者在性能、稳定性上都占有几大优势。 — 使用wamp?

      1. 哦了,我打算把lanqiu.com建成一个web2.0的网站,想开个多人博客,服务器是windows的,难道IIS很占用资源哦?

      2. 万网的linux服务器不能自己配置,妈的,rewrite都不能。。。只能用iis了,我找了个dll,WordPress的rewrite没问题了,看看,http://lanqiu.com/ 招聘人手中

  2. 除了图片使用第三方服务器外,其他基本没用,访问量大的唯一办法是增加服务器,其他仅是治标.现在人多,是一万,那十万呢?百万呢?

  3. aw,你给评论添加的digg能不能把支持和反对换个位置,一般都习惯从左到右,先支持后反对。在cnbeta都是这么玩的。
    在你这里好几次要点支持的都点成反对了。

  4. 完全静态化以后根本就没有程序去获取浏览器的Request信息,你说的用JS来实现是用AJAX的方法再去执行某些操作么?如果是这样那在没有静态化的时候如何判断是否要执行这些静态后的操作也是个问题。

    你后面提到的“自己有一套jQuery的库,就不必再用插件自带的jQuery”我觉得对于插件的编写者来说都应该会在引入jQuery这类共有库的时候调用wp_print_scripts(‘jquery’);这个函数,当然我们自己在引入的时候也应该调用这个函数来避免重复加载。

    1. 调用wp_print_scripts有一个问题是,无法引用Google CDN的jQuery,而且位置并不好控制。对于流量很大的网站,并不一定要在head标签内引入jQuery,可以放到“Loading”之后再引入。这样用户的体验会更好:用户会在极短时间内看到loading

  5. 为什么当这个版本升到0.91后就不能用了,现在返回以前的版本也是不能用,一启用在IE下就打不开,FF下确是正常的,不知是哪里出了问题题

  6. I blog frequently and I truly appreciate your content. The article has truly peaked my interest. I am going to book mark your website and keep checking for new information about once per week.

  7. 我用的方法略复杂了,包括验证码,超连接限制,关键词屏蔽,拒绝无referer来源的Spam机器人垃圾评论,IP地址拉黑……

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s