给WordPress部署CDN加速和Cookie-Free Domains

给WordPress部署CDN加速和Cookie-Free Domains,雅虎的网页前端优化23条里其中两条是:使用内容分发网络(Use a Content Delivery Network (CDN))使用无cookie的域(Use Cookie-Free Domains for Components)

第一步(方法一):

这两点对使用WordPress开发的网站来说可能难于实现,其实我们只需要在 wp-congif.php 里增加两个参数就可以搞定。打开 wp-config.php ,增加下面的内容:

1
2
define("WP_CONTENT_URL", "http://content.ln.la/wp-content");
define("COOKIE_DOMAIN", www.ln.la);

我的目的是把 wp-content 目录里的内容都通过 content.ln.la这个域名来加载,这点并不需要使用真正的 CDN 服务来实现,只需要把content.ln.la 也指向主域名的根目录就可以。

另外我通过 COOKIE_DOMAIN 常量来限制 cookie 的作用域,因此当浏览器加载 content.ln.la 里的内容时,request header里不会带有主域的 cookie,节约了传输带宽,达到提高加载速度的目的。

第二步(方法二):

设置Cookie Free域名有两种方式,一是用同域下的二级域名,二是用独立域名。如果网站的主域是用的跟域名,那么方法一无效,因为设置了跟域名的Cookie后所有的子域名都会被感染而附带Cookie。

二级域名做Cookie Free域名的还有个不好是如果你使用了网站统计,那么可能站长统计会给跟域名加上一些Cookie,会影响所有子域名,所以效果不是很好,所以独立域名才是王道!方法更简单,只需要将上面第二行中的content.ln.la换成独立Cookie Free域名就可以了,第一行可要可不要了。

第三步(或者第四步):

安装wordpress插件Autoptimize,设置CDN Options,开启Rewrite JavaScript URLs,Rewrite CSS URLs,Rewrite Image URLs,同时设置 the new base URL为content.ln.la或者独立Cookie Free域名。

第四步(强烈推荐的方法)但是目前与某些插件冲突:

安装wordpress插件WP Super Cache

利用rewrite规则,实现从nginx层面访问wp super cache生成的静态网页,绕过PHP。

location / {

# 如果请求的文件已存在,直接返回

if (-f $request_filename) {

break;

}

set $supercache_file ”;

set $supercache_uri $request_uri;

set $supercache 1;

set $ihttp_host ”;

 

if ($request_method = POST) {

set $supercache 0;

}

 

# 仅在访问文章永久链接时使用静态文件,请求中带参数则不使用静态缓存

set $qs 0;

if ($query_string) {

set $qs 1;

}

 

# 不过从 twitter, facebook, feedburner 链接点过来的,总是带参数,这些访问仍然可以使用静态文件

if ($query_string ~* “^utm_source=([^&]+)&utm_medium([^&]+)&utm_campaign=([^&]+)(&utm_content=([^&]+))?$”) {

set $qs 0;

set $supercache_uri $document_uri;

}

#deactivate on high load

if ($qs = 1) {

set $supercache 0;

}

# 针对已登录用户(发表过评论),可以不静态化。在访问量高峰时可注释掉

if ($http_cookie ~* “comment_author_|wordpress|wp-postpass_” ) {

set $supercache 0;

}

 

# 支持移动设备,访问移动版本的网页缓存

if ($http_user_agent ~* ‘(iphone|ipod|aspen|incognito|webmate|android|dream|cupcake|froyo|blackberry9500|blackberry9520|blackberry9530|blackberry9550|blackberry 9800|webos|s8000|bada)’) {

set $ihttp_host ‘-mobile’;

}

 

# 指定静态缓存文件的路径

if ($supercache = 0) {

set $supercache_uri ”;

}

if ($supercache_uri ~ ^(.+)$) {

set $supercache_file /wp-content/cache/supercache/$http_host$1/index${ihttp_host}.html;

}

 

# 只有当缓存文件存在时,才进行 rewrite

if (-f $document_root$supercache_file) {

#rewrite ^(.*)$ $supercache_file break;

rewrite ^ $supercache_file last;

}

 

# 所有其他请求,转给 wordpress 处理

if (!-e $request_filename) {

rewrite . /index.php last;

}

}

用上面这段规则代替wordpress的规则,即wordpress.conf,或者自己建一个conf,再添加到vhost的conf文件中。

接下来设置好后,插件会提示说找不到 mod_rewrite 模块,这个不用管它,其实已经达成作用了。

选择mod_rewrite 缓存模式。

“压缩页面以便让来访者更快浏览。 (推荐)”不要选择,因为选择了以后,服务器会生成zip的文件,最终还是要通过PHP模式来访问。

“缓存重建”和“移动设备支持”可以选择。

“当有新文章或页面的发布或更新时清除之前的缓存文件。”这个选择,每次你发新文章时会生成新的缓存文件。

“首页额外检查”不用选择,因为选择了同样会占用内存。

“当某页面有新评论时,只刷新该页面的缓存。”这个选择。

重要:禁用垃圾收集器。垃圾收集器会每隔几分钟检查缓存,过期的就会重建,其实这个过程非常地占用内存,一定要把时间设为0,除非你的内存很大不在乎。

然后选项卡上的“预缓存”一定不要进行设置。

设置好后退出查看页面源文件最底部存在:

<!– Dynamic page generated in 0.189 seconds. –>

<!– Cached page generated by WP-Super-Cache on 2013-06-21 20:50:49 –>

<!– super cache –>

说明生效了!一定要检查生效与否,不生效说明与某些插件冲突!