本文将详细介绍如何在 Rocky Linux 9 上安装 Redis,并进一步配置自定义的数据存储路径日志文件路径。同时,针对 SELinux 安全机制可能引发的权限问题,提供完整的解决方案,适用于开发与生产环境。


一、准备工作

1. 系统要求

  • Rocky Linux 9(x86_64)
  • root 权限或具有 sudo 权限的用户
  • 网络连接正常

2. 更新系统

sudo dnf update -y

3. 安装必要工具

sudo dnf install -y vim wget curl policycoreutils-python-utils

policycoreutils-python-utils 包含 semanage 命令,用于管理 SELinux 策略。


二、安装 Redis

Rocky Linux 9 的官方仓库中已包含 Redis,可直接通过 DNF 安装:

sudo dnf install -y redis

该命令将安装:

  • redis 服务端
  • 默认配置文件 /etc/redis.conf
  • systemd 服务单元 redis.service

三、启动并启用 Redis 服务

# 启动 Redis
sudo systemctl start redis

# 设置开机自启
sudo systemctl enable redis

# 检查状态
sudo systemctl status redis

默认配置下:

  • 数据持久化文件(RDB):/var/lib/redis/dump.rdb
  • 日志文件:默认使用 syslog(无独立日志文件)
  • 配置文件:/etc/redis.conf
  • 运行用户:redis

四、进阶配置:自定义数据目录与日志目录

假设我们要:

  • 将 RDB 快照文件保存到 /data/redis
  • 将 Redis 日志写入独立文件 /var/log/redis/redis.log

1. 创建自定义目录并设置权限

sudo mkdir -p /data/redis
sudo mkdir -p /var/log/redis

# 设置属主为 redis 用户(Redis 默认运行用户)
sudo chown -R redis:redis /data/redis
sudo chown -R redis:redis /var/log/redis

2. 修改 Redis 配置文件

编辑 /etc/redis.conf

sudo vim /etc/redis.conf

修改数据目录(RDB 路径)

找到 dir 配置项,修改为:

dir /data/redis

此路径用于保存 dump.rdb 文件(RDB 持久化)和 AOF 文件(如果启用)。

启用独立日志文件(而非 syslog)

默认 Redis 使用 syslog。若需写入文件,需修改以下选项:

# 注释掉或删除以下行(如果存在):
# syslog-enabled yes

# 启用文件日志
logfile /var/log/redis/redis.log

注意:确保 logfile 路径可写,且父目录存在。

可选:启用 AOF 持久化(推荐生产环境)

appendonly yes
appendfilename "appendonly.aof"

AOF 文件也将保存在 dir 指定的目录中(即 /data/redis)。

3. 重启 Redis 服务

sudo systemctl restart redis

五、处理 SELinux 权限问题(关键步骤)

Rocky Linux 9 默认启用 SELinux(Enforcing 模式),会阻止 Redis 访问非标准路径。

1. 查看默认 Redis 目录的 SELinux 上下文

ls -Z /var/lib/redis
# 输出示例:unconfined_u:object_r:redis_var_lib_t:s0

# 默认日志由 syslog 管理,无独立文件,但可参考通用日志类型

2. 为自定义目录设置正确的 SELinux 上下文

数据目录(/data/redis)

sudo semanage fcontext -a -t redis_var_lib_t "/data/redis(/.*)?"
sudo restorecon -Rv /data/redis

日志目录(/var/log/redis)

Redis 没有专用的日志类型,但可使用通用日志类型 redis_log_t(若不存在则创建),或使用 var_log_t

先检查是否存在 redis_log_t

seinfo -afile_type | grep redis

通常系统未预定义 redis_log_t,因此我们使用 var_log_t(标准日志类型):

sudo semanage fcontext -a -t var_log_t "/var/log/redis(/.*)?"
sudo restorecon -Rv /var/log/redis

✅ 更佳实践:为 Redis 创建专用日志类型(可选,高级)
若需严格隔离,可自定义 SELinux 策略,但对大多数场景 var_log_t 已足够安全。

3. 验证上下文是否生效

ls -Z /data/redis
ls -Z /var/log/redis

应分别显示 redis_var_lib_tvar_log_t


六、验证配置是否生效

1. 检查服务状态

sudo systemctl status redis

确保无 Permission deniedFailed at step EXEC 错误。

2. 查看日志文件

sudo tail -f /var/log/redis/redis.log

应看到类似:

Ready to accept connections

3. 测试数据写入与持久化

redis-cli
127.0.0.1:6379> SET test_key "hello_redis"
OK
127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379> exit

检查数据文件是否生成:

ls -l /data/redis/
# 应看到 dump.rdb(和 appendonly.aof,如果启用了 AOF)

七、防火墙与安全建议(可选)

1. 防火墙配置(如需远程访问)

Redis 默认仅监听 127.0.0.1。若需外部访问(谨慎操作!):

编辑 /etc/redis.conf

bind 0.0.0.0  # 或指定 IP
protected-mode no  # 关闭保护模式(仅在有密码时安全)

并设置密码:

requirepass your_strong_password

然后开放端口:

sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --reload

🔒 强烈建议:生产环境务必设置 requirepass,并限制绑定 IP。


八、常见问题排查

1. Redis 启动失败,提示 “Permission denied”

  • 检查目录属主是否为 redis:redis

  • 检查 SELinux 上下文:ls -Z

  • 临时设为 Permissive 模式测试:

    sudo setenforce 0
    sudo systemctl restart redis
    

    若成功,则确认是 SELinux 问题,恢复 Enforcing 后修正上下文。

2. 日志文件未生成

  • 确保 logfile 路径正确且父目录存在
  • 确保未启用 syslog-enabled yes
  • 检查 Redis 是否有写权限(包括 SELinux)

九、总结

通过本教程,你已完成:

  • 在 Rocky Linux 9 上安装 Redis
  • 自定义 RDB/AOF 数据目录为 /data/redis
  • 配置独立日志文件 /var/log/redis/redis.log
  • 正确处理 SELinux 上下文,避免权限拒绝

关键要点

  • 所有自定义目录必须属于 redis 用户
  • SELinux 是“静默杀手”,务必使用 semanage + restorecon 设置上下文
  • 生产环境务必启用密码认证和网络限制

📌 教程完成于 2025 年 12 月,适用于 Rocky Linux 9 + Redis(版本 ≥ 6.0,默认仓库版本)。
如需最新版 Redis,可从源码编译,但需自行处理 systemd 服务与 SELinux 策略。