



















最近迁移了服务器,我在重新配置网站时注意到了在 LiteSpeed WordPress 插件中,用的是 127.0.0.1 这种 TCP 方式连接到 Redis 缓存数据库,感觉不太优雅,因为隔壁 PHP 连接 MySQL 都是用的 Unix Socket 方式(即通过 /var/run/mysqld/mysqld.sock 来连接)。使用 Unix Socket 连接虽然会让数据库无法远程连接,只能在本机使用,但速度相比 TCP 连接更快,何况我也不需要跨服务器使用 Redis。
但更重要的是,我发现把缓存数据存储到 Redis 时没有任何鉴权方式,任何程序都可以写入,比较危险。这篇文章会教你如何修改 Redis 配置,新建用户、配置权限,来让数据库更安全;并且启用 Unix Socket 功能,减少 TCP 连接开销,提升性能。
127.0.0.1 在正常工作;默认情况下,Redis 允许任何人不需要密码就能读写所有数据,十分滴危险。要启用访问控制列表(ACL),需要修改 Redis 配置文件。但在此之前,我们先在配置目录创建一个用户列表,包含一个 default 用户。
这个 default 初始用户会用来创建新的管理员用户和普通用户,并且在之后会被禁用,操作如下(请将 strong_password 替换为强密码,最好不含特殊符号,大于号需要保留):
echo "user default on >strong_password ~* &* +@all" | sudo tee /etc/redis/users.acl然后进行权限配置:
sudo chown redis:root /etc/redis/users.acl
sudo chmod 600 /etc/redis/users.acl接下来需要创建一个配置文件,来让 Redis 读取这个 ACL:
sudo mkdir -p /etc/redis/modules
sudo tee /etc/redis/modules/user.conf << EOF
# User ACL
aclfile /etc/redis/users.acl
EOF然后进行权限配置:
sudo chown redis:root /etc/redis/modules/user.conf
sudo chmod 600 /etc/redis/modules/user.conf然后查看 Redis 的主配置文件 /etc/redis/redis.conf,确认里面有这么一行:
include /etc/redis/modules/*.conf如果没有的话,可以将其加在 INCLUDES 块里,如图:

然后重启 Redis:
sudo systemctl restart redis使用 sudo redis-cli 进入 Redis 命令行,先以 default 用户鉴权:
AUTH default strong_password然后创建 admin 用户(second_strong_password 请替换成强密码):
ACL SETUSER admin on >second_strong_password ~* &* +@all命令各部分含义如下,详见 Redis ACL:
on 表示启用该用户;~* 控制该用户可以访问哪些键,* 是通配符,代表所有键;&* 表示允许该用户订阅/发布 Redis 中所有的 Pub/Sub 频道;+@all 控制命令的执行权限,+ 表示允许执行,@all 是 Redis 内置的命令分类,代表所有 Redis 命令。然后创建 wp_cache 用户,将会用于存取 WordPress 缓存(third_strong_password 请替换成强密码,~wp_cache:* 表示该用户仅能操作以 wp_cache: 为前缀的键,-@admin 表示该用户无管理权):
ACL SETUSER wp_cache on >third_strong_password ~wp_cache:* +@all -@admin最后保存权限列表并退出:
ACL SAVE
QUIT然后我们可以使用 sudo cat /etc/redis/users.acl 查看用户是否添加成功,同时你会注意到所有用户的密码均以 SHA256 而非明文存储。接下来,需要禁用 default 用户,再次使用 sudo redis-cli 进入命令行,然后使用 admin 用户及其密码鉴权:
AUTH admin second_strong_password然后禁用 default 用户并保存退出:
ACL SETUSER default off
ACL SAVE
QUIT最后再次使用 sudo cat /etc/redis/users.acl 查看下是否禁用,输出内容如下图:

对于 WordPress 的缓存数据,我们刚才创建了 wp_cache 用户,并且仅允许他操作以 wp_cache: 为前缀的键。虽然在插件设置中可以设置用户名和密码,但不能设置键的前缀,所以我们需要在 wp-config.php 中加入常量来告诉插件。wp-config.php 位于网站根目录,需要在指定地方(注意注释)加入 define('LSOC_PREFIX', 'wp_cache:');,如图:

然后在插件的对象缓存设置中加入 wp_cache 用户名及其密码,再将对象缓存开关打开,点击保存设置,应该就能正常工作了。然后我们还要测试一下缓存是否能清除,点击插件工具箱里的「清除全部 – 对象缓存」,无报错即可。

注意:仅在配置好上文的用户权限控制后,才推荐启用 Unix Socket,否则谁都能随意读写数据库
另外,如果配置了 Socket,并且禁用了 TCP 连接方式,使用 Redis CLI 时应使用 sudo redis-cli -s <path to redis.sock> 命令。
我们准备将 Socket 放于 /var/run/redis/redis.sock,执行以下命令创建文件夹并设置权限:
sudo mkdir -p /var/run/redis
sudo chown -R redis:redis /var/run/redis
sudo chmod 755 /var/run/redis接下来需要创建一个配置文件,设置 Socket 位置和权限:
sudo mkdir -p /etc/redis/modules
sudo tee /etc/redis/modules/socket.conf << EOF
# Unix Socket
unixsocket /var/run/redis/redis.sock
unixsocketperm 770
EOF
sudo chown redis:root /etc/redis/modules/socket.conf
sudo chmod 640 /etc/redis/modules/socket.confunixsocketperm 770 表示这个 Socket 可以由 redis 用户及 redis 组的用户读/写/执行,其他用户无任何权限。所以我们需要将使用 Redis 的用户加入 redis 组(OpenLiteSpeed 默认使用 nobody 用户执行 LSPHP):
sudo usermod -aG redis nobody另外,如果你没有远程访问需求,可以在 Redis 主配置(/etc/redis/redis.conf)中,找到 port 6379,将其改为 port 0,就能彻底关闭 TCP 连接方式。最后重启 Redis:
sudo systemctl restart redis同样在插件对象缓存设置中,设置 Redis 主机为刚才的 Socket 地址 /var/run/redis/redis.sock,同时设置端口为 0,然后点击开启缓存,点击保存即可,如果连接测试显示通过就没问题了。

预计还会写一个文章讲如何利用 OpenLiteSpeed 建站,确实很好用,和插件搭配起来速度很快。也欢迎到 主页 看其他内容。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。