OneinStack Nginx 安装 Redis Cache 给 WordPress 提速

基于 OneinStack +「米饭粑」教程折腾。

简介

目前比较多 WordPress 缓存方案都是使用对象缓存插件并对应 Page 缓存来实现提速。拓扑图:Nginx/Apache —— PHP-FPM/Mod-PHP —— Redis 拓展 —— 对象缓存插件 —— Redis,性能受限于 PHP。

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

拓补图:Nginx —— SRcache 拓展 —— Redis。

跳过 PHP 以获得更快页面访问速度。Nginx + Redis Cache 配置相对比较简单,配置虚拟主机基本上不用学习成本。

安装 Redis-Server 并设置以 Unix Socket 运行

安装 Redis-Server

如果原本已经安装,此步可以跳过。

cd /root/oneinstack
./install.sh --redis

检查 Redis 运行用户

~#: sudo ps aux | grep redis
redis    29747  0.1  0.6 153904  6328 ?        Ssl  17:26   0:00 /usr/local/redis/bin/redis-server 127.0.0.1:6379
root     29895  0.0  0.2 112724  2292 pts/2    R+   17:32   0:00 grep --color redis

可见 Redis-Server 运行在 redis 上。

添加用户组

usermod -g www redis

OneinStack 网站用户一般是 www,如果不是,请根据实际修改。

创建 unix socket 所在文件夹并赋予权限

mkdir -p /var/run/redis/
chown -R redis:www /var/run/redis

修改配置文件 redis.conf

OneinStack 脚本安装 redis 目录为:/usr/local/redis/,配置文件路径:/usr/local/redis/etc/redis.conf

vi /usr/local/redis/etc/redis.conf

将 unixsocket 和 unixsocketperm 前 # 去掉,并将 unixsocketperm 的值由 700 改为 777,否则将不能清理缓存。

# Unix socket.
#
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#

unixsocket /var/run/redis/redis.sock
unixsocketperm 777

重启 redis

service redis-server restart

检查 redis 运行

通过 ls -lh 命令查看会返回如下结果:

~#: ls -lh /var/run/redis
total 4.0K
-rw-r--r-- 1 redis redis 6 Oct 24 17:37 redis.pid
srwxrwxrwx 1 redis redis 0 Oct 24 17:37 redis.sock

参考资料:米饭粑 - 安装并设置以 Unix Socket 运行的 Redis-Server

安装 nginx 扩展模块

Nginx 需要配备如下扩展模块:srcache-nginx-module、redis2-nginx-module、HttpRedisModule 和 set-misc-nginx-module 。如果使用 OpenResty,这些扩展默认集成。

检测 Nginx 是否已经安装扩展

nginx -V 2>&1 | grep 'srcache-nginx-module\|redis2-nginx-module\|ngx_http_redis\|set-misc-nginx-module\|echo-nginx-module\|ngx_devel_kit' -o

如果返回:

redis2-nginx-module
ngx_devel_kit
set-misc-nginx-module
ngx_http_redis
srcache-nginx-module
echo-nginx-module

表示所需扩展已经安装,直接配置即可。

下载、解压扩展文件

这里加上了 Brotli,如不需要,可以删除 git clone https://github.com/google/ngx_brotli.git && cd ngx_brotli && git submodule update --init

cd /root/oneinstack/src
wget https://people.freebsd.org/~osa/ngx_http_redis-0.3.9.tar.gz -cO ngx_http_redis-0.3.9.tar.gz && tar zxf ngx_http_redis-0.3.9.tar.gz
wget https://github.com/openresty/srcache-nginx-module/archive/v0.31.tar.gz -cO srcache-nginx-module-v0.31.tar.gz && tar zxf srcache-nginx-module-v0.31.tar.gz
wget https://github.com/openresty/redis2-nginx-module/archive/v0.15.tar.gz -cO redis2-nginx-module-v0.15.tar.gz && tar zxf redis2-nginx-module-v0.15.tar.gz
wget https://github.com/openresty/set-misc-nginx-module/archive/v0.32.tar.gz -cO set-misc-nginx-module-v0.32.tar.gz && tar zxf set-misc-nginx-module-v0.32.tar.gz
wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz -cO echo-nginx-module-v0.61.tar.gz && tar zxf echo-nginx-module-v0.61.tar.gz
wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1.tar.gz -cO ngx_devel_kit-v0.3.1.tar.gz && tar zxf ngx_devel_kit-v0.3.1.tar.gz
git clone https://github.com/google/ngx_brotli.git && cd ngx_brotli && git submodule update --init
cd /root/oneinstack

下面命令与上面一致,只是方便复制执行。

