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 部署通常有多个进程:
- 一个网络服务器处理静态文件和代理请求到 rails(通常是 nginx,你提到了 apache)
- rails 网络服务器(在 passenger 的情况下 - 在前一个“内部”,但实际上还有一个子进程)
- 来自 cron
的一些后台工作人员或进程 运行
文件所有权混淆 most 可能源于上述写入磁盘之一,而 运行在不同的 os 用户下进行。
查看您的流程是如何启动的。首先怀疑是某些 cron 作业可能配置为 system-wide,这些 运行 在 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 部署通常有多个进程:
- 一个网络服务器处理静态文件和代理请求到 rails(通常是 nginx,你提到了 apache)
- rails 网络服务器(在 passenger 的情况下 - 在前一个“内部”,但实际上还有一个子进程)
- 来自 cron 的一些后台工作人员或进程 运行
文件所有权混淆 most 可能源于上述写入磁盘之一,而 运行在不同的 os 用户下进行。
查看您的流程是如何启动的。首先怀疑是某些 cron 作业可能配置为 system-wide,这些 运行 在 root 下。