星期五, 九月 21, 2012

WordPress/Nginx打开permalinks并安装Super Cache插件



WordPress的Super Cache插件通过缓存页面的方式极大提高服务器响应,降低服务器负载。Super Cache依赖permalinks功能的开启,而permalinks又依赖Apache服务器的mod_rewrite模块。因为原生不支持,所以在Nginx下安装Super Cache优化WordPress性能需要全程手动,是件很繁琐的事情。
首先和在Apache平台下一样,在后台设置,打开permalinks,安装并开启Super Cache插件,开启过程中需要修改wp-config.php文件,加入一句:
define('WP_CACHE', true);
在Apache下Wordpress开启permalinks时会生成一个.htaccess文件,自动或者手动写入rewrite规则,内容如下:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Nginx没有.htaccess文件,所以要通过在配置文件中写入重定向规则实现。在/etc/nginx下创建文件wp-super-cache文件,写入以下内容
        # enable search for precompressed files ending in .gz
 # nginx needs to be complied using –-with-http_gzip_static_module
 # for this to work, comment out if using nginx from aptitude
        gzip_static on;

 # if the requested file exists, return it immediately
        if (-f $request_filename) {
                break;
        }

        set $supercache_file '';
        set $supercache_uri $request_uri;

        if ($request_method = POST) {
                set $supercache_uri '';
        }

        # Using pretty permalinks, so bypass the cache for any query string
        if ($query_string) {
                set $supercache_uri '';
        }

        if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {
                set $supercache_uri '';
        }

 # if we haven't bypassed the cache, specify our supercache file
        if ($supercache_uri ~ ^(.+)$) {
                set $supercache_file /wp-content/cache/supercache/$http_host/$1index.html;
        }

 # only rewrite to the supercache file if it actually exists
        if (-f $document_root$supercache_file) {
                rewrite ^(.*)$ $supercache_file break;
        }

 # all other requests go to Wordpress
        if (!-e $request_filename) {
                rewrite . /index.php last;
        }
这里假设wordpress的安装目录是/。然后打开文件/etc/nginx/site-enabled/default,在location /区块代码中加入include wp-super-cache;一句,加好的代码如下:
location / {
    #如果出现404,请检查此级或者更高一级server代码块中root标记是否正确
    #...other stuffs...
    include wp-super-cache;
}
以上工作完成了permalinks需要的路径重写,但是由于WordPress代码会检查mod_rewrite模块是否存在,如果不存在,permalinks访问路径中会包含index.php,比如原来访问/post-123,现在会变成/index.php/post-123,也就是不会完全开启permalinks。这会给Super Cache开启造成问题,所以需要修改代码,找一个开启的plugin,在其中源文件中加入代码:
add_filter( 'got_rewrite', '__return_true', 999 );
我是加在了wp-content/plugins/wp-super-cache/wp-cache.php的最后一行。做完这些后去WP后台删除已有的缓存文件,访问任何页面,打开页面源代码,检查是否存在Super Cache提示信息,信息看起来像下面这个样子:
<!-- Dynamic page generated in 0.156 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-09-21 06:09:29 -->
如果存在,恭喜你,Super Cahce已经在nginx平台上的WordPress中成功运行。Tip:在调试过程中,可以借助Super Cache的debug功能,很快发现问题。

没有评论: