0x01 前言
最近给网站环境全部换了一遍。
主要就是把之前停止支持的centos8换成ubuntu了,然后把网站引擎、wordpress和数据库之类的全部用docker构建,过程中踩了许多坑。
性能优化的大头就是增加了用WP Super Cache插件实现的静态缓存和用Redis Object Cache插件实现的对象缓存,在用缓存插件前这个数值高达三四百甚至六七百毫秒,效果很不错。
在用WP Super Cache之前因为它里面强行打的广告试过一下Jetpack Boost,结果就是开启Boost的页面缓存后网站左下角2233的live2d小人和右下角的sakana挂件没了,最终还是用回WP Super Cache。
0x02 Predis
安装
在使用Redis Object Cache时碰到一个问题,就是wordpress这个docker容器里的php没有phpredis扩展,这个插件没法用。
在网上搜索一番后,找到的phpredis安装方法都是步骤挺多的方法,因为容器里面啥命令都没有(比如vi和vim,apt也需要换源)很麻烦,所以决定先搁置phpredis。后来发现了替代方法,就是用Predis,这个简单好安装。
首先进入wordpress容器的终端,在宿主机运行
docker exec -it <容器名称> /bin/bash
这样就进入wordpress容器的环境了。
php的可执行文件在
/usr/local/bin/
中
运行下面的命令准备好文件
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
然后cd到wordpress的目录,官方docker镜像中的目录就在/var/www/html/
,再运行
composer require predis/predis
操作之后会出现一个vendor
文件夹,说明已经将Predis安装完毕了。
配置
打开wordpress根目录的wp-config.php,增加下面的内容
// 默认使用phpredis,加这行改为predis
define('WP_REDIS_CLIENT', 'predis');
// Redis的主机名或IP
define('WP_REDIS_HOST', 'your-redis-host');
// Redis端口,默认6379
define('WP_REDIS_PORT', 6379);
// Redis的密码,没有设置就不加这行
define('WP_REDIS_PASSWORD', 'your-redis-password');
搞定这些后重启wordpress容器,Redis Object Cache就显示可访问Redis了,我启用缓存后网站突然就挂了,说连接不到127.0.0.1:6379
,我寻思我redis用的是docker网络里的主机名啊,也不是127.0.0.1
。报错提示让我把wp-content
目录里的object-cache.php
删了就能恢复正常,我打开这个文件一看,又是个配置文件,搜索6379
后定位到配置那几行
$parameters = [
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
'password' => 'password-of-redis',
'database' => 0,
'timeout' => 1,
'read_timeout' => 1,
'retry_interval' => null,
'persistent' => false,
];
原来是这里出问题了,把host
改为redis主机名后网站恢复正常。
顺便一提,原本没有password
这个键值对,redis有密码的话就需要自己把这个加上。
终于!插件正常运行了
但是predis毕竟是用php写的,性能没有用c写的phpredis性能好,所以我还是忍不住想要把它换成phpredis。
0x03 PhpRedis
第一次尝试
翻了一下phpredis的官方文档,按照他的教程走了一遍
git clone https://github.com/phpredis/phpredis.git
cd phpredis
phpize
./configure [--enable-redis-igbinary] [--enable-redis-msgpack] [--enable-redis-lzf [--with-liblzf[=DIR]]] [--enable-redis-zstd] [--enable-redis-lz4]
make && make install
因为容器里面没有git
,所以文件是从从宿主机复制进去的,使用下面的命令
sudo docker cp phpredis-6.1.0.tar.gz <容器名称>:/home
编译安装完后告诉我
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20220829/
然后就没有然后了,输入php -m
也没有看到redis模块。思路断了不深究了,结束!
第二次尝试
在找教程的过程中突然就打开/usr/local/bin/
看了看,发现里面有一堆特别的二进制文件,比如docker-php-ext-install
之类的,看着就很可疑,搜索之后发现原来就是专门用来在容器里面装扩展的,这下看懂了。
但是docker-php-ext-install
是用来安装/usr/src/php/ext
目录下已有扩展的,现在没用。
但是我们可以用pecl
包管理器来下载phpredis,直接运行
pecl install redis
docker-php-ext-enable redis
查看执行结果
php -m | grep redis
回显
redis
安装成功!重启容器再看看插件状态
自动切换到phpredis了,太享受。
以防万一还是把
wp-config.php
里的define('WP_REDIS_CLIENT', 'predis');
删了。
我去!Redis大神