一、 问题描述
背景描述:
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