基于 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
哇,好快好快,秒射
@神父 囧~这里还没上啊。
既然用到了wordpress和提到了米饭吧,可以尝试一下他的一脚包llstack,这个用到的是LiteSpeed,据说性能在wordpress下比nginx大大领先
@浮游 好,谢谢推荐,有空折腾试试。
@浮游 然而 LiteSpeed 需要付费,不过服务器内存不超 2G 可以申请免费 KEY。
@老头 是啊,要不是因为当初litespeed收费,按照litespeed性能,还真没Nginx和apache什么事了
博主说的是啥?
@从良未遂 打酱油就好,哈哈。
俺用的是虚拟机,没办法了
@张波博客 囧……放着 VPS 闲置……
@老头 VPS速度慢,虚拟机是香港的,所以。。呵,VPS练练手
@张波博客 练练手就可以开干了。
第一次看到这种加速方法,不过我的已经很快了。
@奶爸建网站笔记 我的也还行,最主要是没多少访问量。
你的本来就很快了,早有更快没有最快~~ 阿帕奇飘过
@Sam.Z 以前也是阿帕奇,后来 .htaccess 折腾烦了,死活折腾不出想要的效果,就换到 nginx,挺好的。
请教一下,已经有 WP Fastest Cache 就不需要再次用 NGINX 缓存了吧?
另外这种 NGINX 缓存的方式好用么?毕竟只有缓存,没有压缩以及合并CSS,JS 之类的功能。
@Edwin 缓存跟压缩合并CSS之类是两码事……缓存一般用一种就好了吧,nginx 这种好处是不需要经过 php,性能会好那么一点点吧。
@老头 我在nginx里加入这个配置,也是不经过PHP的。
@老头 你看这篇文章吧: https://www.lurbk.com/lur1988.html
@Edwin 不需要 php 的话也挺好,不过始终是 WP 插件,与 WP Super Cache 之类插件差别不会太大吧。用 nginx 的话其实可以考虑用它内置的 FastCGI_Cache。
@老头 我用过 WP Super Cache, 但测试效果并没有 fastest 好, 也有可能是我不会设置。
缓存的话,随意一个都可以,不过最主要是这个fastest集成了HTML,CSS,JS 压缩,如果用其他缓存方式的话,还需要额外安装一个压缩插件。
@Edwin 嗯,网上评测 WP Fastest Cache 效果会好一点,不过两者我都没怎么用过。FastCGI_Cache 可以不安装插件,缓存清理代码集成到主题就好。