常阳时光

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」表示成功。

WordPress 插件清理缓存

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

Nginx Helper 插件作者:rtCamp

默认配置:

参考资料:米饭粑 - 用 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