Rails 6 应用程序因缓存目录所有权更改为根目录而失败

Rails 6 application fails due to cache directory changing ownership to root

我在 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/ 下的其他目录 none 的权限发生了变化,只有与这个低级相关的一个缓存。

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

技术细节:Rails 版本 6.0.3.3.

Apache 通常与 rails 缓存无关,除非您使用的是 passenger,在这种情况下可能是 passenger 的 bug/misconfiguration,请检查用户沙盒是否已启用并正确配置。

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

  1. 一个网络服务器处理静态文件和代理请求到 rails(通常是 nginx,你提到了 apache)
  2. rails 网络服务器(在 passenger 的情况下 - 在前一个“内部”,但实际上还有一个子进程)
  3. 来自 cron
  4. 的一些后台工作人员或进程 运行

文件所有权混淆 most 可能源于上述写入磁盘之一,而 运行在不同的 os 用户下进行。

查看您的流程是如何启动的。首先怀疑是某些 cron 作业可能配置为 system-wide,这些 运行 在 root 下。