我希望将我的Webapp部署为具有战争ROOT.war权限,/var/www/html/static/images以便对其具有写权限,以便它可以将上载和转换后的图像写入该文件夹,以便nginx可以静态为其提供服务。当前,它不起作用,触发器java.nio.file.FileSystemException和Filesystem is read-only消息一起触发异常。
ROOT.war
/var/www/html/static/images
java.nio.file.FileSystemException
Filesystem is read-only
但是文件系统不是只读的,并且状态良好。该文件夹已被更改为777。
额外信息:Tomcat安装程序在带有托管磁盘的Ubuntu 18.04 Azure VM上运行。该文件夹位于Ext4格式化的驱动器上
让我们开始:chmod 777适用于测试,但是绝对不适合现实世界,您不应该习惯这种设置。在授予世界写权限之前,应正确设置所有者/组。
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
Tomcat由systemd沙盒化,并且仅具有对以下目录的写访问权:
如果需要对其他目录的写访问权限,则必须覆盖服务设置。这是通过在/etc/systemd/system/tomcat9.service.d/中创建一个override.conf文件来完成的,该文件包含:
[Service] ReadWritePaths=/path/to/the/directory/
[Service]
ReadWritePaths=/path/to/the/directory/
此后必须重新启动该服务:
systemctl daemon-reload systemctl restart tomcat9
编辑结束,继续未解决OP问题的段落,但应保留在:
如果-所有事情都经过测试-Tomcat 应该 具有对该目录的写访问权,但没有该访问权,则错误消息将我指向一个假定:可能是
NFS的默认配置是root在该外部文件系统上没有任何权限(或者是否没有写权限?这是古老的历史内存-查找“ NFS root squash”以获取完整的故事)
如果这符合您所运行的条件,则应 停止以root身份运行Tomcat ,而应以非特权用户身份运行它。然后,您可以将有关目录的权限设置为可由您的tomcat用户写入,并由nginx读取,然后就可以完成。
以root身份运行Tomcat会带来灾难:您不希望Internet上可用的进程以root身份运行。
如果这些条件不满足您的配置:详细说明配置。对于以后可能会发现此问题/答案的其他人,我仍然坚持此说明。