Redis安装、访问控制与连接验证

这篇在新的 Ubuntu 24.04 LTS 服务器上安装系统软件源提供的 Redis 7,供同机程序使用。完成后应满足三点:只监听本机、连接需要密码、测试数据在正常重启后仍能读取。本文使用兼容密码认证的单实例方案;多应用的独立账号与命令权限,需要另外配置ACL。

本流程用于尚未写入业务数据的新实例。已有数据的Redis不能仅修改appendonly yes就直接重启;从RDB切换AOF需要先在线生成并验证持久化文件。先确认环境,再继续下面的新装步骤。

安装后先记录版本和服务状态

cat /etc/os-release
sudo apt update
apt-cache policy redis-server redis-tools
sudo apt install redis-server redis-tools nano
redis-server --version
redis-cli --version
sudo systemctl status redis-server --no-pager

确认系统为Ubuntu24.04、实际版本为Redis7,且没有其他业务正在使用这个实例。如果软件来自面板、容器或第三方软件源,服务名和配置位置可能不同,不混用本文的系统包路径。

设置本机监听、密码和持久化

提前用密码管理器生成独立长密码,或在自己的终端运行openssl rand -hex 24生成并安全保存。然后备份配置、打开原文件,记下备份路径,方便配置写错时恢复。

bl_redis_backup="/etc/redis/redis.conf.before-baole-$(date +%Y%m%d-%H%M%S)"
sudo cp -a /etc/redis/redis.conf "$bl_redis_backup"
printf '原配置备份:%s\n' "$bl_redis_backup"
sudo nano /etc/redis/redis.conf

找到并修改相应配置项,不在文件末尾重复堆叠同名设置。将下面密码占位文字替换为刚才生成并安全保存的独立随机密码。

bind 127.0.0.1 -::1
protected-mode yes
port 6379
requirepass 替换成你自己的独立随机密码
appendonly yes
appendfsync everysec
maxmemory 256mb
maxmemory-policy noeviction

256mb只是示例上限,要给系统、同机应用和持久化过程留内存。noeviction表示达到上限后部分写入会报错,不自动删除旧键;纯缓存业务需要其他淘汰策略时,应按应用用途另作选择。

保留原有RDB快照设置。appendfsync everysec不是零丢失承诺,异常断电等情况下可能丢失最近约一秒的写入;AOF也不能替代服务器之外的备份。配置里含密码,应保留系统包原有的受限文件权限,不放进网站目录。

保存退出,在这个新实例上重启并查看日志:

sudo systemctl restart redis-server
sudo systemctl status redis-server --no-pager
sudo journalctl -u redis-server -n 50 --no-pager
sudo ss -ltnp '( sport = :6379 )'

6379应只显示127.0.0.1和可能存在的::1监听。若服务启动失败,先按日志核对配置行、目录权限和端口占用;需要回退时使用刚才保存的原配置,确认恢复结果后再重启,不删除数据目录。

先验证密码,再写入一个会自动过期的测试键

先不带密码检查,再使用交互密码提示,避免把密码写入命令参数或截图:

redis-cli -h 127.0.0.1 -p 6379 PING
redis-cli -h 127.0.0.1 -p 6379 --askpass PING

第一条应返回NOAUTH Authentication required;第二条输入正确密码后应返回PONG。再进入交互客户端:

redis-cli -h 127.0.0.1 -p 6379 --askpass

以下在Redis提示符里执行。NX只在键不存在时写入,EX 600让它十分钟后自动过期:

SET baole:help-check:001 "baoleyun-redis-ok" NX EX 600
GET baole:help-check:001
TTL baole:help-check:001
INFO persistence

SET应返回OK,GET应返回baoleyun-redis-ok,TTL为正数。若SET返回空值,说明同名键已存在,换一个独立测试键名,不覆盖或删除它。持久化信息应包含aof_enabled:1,并检查aof_last_write_status:ok及相关错误。

重新启动后,再检查同一个键

保存测试键后等待数秒,在另一SSH窗口重启这个新测试实例:

sudo systemctl restart redis-server
redis-cli -h 127.0.0.1 -p 6379 --askpass GET baole:help-check:001

在十分钟过期时间内,应仍能读到同一个值。还应重新确认密码有效、监听范围没有变化;若刚好超过TTL,重新选择新键完成测试,不能据此认定持久化失效。测试键会自行过期,不需要执行FLUSHDB或FLUSHALL。

连接到程序,以及常见错误

同机程序填写主机127.0.0.1、端口6379、独立密码,用户名通常使用default或按客户端要求留空。此兼容密码对应默认账号,不能当作多用户权限隔离。容器内的127.0.0.1指容器自己,要另按容器网络设计连接方式。

现象 处理方向
NOAUTH 客户端没有发送认证信息,检查程序的密码配置是否实际加载。
WRONGPASS 核对密码、用户名及连接到的实例,留意旧环境变量和配置缓存。
Connection refused 检查服务、实际端口和运行位置;不靠开放公网6379解决本机连接问题。
OOM command not allowed 先查看内存使用和maxmemory,区分容量、键增长与淘汰策略,不直接清空数据库。

最后用程序本身完成一次实际缓存或会话读写。PONG证明Redis能应答,程序自己的键是否写入、过期和读取正常,才是该应用接入完成的依据。