Webapp 无法使用 Ubuntu 20.04 和 Tomcat 9 写入 /tmp 目录

Webapp can't write to /tmp directory with Ubuntu 20.04 and Tomcat 9

我正在将 Tomcat 网络应用程序从 Ubuntu 和 Tomcat 7 的旧版本迁移到 Ubuntu 20.04 和 Tomcat 9。应用程序将各种文件写入 /tmp 目录,但在切换到 Ubuntu 20.04 和 Tomcat 9 后写入 /tmp 目录静默失败。我在 Tomcat 日志中没有看到任何表明文件未被写入的原因,我的应用程序也没有抛出异常(如果应用程序无法写入,我希望得到 IO 异常或其他东西目录)。

我做了一些试验,我能够将文件写入 /var/lib/tomcat/logs。是否有我需要在 Tomcat 或 Ubuntu 中更改的配置参数以允许 Tomcat 写入 /tmp?

在最近的 Debianoids(从 Debian Buster 开始)上,tomcat9.service 在它自己的 mnt 命名空间 中运行(参见 Linux namespaces)。与 "real" 文件系统不同的唯一挂载点是 /tmp,它位于:

/tmp/systemd-private-*-tomcat9.service-*/tmp

普通用户无法访问它(它的父级是 chmod 700 并且归 root 所有)。

如果您希望 Tomcat 与系统的其余部分共享 /tmp 目录,您可以通过以下方式覆盖 tomcat9.service 文件:

systemctl edit tomcat9.service

并添加:

[Service]
PrivateTmp=no

(比照SystemD documentation)。

编辑: 正如您在评论中所说,tomcat9.service 已设置 ProtectSystem=strict,因此该服务将所有文件系统视为只读。因此你要么需要:

ProtectSystem=off

ReadWritePaths=/tmp

我可以通过编辑 /usr/lib/systemd/system/apache2.service

下的文件来解决这个问题

并从

编辑
PrivateTmp=True

PrivateTmp=no