【问题标题】:Django running under Apache and mod_wsgi uses "virtual" file system?在 Apache 和 mod_wsgi 下运行的 Django 使用“虚拟”文件系统?
【发布时间】:2019-01-02 22:34:47
【问题描述】:

好的,我知道这很奇怪,但是经过一天的搜索,我找不到这个问题的任何答案。

我已经让这个系统运行两年了,在 Apache 下使用 Django 并安装了经典的 mod_wsgi。网站的精确镜像用于开发和测试。

为了加快查询速度,我使用了内置的 Django 缓存和文件后端。在开发中(内置 Django 服务器)一切正常,并在 /var/tmp/django_cache 下创建了一个文件。一切都在生产中也有效,但没有创建文件。

我很惊讶,所以我开始试验并在django.core.cache 模块中插入了一堆打印,并跟踪缓存内容的执行。在某个时刻,我得到了一个os.makedirs,它不会创建任何东西。我插入了一个open(),创建了一个文件(绝对路径),但没有创建任何内容。试图从不存在的文件中读回内容。

我真的很困惑。似乎以某种方式存在一种“虚拟”文件系统,它可以正常工作但与真实的东西并行。我正在使用 Django 1.11.11。

谁在施展魔法? Django、Apache、mod_wsgi?还有什么?

【问题讨论】:

  • 不,没有虚拟文件系统。该文件更有可能是在另一个位置创建的,可能是因为 Apache 用户设置了 TMPDIR 环境变量
  • @DanielRoseman 环境变量如何影响open("/tmp/test.tmp","w").write("test")?以后可以阅读。而且文件不存在。

标签: python django apache mod-wsgi


【解决方案1】:

好的,@DanielRoseman 是对的:“文件更有可能是在另一个位置创建的”。它可以影响任何文件系统操作的原因是它是systemd 的一个功能,称为PrivateTmp。来自documentation

为执行的进程设置一个新的文件系统命名空间,并在其中挂载私有的 /tmp 和 /var/tmp 目录,该目录不被命名空间外的进程共享

事实上,/tmp/var/tmp 中都有一堆文件夹,名为 systemd-private-273bc022d82337529673d61c0673a579-apache2.service-oKiLBu

不知何故,我的find 命令从未到达这些文件夹。所有创建的文件都在一个非常常规的文件系统中。现在我也明白了为什么 Apache 重启会清除 Django 缓存。 systemd 删除进程 private tmp 并为新进程创建一个新的。

我在这里找到了答案:https://unix.stackexchange.com/a/303327/329567

【讨论】:

    猜你喜欢
    • 2020-10-11
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多