cd /root/oneinstack/src && wget https://people.freebsd.org/~osa/ngx_http_redis-0.3.9.tar.gz -cO ngx_http_redis-0.3.9.tar.gz && tar zxf ngx_http_redis-0.3.9.tar.gz && wget https://github.com/openresty/srcache-nginx-module/archive/v0.31.tar.gz -cO srcache-nginx-module-v0.31.tar.gz && tar zxf srcache-nginx-module-v0.31.tar.gz && wget https://github.com/openresty/redis2-nginx-module/archive/v0.15.tar.gz -cO redis2-nginx-module-v0.15.tar.gz && tar zxf redis2-nginx-module-v0.15.tar.gz && wget https://github.com/openresty/set-misc-nginx-module/archive/v0.32.tar.gz -cO set-misc-nginx-module-v0.32.tar.gz && tar zxf set-misc-nginx-module-v0.32.tar.gz && wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz -cO echo-nginx-module-v0.61.tar.gz && tar zxf echo-nginx-module-v0.61.tar.gz && wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1.tar.gz -cO ngx_devel_kit-v0.3.1.tar.gz && tar zxf ngx_devel_kit-v0.3.1.tar.gz && git clone https://github.com/google/ngx_brotli.git && cd ngx_brotli && git submodule update --init && cd /root/oneinstack

更新/编译 nginx

修改 OneinStack 的 nginx 升级脚本

nginx_modules_options 中增加扩展配置,在 oneinstack/include 目录,找到 upgrade_web.sh,将 ./configure ${nginx_configure_args} 修改为:

./configure ${nginx_configure_args} --add-module=../ngx_brotli --add-module=../echo-nginx-module-0.61 --add-module=../redis2-nginx-module-0.15 --add-module=../ngx_devel_kit-0.3.1 --add-module=../set-misc-nginx-module-0.32 --add-module=../ngx_http_redis-0.3.9 --add-module=../srcache-nginx-module-0.31

温馨提示:--add-module=../ngx_devel_kit-0.3.1 一定要紧跟在 --add-module=../set-misc-nginx-module-0.32 前面,否则会提示 error: ngx_devel_kit is required to build ngx_set_misc; please put it before ngx_set_misc.

执行脚本升级 Nginx

~/oneinstack/upgrade.sh

选择升级 nginx,输入需要升级的版本号。

加入 redis cache 配置

虚拟主机配置文件(比如 /usr/local/nginx/conf/vhost/0xo.net.conf)中加入配置。

虚拟主机配置文件开始处加入 upstream

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

server{}内加入配置

放在 root /data/wwwroot/0xo.net; 后

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

PHP-FPM 部分加入配置

原本配置:

location ~ [^/]\.php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}

加入如下配置:

    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;

add_header X-Cache "$srcache_fetch_status";
add_header X-Store "$srcache_store_status";

修改成如下这样:

  location ~ [^/]\.php(/|$) {
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;

add_header X-Cache "$srcache_fetch_status";
add_header 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;
}

检测配置是否正确

nginx -t

检测配置是否正确,如果错误,根据提示修改正确,然后重启 nginx

service nginx restart

检查 redis 缓存是否生效

打开网页,F12 打开开发者工具,有「x-cache: HIT」表示成功。

 1188-redis-check

WordPress 插件清理缓存

这种缓存方式不会自动清理缓存,WordPress 可以配合 Nginx Helper 插件自动清理缓存,否则评论更新,文章更新,甚至更换主题,缓存还是不会自动更新。

Nginx Helper 插件作者:rtCamp

默认配置:

 1188-redis-nginx-helper

参考资料:米饭粑 - 用 Nginx+Redis Cache 给 WordPress 提速

启用 Brotli 压缩

参考旧文:OneinStack 启用 Brotli 压缩,「启用 Brotli」部分直接修改配置启用即可。

修改 /usr/local/nginx/conf/nginx.conf 文件,在 http { } 中找到:

##Brotli Compression
#brotli on;
#brotli_comp_level 6;
#brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

将其改为:

##Brotli Compression
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

如果没有这几行,可在 #Gzip Compression 配置结束后增加进去。

然后重启一下 nginx:service nginx restart

附相关模块信息

redis-nginx-module(ngx_http_redis):https://www.nginx.com/resources/wiki/modules/redis/

openresty/srcache-nginx-module:https://github.com/openresty/srcache-nginx-module/releases

openresty/redis2-nginx-module:https://github.com/openresty/redis2-nginx-module/releases

openresty/set-misc-nginx-module:https://github.com/openresty/set-misc-nginx-module/releases

echo-nginx-module:https://github.com/openresty/echo-nginx-module/releases

ngx_devel_kit:https://github.com/simplresty/ngx_devel_kit/releases

