openresty使用Redis+SRcache加速wordpress博客

众所周知Redis具有轻量级,持久化,高速存取等优点,具有跨平台的特性.而这里我们做的就是使用SRcache将PHP内容直接缓存到Redis里减轻后端服务器的压力,提高后端响应速度.

SRcache模块为缓存提供了一个整合后端存储的能力,可以配合Redis使用.如果Redis访问没命中,则发起一个后端请求,获取到数据之后自动缓存到Redis,下次访问将直接调用Redis中的缓存.

OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,由中国人章亦春发起,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关.

小站的博客服务器位于欧洲,在使用了CDN情况下,原本不做SRcache时响应时间基本都在2000ms+,而做了缓存以后响应时间降到了1000ms上下.

下图分别展示了不用缓存时的访问和使用缓存后的访问区别.

未使用缓存:

no-srcache (1)

使用缓存后:

srcache

WordPress没优化前当用户访问页面的时候需要经过PHP,数据库等.而当使用了SRcache以后,用户的访问请求则是直接访问了缓存,大大的加快了响应时间.

安装好环境后,将下面的规则添加到主机的配置文件.这里环境的安装我选择了linuxeye一键包.可以直接一键安装好所需要环境.

在Http段添加下面这段代码:

upstream redis {
            server 127.0.0.1:6379;
            keepalive 512;
    }

在Server段添加下面这段代码:

    set $skip_cache 0;

    #POST请求直接调用后端
    if ($request_method = POST) {
        set $skip_cache 1;
    }   
    if ($query_string != "") {
        set $skip_cache 1;
    }   

    #不要缓存以下部分
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
        set $skip_cache 1;
    }   

    #不缓存登陆用户和最近评论的用户
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $skip_cache 1;
    }

   location /redis-fetch {
        internal  ;
        set  $redis_key $args;
        redis_pass  redis;
    }

    location /redis-store {
        internal  ;
        set_unescape_uri $key $arg_key ;
        redis2_query set $key $echo_request_body;
        redis2_query expire $key 14400; 
        redis2_pass  redis;
    } 


    location ~ .*\.(php|php5)?$ {
        set $key "nginx-cache:$scheme$request_method$host$request_uri";
        try_files $uri =404;

        srcache_fetch_skip $skip_cache;
        srcache_store_skip $skip_cache;

        srcache_response_cache_control off;

        set_escape_uri $escaped_key $key;

        srcache_fetch GET /redis-fetch $key;
        srcache_store PUT /redis-store key=$escaped_key;

        more_set_headers 'X-Cache $srcache_fetch_status';
        more_set_headers 'X-Store $srcache_store_status';
        
        #下面这些不用添加
        #fastcgi_pass remote_php_ip:9000;
        fastcgi_pass unix:/dev/shm/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

重启OpenResty即可生效,但是还有一个缺点就是当我们发布新文章,修改文章,通过评论,修改评论时无法自动更新缓存.

WordPress插件Nginx Helper可以当我们发布新文章,修改文章,通过评论,修改评论自动清理缓存.可以通过在Wordpress后台安装这个插件,直接搜索Nginx Helper即可.

截图_2016-05-11_21-07-19

SRCache Github项目地址:srcache-nginx-module