一尘不染

如何允许Tomcat War App写入文件夹

tomcat

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

但是文件系统不是只读的,并且状态良好。该文件夹已被更改为777。

额外信息:Tomcat安装程序在带有托管磁盘的Ubuntu 18.04 Azure VM上运行。该文件夹位于Ext4格式化的驱动器上


阅读 267

收藏
2020-06-16

共1个答案

一尘不染

让我们开始: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

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

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

  • Tomcat是作为root运行的吗?
  • 该目录是通过NFS挂载的吗?

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

如果这符合您所运行的条件,则应 停止以root身份运行Tomcat
,而应以非特权用户身份运行它。然后,您可以将有关目录的权限设置为可由您的tomcat用户写入,并由nginx读取,然后就可以完成。

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

如果这些条件不满足您的配置:详细说明配置。对于以后可能会发现此问题/答案的其他人,我仍然坚持此说明。

2020-06-16