除非注明,常阳时光文章均为原创,本文地址 https://cyhour.com/1188/AMP 移动加速版本)转载时必须以链接形式注明原始出处。
Vultr 送$25,搬瓦工年付最低$49,优惠码 BWH34QMFYT2R,更多推荐VPS信息,或支持老杨
Views: 206 Tags:  ,  ,  ,  ,  ,  , 

Comments:23

  1. 哇,好快好快,秒射

    2019.10.25 14:33 # 回复
    1楼
  2. 浮游

    既然用到了wordpress和提到了米饭吧,可以尝试一下他的一脚包llstack,这个用到的是LiteSpeed,据说性能在wordpress下比nginx大大领先

    2019.10.25 17:51 # 回复
    2楼
    • @浮游 好,谢谢推荐,有空折腾试试。

      2019.10.25 18:12 # 回复
    • @浮游 然而 LiteSpeed 需要付费,不过服务器内存不超 2G 可以申请免费 KEY。

      2019.10.25 18:18 # 回复
      • 浮游

        @老杨 是啊,要不是因为当初litespeed收费,按照litespeed性能,还真没Nginx和apache什么事了

        2019.10.28 17:31 # 回复
  3. 博主说的是啥😭

    2019.10.25 18:04 # 回复
    3楼
  4. 俺用的是虚拟机,没办法了

    2019.10.25 20:15 # 回复
    4楼
  5. 第一次看到这种加速方法,不过我的已经很快了。

    2019.10.26 12:52 # 回复
    5楼
  6. 你的本来就很快了,早有更快没有最快~~ 阿帕奇飘过

    2019.10.28 17:00 # 回复
    6楼
    • @Sam.Z 以前也是阿帕奇,后来 .htaccess 折腾烦了,死活折腾不出想要的效果,就换到 nginx,挺好的。

      2019.10.28 17:05 # 回复
  7. Edwin

    请教一下,已经有 WP Fastest Cache 就不需要再次用 NGINX 缓存了吧?

    另外这种 NGINX 缓存的方式好用么?毕竟只有缓存,没有压缩以及合并CSS,JS 之类的功能。

    2019.10.28 18:14 # 回复
    7楼
    • @Edwin 缓存跟压缩合并CSS之类是两码事……缓存一般用一种就好了吧,nginx 这种好处是不需要经过 php,性能会好那么一点点吧。

      2019.10.28 18:27 # 回复
      • Edwin

        @老杨 我在nginx里加入这个配置,也是不经过PHP的。

        location / {
        # 如果请求的文件已存在,直接返回
        if (-f $request_filename) {
        break;
        }

        set $caches 1; #是否缓存
        set $request_file $document_uri; #获取请求文件
        set $cache_file "; #缓存文件

        #请求方式是POST的不拦截
        if ($request_method = POST) {
        set $caches 0;
        }

        #包含GET请求参数的不拦截(访问量高可以注释掉)
        if ($query_string) {
        set $caches 0;
        }

        # 指定静态缓存文件的路径
        if ($caches = 0) {
        set $request_file ”;
        }

        if ($request_file ~ ^(.+)$) {
        set $cache_file /wp-content/cache/all/$1/index.html; #你的WP Fastest Cache缓存目录
        }

        # 命中缓存
        if (-f $document_root$cache_file) {
        rewrite ^ $cache_file last;
        }

        # 无法命中缓存,转给WordPress来处理
        if (!-e $request_filename) {
        rewrite . /index.php last;
        }
        }

        #location /wp-content/cache/all/ { #这一行是你的WP Fastest Cache缓存文件路径
        # add_header Cache HIT; #添加header头,表示命中了缓存
        #}

        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        location ~* ^/wp-content/uploads/.*\.php$ {
        deny all;
        }
        2019.10.28 18:35 # 回复
      • Edwin

        @老杨 你看这篇文章吧: https://www.lurbk.com/lur1988.html

        2019.10.28 18:36 # 回复
        • @Edwin 不需要 php 的话也挺好,不过始终是 WP 插件,与 WP Super Cache 之类插件差别不会太大吧。用 nginx 的话其实可以考虑用它内置的 FastCGI_Cache。

          2019.10.28 20:03 # 回复
          • Edwin

            @老杨 我用过 WP Super Cache, 但测试效果并没有 fastest 好, 也有可能是我不会设置。

            缓存的话,随意一个都可以,不过最主要是这个fastest集成了HTML,CSS,JS 压缩,如果用其他缓存方式的话,还需要额外安装一个压缩插件。

            2019.10.29 08:58 # 回复
            • @Edwin 嗯,网上评测 WP Fastest Cache 效果会好一点,不过两者我都没怎么用过。FastCGI_Cache 可以不安装插件,缓存清理代码集成到主题就好。

              2019.10.29 09:02 # 回复

发表留言

Vultr 送$25,搬瓦工年付最低$49,优惠码 BWH34QMFYT2R,更多推荐VPS信息