yeskery

Tomcat 上传图片后没有访问权限

403 Forbidden

之前在 Tomcat 7 下文件上传后访问一直没问题,现在 Tomcat 版本升到 8.5,在测试文件 http 上传时,发现所传文件无法通过 Nginx 访问了。(Tomcat 具体版本为 8.5.11)。

Nginx 返回 403 Forbidden

PS:tomcat 通过 root 用户来启动。

Tomcat UMASK

在确定了 nginx 自身的没有配置问题之后,上 linux 服务器查看所传文件,发现其上传目录下代码自动创建的目录权限是 750,所上传文件权限是 640。也就是说默认赋予的文件权限中其他用户的权限始终为 0 所导致。

默认权限与 umask 有关,因此怀疑是系统默认导致,但在查看系统默认配置(/etc/profile)后,发现默认配置没问题。

  1. if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`"]; then
  2. umask 002
  3. else
  4. umask 022
  5. fi

umask 002 对应文件权限 664,文件夹权限775umask 022 对应文件权限 644,文件夹权限 755。可见都有读取访问权限的。在默认情况下,tomcat 所建目录及文件应该用到的是 umask 022,但为何实际情况并非如此呢?

(按照结果看 tomcat 8.5 下上传文件的默认权限为 umask 027

到这里,排除下来可能的原因并不多了,因为之前在其他机器上使用 tomcat 7 的时候是上传后访问没问题的,所以又拿 tomcat 7 在这台服务器上测试了一下,以判断是不是 tomcat 8.5 自身的问题。结果发现,在同台服务器上 tomcat 7 上传后访问没问题。最终定位为题是在 tomcat 8.5 上。

接下来,抱着试一试的心态,在 tomcat 8.5 的 catalina.sh 中搜索 umask 关键字(因为我始终有个直觉这和默认权限设置有关,结果证实这次的判断是准确的),很庆幸,原因立马就定位到了。

  1. # Set UMASK unless it has been overridden
  2. if [ -z "$UMASK" ]; then
  3. UMASK="0027"
  4. fi
  5. umask $UMASK

UMASK="0027"出现了!在按照目前的功能需求,将其改为 UMASK="0022" 并重启 tomcat 8.5 后,文件上传后访问恢复正常。

至此,问题解决。期间,不是没想过通过百度或 google 解决问题,但是因为 tomcat 8.5 版本比较新,相关问题的中文文档就没有搜到。英文文档也是在定位了 tomcat 8.5 问题后搜索关键词 tomcat8.5 umask 后在 tomcat 官网文档及相关英文论坛里发现了踪迹。

tomcat_8_5-0_changelog

tomcat_8_5-0_security_howto

本文转载自:https://blog.csdn.net/whatareyouding/article/details/78834855

评论

发表评论 点击刷新验证码

提示

该功能暂未开放