在wordpress中,静态页面缓存插件通过缓存整个 HTML 页面来减少 PHP 处理时间,当 WordPress 网站依赖用户交互或动态内容时(如 WooCommerce 电子商务网站、会员网站、社交网站等),静态页面缓存无法覆盖所有页面,这种情况就要使用对象缓存通过存储数据库内容来避免重复的数据库查询。这种情况下,使用 Redis 缓存可以显著提升性能。
以下是在 Ubuntu22.04 上安装 Redis 和 php-redis 的步骤。
1.安装最新版的redis
查询ubunt22.04的apt储存库中redis的版本。
apt policy redis
在我写这篇文章的时候,在ubuntu22.04版本上,redis默认版本是6,我们需要安装最新版的7。所以不能直接使用apt install redis
来进行安装。redis官方提供了安装最新版的方法,可以从官方 packages.redis.io APT 存储库安装 Redis Stack 的最新稳定版本。官方安装方法 ,具体的就是下面几条命令:
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
还有另外一种安装最新版的方法,就是使用snapd,命令如下:
sudo snap install redis
2.测试redis运行状态
不出意外的话,我们的redis已经安装好了。先查看一下是否在运行。
sudo systemctl status redis
要测试 Redis 是否正常运行,使用Redis 的命令行客户端连接到服务器
redis-cli
输入ping
127.0.0.1:6379> ping
如果输出PONG,就代表运行正常。
Output
PONG
3.优化redis 性能
1 使用uninx sock连接而不是使用TCP/IP连接
Unix 域套接字是一种特殊的文件,用于本地进程间通信(IPC),与网络套接字相比,具有更低的延迟和开销,因为它们不需要经过网络协议栈。redis默认配置不是使用unix sock的,所以,我们需要打开。在/etc/redis/redis.conf 文件中的 unix socket的配置,打开注释,并修改为正确路径。
unixsocket /var/run/redis/redis.sock
unixsocketperm 770
如果修改为使用uninx sock 连接,注意文件的权限,你可能需要把redis 用户加入www-data 组中
sudo usermod -aG redis www-data
2 设置内存限制和内存策略,
设置应用程序所需的内存容量,例如 128MB. 默认情况下,当达到 maxmemory 时,Redis 会停止写入新数据。如果你希望 Redis 通过自动删除旧数据来继续写入新数据,就必须告诉 Redis 如何删除旧数据。为 maxmemory-policy 指令设置推荐值 allkeys-lru。
# Set a memory usage limit to the specified amount of bytes.
# When the memory limit is reached Redis will try to remove keys
# according to the eviction policy selected (see maxmemory-policy).
maxmemory 128mb
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones with an expire set.
# allkeys-random -> Remove a random key, any key.
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
# noeviction -> Don't evict anything, just return an error on write operations.
#
# LRU means Least Recently Used
# LFU means Least Frequently Used
#
maxmemory-policy allkeys-lru
...
4.配置redis安全
4.1修改管理方式
在 Redis 的配置文件 redis.conf 中,supervised 选项用于配置 Redis 与操作系统的服务管理器(如 systemd 或 upstart)的交互方式。在一些老的版本或者老的教程中,这个选项默认配置是no,我现在安装的7.2版本默认是配置是auto,Redis 会自动检测当前系统使用的是 upstart 还是 systemd,并选择相应的方式进行交互,所以可以不修改。你也可以把他修改为systemd。
supervised systemd
4.2修改redis连接地址
默认情况下,Redis 只能从localhost访问。但是,如果您按照不同的教程安装和配置了 Redis,则可能已更新配置文件以允许从任何地方进行连接。为了安全,我们一般都设置为只允许从本机连接redis,确认redis只能从本地localhost连接,查看 /etc/redis/redis.conf 文件
sudo vi /etc/redis/redis.conf
确认这一行的注释是打开的
. . .
bind 127.0.0.1 ::1
. . .
如果你修改了redis.conf 记得重启一下
sudo systemctl restart redis-server
查看系统中运行的 Redis 实例的网络连接和端口信息。
sudo netstat -lnp | grep redis
输出类似信息
Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server
tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server
4.3配置Redis密码
配置 Redis 密码要求客户端进行身份验证才能访问数据库。密码直接在 Redis 的配置文件中配置,/etc/redis/redis.conf 再次打开该文件:
sudo vi /etc/redis/redis.conf
取消这一行的注释
. . .
# requirepass foobared
. . .
通过删除#号 来取消注释,然后更改foobared为你的安全密码,建议密码长度足够长或者通过openssl生成一段随机字符。
修改后类似这样
. . .
requirepass W3y8T2h3Hf5/D7p8G8Z9ZcZ7KJ8VzPv9F3r6G5r2H5J6G4y8J3g9Z5t7G6p5X1=
. . .
设置密码后,保存并关闭文件。然后重新启动Redis:
sudo systemctl restart redis.service
4.4 测试密码是否有效
为了测试密码是否有效,打开 Redis 客户端:
redis-cli
下面显示了用于测试 Redis 密码是否有效的一系列命令。第一个命令在身份验证之前尝试将密钥设置为某个值:
set key1 10
这将不起作用,因为您没有进行身份验证,所以 Redis 将返回错误:
Output
(error) NOAUTH Authentication required.
下一个命令使用 Redis 配置文件中指定的密码进行身份验证:
auth W3y8T2h3Hf5/D7p8G8Z9ZcZ7KJ8VzPv9F3r6G5r2H5J6G4y8J3g9Z5t7G6p5X1=
Redis 会输出OK:
Output
OK
之后再次运行上面的命令就会成功:
127.0.0.1:6379> set key1 10
Output
OK
get key1向 Redis 查询新键的值。
127.0.0.1:6379> get key1
Output
"10"
确认通过身份验证后能够在 Redis 客户端中运行命令后,您可以退出redis-cli:
quit
4.5重命名或完全禁用某些被视为危险的命令(可选)
重命名一些敏感的命令,如果错误输入或由恶意行为者输入,可能会对您的数据造成严重影响。
要重命名或禁用 Redis 命令,请再次打开配置文件:
sudo vi /etc/redis/redis.conf
要禁用命令,请将其重命名为空字符串(用一对引号表示,中间没有字符),如下所示:
. . .
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .
要重命名命令,请为其指定另一个名称,如以下示例所示。重命名的命令应该难以让其他人猜到,但易于您记住:
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .
重命名这个措施有一点复杂,可能过段时间忘掉了修改后的名称,出现问题不容易排查。另外重命名操作最好在安装后就进行修改,中途修改可能会导致不生效的问题。
所以如果只是在wordpress中使用,我个人的建议还是不需要添加重命名这个安全措施了,如果你是大型的工程,可以酌情修改。 redis已经安装好了,下一篇文章我们安装php-redis,并启用wordpres redis 插件。