背景:我正在运行一个 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 可修复该问题。