存在的目录出现 ENOENT 错误

存在的目录出现 ENOENT 错误

背景:我正在运行一个 redmine 服务器redmine DMSF 插件,它使用 xapian 提供全文搜索。 Redmine 运行在 Passenger 上,由 Nginx 托管。 Passenger 进程以用户“redmine”和组“nginx”运行。 Passenger 和 Nginx 的 Apparmor 已禁用。

redmine日志提示找不到xapian索引:

REDMAIN_XAPIAN ERROR: Xapian database is not properly set, initiated or it's corrupted.
DatabaseOpeningError: Couldn't stat '/var/tmp/dmsf-index/english'

正在运行的乘客进程的跟踪显示以下内容:

[pid  1013] stat("/var/tmp/dmsf-index/english", 0x7fa3bd112f00) = -1 ENOENT (No such file or directory)
[pid  1013] write(8, "REDMAIN_XAPIAN ERROR: Xapian dat"..., 88) = 88
[pid  1013] write(8, "DatabaseOpeningError: Couldn't s"..., 66) = 66

以 root 身份列出的文件:

775# ls -ahl /var/tmp/dmsf-index/english/
total 340K
drwxr-x--- 2 redmine nginx 4.0K Sep  5 13:04 .
drwxr-x--- 3 redmine nginx 4.0K Sep  5 13:04 ..
-rw-r----- 1 redmine nginx    0 Sep  5 14:00 flintlock
-rw-r----- 1 redmine nginx   28 Sep  5 13:04 iamchert
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 position.baseA
-rw-r----- 1 redmine nginx   16 Sep  5 13:04 position.baseB
-rw-r----- 1 redmine nginx  80K Sep  5 13:04 position.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 postlist.baseA
-rw-r----- 1 redmine nginx   17 Sep  5 13:04 postlist.baseB
-rw-r----- 1 redmine nginx 176K Sep  5 13:04 postlist.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 record.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 record.baseB
-rw-r----- 1 redmine nginx 8.0K Sep  5 13:04 record.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 termlist.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 termlist.baseB
-rw-r----- 1 redmine nginx  32K Sep  5 13:04 termlist.DB

并通过 sudo -i 以用户“redmine”和组“nginx”运行多个命令:

redmine@redmine:/var/tmp/dmsf-index/english$ pwd
/var/tmp/dmsf-index/english
redmine@redmine:/var/tmp/dmsf-index/english$ file .
.: directory
redmine@redmine:/var/tmp/dmsf-index/english$ ls
flintlock  iamchert  position.baseA  position.baseB  position.DB  postlist.baseA  postlist.baseB  postlist.DB  record.baseA  record.baseB  record.DB  termlist.baseA  termlist.baseB  termlist.DB
redmine@redmine:/var/tmp/dmsf-index/english$ file record.DB 
record.DB: data
redmine@redmine:/var/tmp/dmsf-index/english$ whoami
redmine
redmine@redmine:/var/tmp/dmsf-index/english$

据我所知,没有权限错误(通常用 EACCES 指示)。我读到 NFS 或 CIFS 可以在模糊的情况下返回 ENOENT,但这是安装在 / 的本地 ext4 分区

我什至尝试将 dmsf-index 的权限递归设置为 777,但出现相同的错误。

所以我的问题是,为什么 Passenger/Redmine 找不到该目录,而以同一用户身份运行的 shell 可以找到该目录?

答案1

事实证明,Kusalananda 在 chroot 方面走的是正确的道路。

本机上的 nginx systemd 单元文件设置PrivateTmp=true,根据文档执行以下操作:

采用布尔参数。如果为 true,则为执行的进程设置一个新的文件系统命名空间,并在其中安装私有 /tmp 和 /var/tmp 目录,该目录不被命名空间之外的进程共享。这对于安全地访问进程的临时文件很有用,但使得通过 /tmp 或 /var/tmp 的进程之间的共享变得不可能。

将此选项切换为 false 可修复该问题。

相关内容