如何允许 Tomcat war 应用写入文件夹
How to allow Tomcat war app to write in folder
我希望部署为 war ROOT.war
的 Web 应用程序具有对 /var/www/html/static/images
的写入权限,以便它可以将上传和转换后的图像写入该文件夹,因此nginx 可以静态地提供服务。目前它不起作用并触发 java.nio.file.FileSystemException
异常以及 Filesystem is read-only
消息。
但文件系统不是只读的,而且状况良好。该文件夹已经被修改 777.
额外信息:
tomcat 设置是 运行 在具有托管磁盘的 Ubuntu 18.04 Azure VM 上。该文件夹位于 Ext4 格式的驱动器上
让我们开始:chmod 777
非常适合测试,但绝对不适合现实世界,您不应该习惯这种设置。而是在授予世界写入权限之前正确设置 owner/group。
编辑:Tomcat 邮件列表中刚刚出现了一个类似的问题,Emmanuel Bourg 指出 Debian Tomcat 被 systemd 沙盒化了。阅读你的 /usr/share/doc/tomcat9/README.Debian,其中包含这一段:
Tomcat is sandboxed by systemd and only has write access to the
following directories:
- /var/lib/tomcat9/conf/Catalina (actually /etc/tomcat9/Catalina)
- /var/lib/tomcat9/logs (actually /var/log/tomcat9)
- /var/lib/tomcat9/webapps
- /var/lib/tomcat9/work (actually /var/cache/tomcat9)
If write access to other directories is required the service settings
have to be overridden. This is done by creating an override.conf file
in /etc/systemd/system/tomcat9.service.d/ containing:
[Service]
ReadWritePaths=/path/to/the/directory/
之后必须重新启动服务:
systemctl daemon-reload
systemctl restart tomcat9
编辑 2022:请注意,这些是 2019 年的路径 - 每当您 运行 跨越此答案时,请验证是否需要将它们调整为 tomcat 的当前位置(例如,参见 Ng Sek Long 的评论 Ubuntu 20)
编辑结束,继续未解决 OP 问题的段落,但应保留在:
如果 - 所有测试 - Tomcat 应该 具有对该目录的写入权限,但没有它,错误消息指向我的假设:难道是
- Tomcat 是 运行ning 作为 root?
- 目录是通过NFS挂载的吗?
NFS 的默认配置是 root 对该外部文件系统没有任何权限(或者它没有 write-permission?这是古老的历史记忆 - 查找“NFS root squash”以获得完整的故事)
如果这个条件与您 运行ning 相匹配,您应该 停止 运行ning Tomcat 作为 root,并且而是 运行 作为非特权用户。然后,您可以将相关目录的权限设置为您的 tomcat-user 可写,nginx 可读,您就完成了。
运行 Tomcat 作为 root 是灾难的根源:你不想要一个从 Internet 上可用的进程作为 root 运行。
如果这些条件不符合您的配置:详细说明配置。对于以后可能会发现这个 question/answer 的其他人,我仍然支持这个描述。
我希望部署为 war ROOT.war
的 Web 应用程序具有对 /var/www/html/static/images
的写入权限,以便它可以将上传和转换后的图像写入该文件夹,因此nginx 可以静态地提供服务。目前它不起作用并触发 java.nio.file.FileSystemException
异常以及 Filesystem is read-only
消息。
但文件系统不是只读的,而且状况良好。该文件夹已经被修改 777.
额外信息: tomcat 设置是 运行 在具有托管磁盘的 Ubuntu 18.04 Azure VM 上。该文件夹位于 Ext4 格式的驱动器上
让我们开始:chmod 777
非常适合测试,但绝对不适合现实世界,您不应该习惯这种设置。而是在授予世界写入权限之前正确设置 owner/group。
编辑:Tomcat 邮件列表中刚刚出现了一个类似的问题,Emmanuel Bourg 指出 Debian Tomcat 被 systemd 沙盒化了。阅读你的 /usr/share/doc/tomcat9/README.Debian,其中包含这一段:
Tomcat is sandboxed by systemd and only has write access to the following directories:
- /var/lib/tomcat9/conf/Catalina (actually /etc/tomcat9/Catalina)
- /var/lib/tomcat9/logs (actually /var/log/tomcat9)
- /var/lib/tomcat9/webapps
- /var/lib/tomcat9/work (actually /var/cache/tomcat9)
If write access to other directories is required the service settings have to be overridden. This is done by creating an override.conf file in /etc/systemd/system/tomcat9.service.d/ containing:
[Service]
ReadWritePaths=/path/to/the/directory/
之后必须重新启动服务:
systemctl daemon-reload systemctl restart tomcat9
编辑 2022:请注意,这些是 2019 年的路径 - 每当您 运行 跨越此答案时,请验证是否需要将它们调整为 tomcat 的当前位置(例如,参见 Ng Sek Long 的评论 Ubuntu 20)
编辑结束,继续未解决 OP 问题的段落,但应保留在:
如果 - 所有测试 - Tomcat 应该 具有对该目录的写入权限,但没有它,错误消息指向我的假设:难道是
- Tomcat 是 运行ning 作为 root?
- 目录是通过NFS挂载的吗?
NFS 的默认配置是 root 对该外部文件系统没有任何权限(或者它没有 write-permission?这是古老的历史记忆 - 查找“NFS root squash”以获得完整的故事)
如果这个条件与您 运行ning 相匹配,您应该 停止 运行ning Tomcat 作为 root,并且而是 运行 作为非特权用户。然后,您可以将相关目录的权限设置为您的 tomcat-user 可写,nginx 可读,您就完成了。
运行 Tomcat 作为 root 是灾难的根源:你不想要一个从 Internet 上可用的进程作为 root 运行。
如果这些条件不符合您的配置:详细说明配置。对于以后可能会发现这个 question/answer 的其他人,我仍然支持这个描述。