Apache 下的 Django 运行 和 mod_wsgi 使用 "virtual" 文件系统?

Django running under Apache and mod_wsgi uses "virtual" file system?

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

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

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

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

我真的很纳闷。似乎以某种方式存在一种 "virtual" 文件系统,它可以正常工作但与真实的东西并行。我正在使用 Django 1.11.11。

谁在施展魔法? Django、Apache、mod_wsgi?还有别的吗?

好的,@DanielRoseman 是对的:"More likely the file is being created in another location"。它可以影响任何文件系统操作的原因是它是 systemd 的一个特性,称为 PrivateTmp. From the documentation:

sets up a new file system namespace for the executed processes and mounts private /tmp and /var/tmp directories inside it that is not shared by processes outside of the namespace

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

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

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