用 Nginx+Redis Cache 给 WordPress 提速
本文最后更新于 2592 天前,其中的信息可能已经有所发展或是发生改变。

前言

目前比较多的 WordPress 的缓存方案都是使用对象缓存插件并对应 Page 缓存来实现提速。但是这样的话我们都是经过 Nginx/Apache —— PHP-FPM/Mod-PHP —— Redis 拓展 —— 对象缓存插件 —— Redis。 这个拓扑图其实还是漫长的,性能受限于 PHP。

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

拓补图: Nginx —— SRcache 拓展 —— Redis。 直接跳过 PHP,来获得更快的页面访问速度。

评价

WordPress 比较经典的组合就是 Varnish + Apache/Nginx + Memcached + W3TC。这个组合很经典也很抢单,但槽点就是 Varnish 有一定的学习成本,并且大版本号的升级都会更换语法。

Nginx+Redis Cache 配置就比较简单,轻轻松松就搞定了。而且配置虚拟主机啥的都不用学习成本,也不会多一个软件来占用你的端口等等。

准备

首先,我们需要 Redis 和 Nginx 并且配备如下拓展:srcache-nginx-module, redis2-nginx-module, HttpRedisModule 和 set-misc-nginx-module 。如果安装拓展的方法就不介绍了,比较简单粗暴的就是安装 OpenResty ,默认集成哦!

检测 Nginx 是否有安装 ,在 SSH 中输入: 
nginx -V 2>&1 | grep 'srcache-nginx-module\|redis2-nginx-module\|redis-nginx-module\|set-misc-nginx-module' -o

如果返回:

srcache-nginx-module
redis2-nginx-module
redis-nginx-module
set-misc-nginx-module

那说明就是有我们必须的配置文件了!

配置

在虚拟主机配置文件中加入:

 

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

然后修改一下配置文件,这里我列出我的 Nginx 配置内容供新手参考:

upstream redis {
            server 127.0.0.1:6379;
            keepalive 512;
    }
    
server {
listen 80;
server_name www.mf8.biz;
access_log off;
index index.html index.htm index.php;
include /path/to/wordpress.conf;  # WordPress 的缓存文件位置
root /data/wwwroot/www.mf8.biz;

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

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
    expires 30d;
    access_log off;
    }
location ~ .*\.(js|css)?$ {
    expires 7d;
    access_log off;
    }
}

nginx -t 检测一下是否正确,如果错误就根据提示修改到正确,然后重启,service nginx restart

WordPress 插件

因为用这种缓存方式呢,缓存往往是定死的,也就是说,评论更新了,文章更新了,缓存还是不会自动更新的。因此我们还需要相关插件配合。

安装 Nginx Helper 插件,

评论

  1. tangzhehao
    8年前
    2016-7-16 14:04:00

    在使用了 PC 主题和移动主题不一样,使用了调度插件的时候怎么破?

    • tangzhehao
      8年前
      2016-7-16 14:35:00

      这个不清楚,我估计是有兼容性的问题,不适合 Nginx Helper。 还是用响应式主题吧

      • tangzhehao
        ivmm
        8年前
        2016-7-17 1:13:00

        是兼容性问题,哪个客户端先访问的页面,就缓存成什么样子

        • tangzhehao
          8年前
          2016-7-17 11:12:00

          这个的话还是用 PHP 缓存这类的会好一点

  2. 8年前
    2016-9-17 17:09:19

    博主,按照你的思路成功配置成功了,很好用。不知道现在应该设置才能应对“缓存失效风暴”呢?

    关于缓存失效风暴:
    https://moonbingbing.gitbooks.io/openresty-best-practices/content/lock/cache-miss-storm.html

    • 博主
      黯然过客
      8年前
      2016-9-19 10:24:39

      缓存失效了就会写入新的内容到redis 中

      • 8年前
        2016-9-19 12:15:10

        缓存失效的瞬间,可能会有很多个并发请求同时到了后端的PHP/MySQL,造成数据库负载过高,openresty 有个 lua-resty-lock 可以加锁,至会限制仅有一个请求到后端数据库,但不知道怎么整合到 srcache_fetch/srcache_store 中。。

  3. Xavier
    7年前
    2016-11-30 15:45:15

    不改配置文件可以吗?因为我不知道该怎么改。

    • 博主
      Xavier
      7年前
      2016-11-30 18:41:19

      当然不行,不然一点效果都不会有~

      • Xavier
        ivmm
        7年前
        2016-11-30 22:37:10

        配置文件里面带注释的项目都是手动添加上去的吗?也就是要修改的地方?

      • Xavier
        ivmm
        7年前
        2016-12-01 12:28:22

        include /path/to/wordpress.conf; # WordPress 的缓存文件位置,这个文件是自己创建的?我的主机上没找到这个文件

        • 博主
          Xavier
          7年前
          2016-12-01 13:19:58

          `/path/to/wordpress.conf` 意思是相关配置文件的位置,并不是实际位置

本文评论已关闭
上一篇
下一篇