由于缓存目录将所有权更改为 root,Rails 6 应用程序失败

Posted

技术标签:

【中文标题】由于缓存目录将所有权更改为 root,Rails 6 应用程序失败【英文标题】:Rails 6 application fails due to cache directory changing ownership to root 【发布时间】:2021-01-27 06:54:21 【问题描述】:

我有一个在 Debian buster 上运行的 Rails 6 应用程序。在一个地方,我正在使用“低级”缓存。以下是相关代码:

# Get the value.
def self.ae_enabled?()
  Rails.cache.fetch("ae_enabled", expires_in: 1.hour)
end

# Change the value.
def self.ae_toggle()
  ac = AdminConfiguration.find_by(name: "ae-enabled")                    

  ac.value = ! ac.value
  ac.save()                        

  # Invalidate the cache.
  Rails.cache.delete("ae_enabled")        

  return ac
end

这工作得很好......一段时间。在某些时候,由于我无法弄清楚的原因,缓存上述值的缓存目录tmp/cache/3F1/ 将所有权从www-data:www-data(运行Apache 的用户)更改为root:root。一旦发生这种情况,Apache 将无法再读取此缓存值并且应用程序将引发错误。

奇怪的是,tmp/cache/ 下的其他目录没有权限发生变化,只是与这个低级缓存关联的一个。

为什么那个特定的缓存目录会改变所有权?

技术细节:Rails 版本 6.0.3.3。

【问题讨论】:

【参考方案1】:

Apache 通常不涉及 Rails 缓存,除非您使用乘客,在这种情况下可能是乘客的错误/错误配置,请检查用户沙箱是否启用和配置正确。

典型的 Rails 部署通常有多个进程:

    一个处理静态文件并将请求代理到 Rails 的 Web 服务器(通常是 nginx,你提到过 apache) rails web 服务器(在乘客的情况下 - “内部”前一个,但实际上还有一个子进程) 一些后台工作人员或进程从 cron 运行

文件所有权混淆很可能源于在不同的操作系统用户下运行时写入磁盘的上述其中一项。

查看您的流程是如何启动的。首先怀疑是一些可以配置为系统范围的 cron 作业,这些作业在 root 下运行。

【讨论】:

这确实是一个以 root 身份运行的 cron 作业。 cron 作业触发的缓存隐藏在某些模型代码中。

以上是关于由于缓存目录将所有权更改为 root,Rails 6 应用程序失败的主要内容,如果未能解决你的问题,请参考以下文章

如何将用户(www-data)更改为root

在 /root 和 /home 中安装新发行版后的 Rails 开发环境保持不变

在新的 Rails 项目中从 SQLite 更改为 PostgreSQL

在不使用 ssh 的情况下更改远程目录所有权

将 Rails 应用程序更改为生产环境

如何在 Rails 中将我的数据库从 SQLite 更改为 MYSQL