如何允许Tomcat war应用程序写入文件夹

Ear*_*ind 7 tomcat nginx war azure ubuntu-18.04

我希望我的 web 应用程序部署为ROOT.war具有写入权限的战争,/var/www/html/static/images以便它可以将上传和转换的图像写入该文件夹,以便 nginx 可以静态地为其提供服务。目前它不起作用并java.nio.file.FileSystemExceptionFilesystem is read-only消息一起触发异常。

但是文件系统不是只读的,并且处于良好状态。该文件夹已被 chmodded 777。

额外信息:tomcat 设置在带有托管磁盘的 Ubuntu 18.04 Azure VM 上运行。该文件夹位于 Ext4 格式的驱动器上

Ola*_*ock 31

让我们开始:chmod 777非常适合测试,但绝对不适合现实世界,您不应该习惯此设置。而是在授予世界写入权限之前正确设置所有者/组。

编辑:一个类似的问题刚刚出现在 Tomcat 邮件列表中,Emmanuel Bourg 指出Debian Tomcat 是由 systemd 沙箱化的。阅读您的/usr/share/doc/tomcat9/README.Debian,其中包含这一段:

Tomcat 被 systemd 沙箱化,并且只有以下目录的写访问权限:

  • /var/lib/tomcat9/conf/Catalina(实际上是/etc/tomcat9/Catalina)
  • /var/lib/tomcat9/logs(实际上是/var/log/tomcat9)
  • /var/lib/tomcat9/webapps
  • /var/lib/tomcat9/work(实际上是/var/cache/tomcat9)

    如果需要对其他目录的写访问权限,则必须覆盖服务设置。这是通过在 /etc/systemd/system/tomcat9.service.d/ 中创建一个 override.conf 文件来完成的,其中包含:

[Service]

ReadWritePaths=/path/to/the/directory/

之后必须使用以下命令重新启动该服务:

  systemctl daemon-reload
  systemctl restart tomcat9
Run Code Online (Sandbox Code Playgroud)

编辑结束,继续没有解决 OP 问题的段落,但应该留在:

如果 - 所有事情都经过测试 - Tomcat应该具有对该目录的写访问权限,但没有它,则错误消息将我指向一个假设:难道是这样

  • Tomcat 以 root 身份运行?
  • 目录是通过NFS挂载的?

NFS 的默认配置是 root 在该外部文件系统上没有任何权限(或者它没有写权限?这是古老的历史记忆 - 查找“NFS root squash”以获取完整故事)

如果这是一个与您正在运行的条件相匹配的条件,您应该停止以 root 身份运行 Tomcat,而应以非特权用户身份运行它。然后,您可以将相关目录的权限设置为您的 tomcat-user 可写,nginx 可读,您就完成了。

以 root 身份运行 Tomcat 会导致灾难:您不希望 Internet 上可用的进程以 root 身份运行。

如果这些条件不符合您的配置:详细说明配置。对于稍后可能会找到此问题/答案的其他人,我仍然支持此描述。

  • 精彩的!不过这条信息确实很难找到。我一直在到处寻找解决方案,甚至没有意识到 Systemd 具有像 AppArmor 这样的 MAC 类型的功能(我已经将其禁用作为可能的解决方案)。 (2认同)