Nginx下WPMU多站点的wp-super-cache配置

这题目有点复杂,问题也有点复杂,当定语越多的时候也说明越难搞。

先说明一下背景:我主机用的是Nginx;我的Wordpress开启了多站点的功能,加上我的这博客,一共有三个站点,一个是May’s Blog(简称B站),一个是我们的收藏夹(简称C站);我想用wp-super-cache这个插件来给博客提速。

再说明一下问题:我安装了wp-super-cache的version 1.1后因为开启了多站点,出现了当我访问B站和C站主页时显示的“杜小白之家”的主页。我主博客的缓存能正常的工作,而且当我访问B站和C站的固定链接时,即非主页的链接,是可以正常显示的。

解释一下问题:这问题很显然与多站点有关,这问题也不是缓存工不工作的问题,直觉告诉我是跳转的问题,但很奇怪域名没有跳转的,只是在B站和C站的主页上显示出了我主博客的主页。我暂定为缓存错乱的问题。

解决办法:

搜索看了很多中文博客,大多数是Nginx与wp-super-cache的问题或WPMU与wp-super-cache的问题,抑或是301重定向失效的问题。结论是,中文找不到解决办法。

搜索英文看了很多网站,依然找到不解决办法,最后非常靠谱地回到了wp-super-cache插件的support form 里找到了解决的办法。结论是,越是高难的问题最有效的办法是看回其使用配置说明或官方支持,道听途说是没有用了,为这一结论,我浪费了一些时间。

这是一个漏洞,按知情人的原话是 “ this thread deals with the problem that is caused due to version 1.1 using $_SERVER[ ‘SERVER_NAME’ ] to generate the cache folder structure. Some web servers (nginx among them) does not create the variable $_SERVER[ ‘SERVER_NAME’ ] and therefore the cache will be generated and sent for the wrong site.”

根据我所看到的,解决办法一共有两个,一是用development version,下载地址为

http://downloads.wordpress.org/plugin/wp-super-cache.zip

亲测,问题已被解决,而且汉化做得更好。Version 1.1的最后修改时间为2012.6.12, development version的修改时间为 2012.9.12,估计很快会release的了。

第二个解决办法是最近一个星期发布的,修改Nginx里的nginx.conf 文件,增加以下代码

location ~ .php$ {
                fastcgi_param SERVER_NAME $http_host;
        }

我的解决办法肯定是第一个。看这个链接就靠谱。其次修改配置文件必须是一件谨慎的工作,你必须记住曾在默认文件中多加了些怎样的操作,也许改后可以解决的问题,但这样的改动很有可能影响以后别的插件或什么的运行。

这个问题解决后,剩下的配置就好办了。

我开启的是 mode_rewrite to service cache file 模式(最优的缓存模式),但我使用的不是Apache,是没有mod_rewrite这个模块的,.htaccess 配置文件安全无用。幸运的是网上流传了很多支持WP Super Cache 的配置文件,其中一份是这样的

 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;
           }

经过我的对比,对发表时间等一系列因素进行评估后,感觉这份Nginx rewrite 规则应该是比较新和靠谱的。把这代码加入到nginx.conf里面,之后再重启nginx,木有任何错误,大约也就木有什么问题了。

到期时间和垃圾回收器我的是默认的,同时也开启了CDN。在勾选了不要为已知用户缓存的情况下,wp-super-cache是不会生效的,查看网页源代码时会显示:

Page not cached by WP Super Cache. Check your settings page. Not caching requests by known users. (See Advanced Settings page)

如果插件正常运作,查看源码时则会显示:

Cached page generated by WP-Super-Cache on 2012-09-30 22:10:02

安装好后记得要按一下“立即预加载缓存”然后待上那么几分钟,再到“内容”查看有多少个缓存页面,感觉不完整则再按一次。否则的话,会出现首次访问会显示无法找到,刷新才有。

至此,在断熂续续折腾了两天后我终于顺利用上了wp-super-cache,也不是是不是平时实在是太慢了,现在感觉博客的确快了不少,现在几乎保持在半秒的水平。对于我这种对速度没大追求的人来说,算是可以了。

 

参考资料:

http://www.lovelucy.info/ngnix-config-support-wp-super-cache.html

http://wordpress.org/support/topic/plugin-wp-super-cache-warning-wpsupercache-11-and-nginx-broken-on-multisite

http://wordpress.org/support/topic/plugin-wp-super-cache-minor-bug-with-use-of-_serverhttp_host-instead-of-_serverserver_name

加入对话

7条评论

  1. 我前几天想开启多站点模式,就是应为部分插件在多站点内存在兼容问题,其中一个就是wp-super-cahce(主要原因还是这个插件!)最后还是选择用2个wp好了!虽然占用内存稍微大点,不过VPS还能承受!

留下评论

夜枫忆栈进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据