Redis告诉我“无法打开.rdb进行保存:权限被拒绝”

时间:2016-10-17 21:15:32

标签: django redis

我在Debian服务器8.5上运行Redis服务器2.8.17。我正在使用Redis作为Django 1.8.4应用程序的会话存储。

我没有在我的服务器上更改软件配置几个月,一切都工作正常,直到一周前Django开始提出以下错误:

MISCONF Redis is configured to save RDB snapshots but is currently not able to persist to disk.  Commands that may modify the data set are disabled.  Please check Redis logs for details...

我查看了redis日志,发现这种情况大约每秒发生一次:

1 changes in 900 seconds.  Saving...
Background saving started by pid 22213
Failed opening .rdb for saving: Permission denied
Background saving error

我已经阅读了这两个问题12,但他们没有帮我找到问题。

ps表示用户“redis”正在运行服务器:

redis   26769   ...   /usr/bin/redis-server *.6379

我在配置文件中检查了redis文件名和路径:

grep ^dir /etc/redis/redis.conf =>
dir /var/lib/redis

grep ^dbfilename /etc =>
dbfilename dump.rdb

/ var / lib / redis上的权限是755,它由redis拥有:redis。 /var/lib/redis/dump.rdb上的权限是644,它由redis拥有:redis也是。

我还在服务器进程上运行strace:

ps -C redis-server  # pid = 26769
sudo strace -p 26769 -o /tmp/strace.out

但是当我检查输出时,我没有看到任何错误。特别是我没有像我期望的那样看到“权限被拒绝”错误。

此外,/ var / lib / redis不是NFS目录。

有谁知道还有什么可能导致这个?我不想再停止使用Redis了。我知道我可以运行命令“set stop-writes-on-bgsave-error yes”,但这并没有解决问题。

现在每天都在进行此操作,我可以停止错误的唯一方法是重启Redis服务器。

感谢。

5 个答案:

答案 0 :(得分:4)

我刚才有类似的问题。尽管我的配置文件是正确的,但当我在redis-client中检查实际的dbfilename和dir时,它们是不正确的。

运行redis-cli然后

CONFIG GET dbfilename应返回类似

的内容
1) "dbfilename"
2) "dump.rdb"

1)只是关键和2)价值。同样地,运行CONFIG GET dir应该返回类似

的内容
1) "dir"
2) "/var/lib/redis"

确认这些是正确的,如果没有,请使用CONFIG SET dir /correct/path

进行设置

希望这有帮助!

答案 1 :(得分:4)

如果您已将Redis移至新装入的卷:/mnt/data-01

sudo vim /etc/systemd/system/redis.service

Set ReadWriteDirectories=-/mnt/data-01

sudo mkdir /mnt/data-01/redis

在新的redis数据目录和rdb文件上设置chown和chmod /var/lib/redis上的权限为755,并由redis:redis拥有 /var/lib/redis/dump.rdb上的权限为644,由redis:redis

拥有

在redis运行时切换配置

$ redis-cli
127.0.0.1:6379> CONFIG SET dir /data/tmp
redis-cli 127.0.0.1:6379> CONFIG SET dbfilename temp.rdb
127.0.0.1:6379> BGSAVE
tail /var/log/redis/redis.cnf(验证已保存)

答案 2 :(得分:1)

在Redis具有写入权限的目录中启动Redis Server

上面的答案肯定会解决你的问题,但这是实际发生的事情:

存储rdb.dump文件的默认位置是./(表示当前目录)。您可以在redis.conf文件中对此进行验证。因此,启动redis服务器的目录是创建和更新dump.rdb文件的位置。

既然你说你的redis服务器已经运行了一段时间而且刚刚开始发生,你似乎已经开始在一个目录中运行redis服务器,在该目录中redis没有正确的权限来创建dump.rdb文件。

更糟糕的是,redis也可能不允许您关闭服务器,直到它能够创建rdb文件以确保正确保存数据。

要解决此问题,您必须使用redis-cli进入活动的redis客户端环境并更新dir密钥并将其值设置为项目文件夹或非root权限的任何文件夹。保存。然后运行BGSAVE以调用dump.rdb文件的创建。

CONFIG SET dir "/hardcoded/path/to/your/project/folder"
BGSAVE

(现在,如果你需要将dump.rdb文件保存在启动服务器的目录中,那么你需要更改目录的权限,以便redis可以写入它你可以搜索stackoverflow来了解如何做到这一点。)

您现在应该可以关闭redis服务器了。请注意,我们对路径进行了硬编码。硬编码很少是一种很好的做法,我强烈建议从项目目录启动redis服务器并更改dir key back to ./`。

CONFIG SET dir "./"
BGSAVE

这样当你需要redis用于另一个项目时,转储文件将在你当前项目的目录中创建,而不是在硬编码路径的项目目录中。

答案 3 :(得分:0)

在redis 3.2之前,它带有非常疯狂的默认设置,从而将端口开放给公众。结合CONFIG SET指令,每个人都可以轻松地从外部更改您的Redis配置。如果一段时间后错误开始出现,则可能是有人更改了您的配置。

在您的本地计算机上检查

telnet SERVER_IP REDIS_PORT

被拒绝。否则请检查您的配置,您应该具有设置

bind 127.0.0.1

已启用。

根据运行redis的用户,还应该检查入侵者是否造成了损害。

答案 4 :(得分:0)

您可以通过进入redis-cli

解决此问题。

在终端中输入redis-cli

然后写config set stop-writes-on-bgsave-error no,它解决了我的问题。

希望它可以解决您的问题