一、 问题描述

背景描述:

0.saas-business-运营后台,website-网站页面。

1.javaweb程序(saas-business)部署在linux系统 tomcat服务器下,使用该程序里面上传图片功能,上传图片至linux服务器挂载盘(共享盘)中/nfs/uploads/目录下。tomcat是以root用户来运行的。

2.website,部署在另一台linux系统ngxin容器中,该台linux系统也挂载了(共享盘)/nfs/uploads/目录。ngixn是以其他组的角色来运行的。

操作:

我通过saas-business里面的上传图片功能 ,上传图片到/nfs/uploads/下,查看服务器,确实已经上传成功。

然后在浏览器中访问website程序,却访问不到刚刚上传的图片。

问题:图片成功上传到linux服务器共享盘中,但却在网页中访问不到!

二、 表面原因

在linux 中挂在盘目录下,查看刚刚上传的图片:确实已经上传成功。

[root@tmp4 backgroundImg]# ll

总用量 408

-rw-r----- 1 root root 414642 7月 11 17:27 login_background.jpg

可以看到 login_background.jpg图片,对于当前 拥有者 、群组 、其它组 分别是:读写、读、无。显而易见,website是nginx容器以其他组的一个用户来运行的,所有没有任何权限。

找到表面原因,我们可以直接修改图片的权限。

[root@tmp4 backgroundImg]# chmod 644 login_background.jpg

[root@tmp4 backgroundImg]# ll

总用量 408

-rw-r--r-- 1 root root 414642 7月 11 17:27 login_background.jpg

此时,通过网站访问 该图片便没有问题。

三、 根本原因

因为tomcat版本的差别。我当前使用的是tomcat8.5.+,当我将为tomcat8.0.24版本便没有此问题。

下面,做的配置,是以tomcat8.5.+版本 为例的。

a)、检查linux

linux文件访问默认权限与umask有关,查看系统默认配置(/etc/profile)是否正常,如果是002或022就正常没有问题。

[umask 002 对应文件权限664,文件夹权限775;

umask 022对应文件权限644,文件夹权限755]

b)、检查tomcat

打开bin/catalina.sh文件,检查大概在263行左右。

将0027改改为0022,重启tomcat,上传访问的问题解决。

清单一、原代码

# Set UMASK unless it has been overridden
if [ -z "$UMASK" ]; then
UMASK="0027"
fi

清单二、修改为

# Set UMASK unless it has been overridden
if [ -z "$UMASK" ]; then
UMASK="0022"
fi

c)、重启tomcat

sh shutdown.sh(关闭)

sh startup.sh 或者 ./startup.sh(启动)

四、总结:

Javaweb上传文件到Linux 没有读写权限,最后总结有以下3种解决方案。

1.将程序在容器中以root用户运行。这时候运行权限最高。(如,我可以将website,由其他用户组的nginx角色,改为所有者root权限,便没有此问题)。

2.降低我的tomcat版本。(这个也是可行的)

3.修改tomcat中的bin/catalina.sh配置,并重启tomcat(这个我觉得是最根本的,推荐使用)

彩蛋:查看程序启动用户,ps -ef | grep tomcat