RHEL 系发行版上装 Redis 的命令比 Ubuntu 还短,但默认装到的版本往往偏旧,而且 SELinux 与 firewalld 两道墙都得单独放行。这篇按 Rocky Linux 9 / AlmaLinux 9 / CentOS Stream 9 讲,顺带说明怎么在一台机器上跑多个实例。
一、安装与版本选择
dnf list available redis # 先看源里是什么版本
sudo dnf install -y redis
redis-server --version
Rocky 9 / Alma 9 的 AppStream 里提供的是 Redis 6.2(CentOS 7 上是 3.2,已经很老了)。6.2 对绝大多数场景够用;需要 7.x 的新特性,可选的路子是官方源编译安装或第三方仓库(如 REMI),生产环境建议先在测试机上验证再上。
别把版本差异当成 bug:Redis 7 的 INFO 字段、AOF 目录结构(改成 appenddirname 多部分 AOF)都和 6.x 不一样,跨版本迁移前先确认客户端和运维脚本兼容。
启动并设为开机自启:
sudo systemctl enable --now redis
systemctl status redis
redis-cli ping # 返回 PONG
RHEL 系的服务名就叫 redis(Ubuntu 上是 redis-server),配置文件在 /etc/redis/redis.conf,数据目录 /var/lib/redis。
二、redis.conf 里这 5 项必须核对
| 配置项 | 默认值 | 建议 | 说明 |
|---|---|---|---|
bind |
127.0.0.1 -::1 |
需要远程才改 0.0.0.0 |
只监听本机是最安全的状态 |
protected-mode |
yes |
保持 yes |
没有密码又关掉它=对全网可读写 |
requirepass |
无 | 设长随机密码 | 6379 暴露在公网且无密码,通常撑不过一天 |
supervised |
no(部分版本 auto) |
systemd |
交给 systemd 管理更干净 |
appendonly |
no |
按用途决定 | 当缓存可不开,当存储必须开 |
内存上限同样建议显式设置,避免 Redis 吃光内存被 OOM killer 杀掉:
maxmemory 1gb
maxmemory-policy allkeys-lru
改完 sudo systemctl restart redis,然后用 redis-cli -a '密码' info server 确认加载的配置文件路径就是你改的那个(有时会因为启动参数指向别处)。
👉 密码别手写:随机密码生成器(在线免登录)
三、firewalld 与 SELinux
Redis 默认端口 6379,在 RHEL 系上要走 firewalld:
# 只允许某个来源 IP,推荐
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.7" port protocol="tcp" port="6379" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
云服务器还要在控制台安全组放行。
SELinux 这一侧,Redis 包自带策略,默认 6379 是放行的,正常装完不用管。但改了端口(比如 6380)就必须放行,否则服务起不来且日志里只看到权限拒绝:
sudo dnf install -y policycoreutils-python-utils
sudo semanage port -a -t redis_port_t -p tcp 6380
sudo semanage port -l | grep redis
改数据目录同理,需要给新目录打上 redis_var_lib_t 上下文:
sudo semanage fcontext -a -t redis_var_lib_t "/data/redis(/.*)?"
sudo restorecon -Rv /data/redis
不确定是不是 SELinux 挡的,先 sudo setenforce 0 试一次:问题消失就说明是策略问题,去看 /var/log/audit/audit.log 用 audit2allow 精准放行,而不是把 SELinux 一关了之。
四、一台机器跑多个实例
测试环境或按业务隔离时,常用做法是复制一份配置、改端口和目录,再交给 systemd 用模板单元管理。
sudo cp /etc/redis/redis.conf /etc/redis/redis-6380.conf
sudo vim /etc/redis/redis-6380.conf
在这份新配置里至少改这几项:
port 6380
pidfile /var/run/redis/redis-6380.pid
logfile /var/log/redis/redis-6380.log
dir /var/lib/redis-6380
appendonly yes
建数据目录并改属主:
sudo install -o redis -g redis -d /var/lib/redis-6380 /var/log/redis
RHEL 系的 redis 包一般会带 redis@.service 模板单元,可以直接这样起:
sudo systemctl enable --now redis@6380
systemctl status redis@6380
redis-cli -p 6380 -a '密码' ping
如果发行版没提供模板单元,就手写一个 /etc/systemd/system/redis-6380.service,ExecStart 指向 redis-server /etc/redis/redis-6380.conf,然后 systemctl daemon-reload。每个实例的内存上限要一起调小,否则两个实例各按 1G 申请,加起来可能超机器内存。
五、四个常见报错
| 现象 | 原因 | 处理 |
|---|---|---|
启动日志 WARNING overcommit_memory is set to 0 |
内核内存策略不利于 fork 快照 | sudo sysctl -w vm.overcommit_memory=1,写入 /etc/sysctl.d/99-redis.conf 持久化 |
WARNING: Transparent Huge Pages (THP) support enabled |
THP 导致延迟抖动 | 关掉 THP(写 systemd 单元或 rc.local 开机执行) |
NOAUTH Authentication required |
已设密码但客户端没认证 | redis-cli -a 密码,连接后 AUTH 密码 |
Job for redis.service failed ... Permission denied |
目录属主不对或 SELinux 未放行 | chown -R redis:redis + restorecon -Rv |
| 改了配置不生效 | 实际加载的是另一个配置文件 | redis-cli info server 看 config_file |
查日志:journalctl -xeu redis,或配置里 logfile 指向的路径。
六、卸载
sudo systemctl stop redis
sudo dnf remove -y redis
sudo rm -rf /etc/redis /var/lib/redis
小结
RHEL 系装 Redis 的顺序:dnf 安装 → 确认版本 → 改 bind / 密码 / 内存上限 / 持久化 → firewalld 放行指定来源 → (改端口或目录时)放行 SELinux。相比 Ubuntu,多出来的就是 firewalld 与 SELinux 这两道 RHEL 特有的墙。
跑起来之后做一次自检:ss -lntp | grep 6379 看监听地址,redis-cli -a 密码 info persistence 看持久化是否按预期开着。这两条能挡掉八成上线后才暴露的问题。
👉 排障常用的在线工具:Linux 命令速查 · SSH 连通性检测 · 端口探测与 Ping