问题描述:
在Linux系统中部署Tomcat项目,需要为项目中的 某个文件夹设置软链接,将资源文件夹映射到Tomcat目录外,建立连接以后,通过浏览器中直接访问不成功。
起因:
在做Web项目时,经常会在项目根目录(com.myApp)下创建资源目录,比如uploads,用来存放用户上传的图片、文件等等。这种常规的做法没有什么不妥,但是当项目需要频繁更新版本时,就会遇到一些麻烦:
自己在上传网站时一般是将项目文件夹起个别名(com.myApp-beta1.1)整体上传,传到服务器上之后,再将原来的com.myApp下的uploads文件夹复制到com.myApp-beta1.1目录下,然后再把两个文件夹的名称更换一下,重启Tomcat服务器完成升级。
这样做其实很不方便,只是项目前期图省事儿,复制一下资源文件也就几十秒钟,将就将就也就忍了。一旦资源文件过大,这样做就有明显的问题,升级时间明显变长,很不经济。所以有必要寻求一种更为有效的方式来替代这种原始的升级操作。
解决方案:
很自然的就能想到通过文件夹的【关联】、【映射】、或者叫【链接】来解决这个问题。
在硬盘上一个项目之外的位置建立一个同名的资源文件夹,比如/data/uploads,然后再com.myApp目录下新建一个文件夹链接到这个目录:
linux创建软连接(soft link)的命令:
ln -s /data/uploads/ /data/tomcat/webapps/myApp/
这样会在myApp目录下生成一个同名的软连接uploads,在命令行和可视化工具中都可以正常打开这个文件夹。看起来是个很完美的解决方案,以后可以彻底告别复制转移资源文件夹了,只需要上传完以后,执行以下上面的命令就ok了。
问题出现:
本来以为这样就可以了,没想到在测试的时候出现了问题:uploads目录下的静态图片,无法正常在浏览器地址栏里访问到。
勿用质疑,问题肯定出在Tomcat上,猜想Tomcat可能出于安全的考虑对文件、文件夹的连接进行了限制。google了一下,发现Tomcat的一个配置项:allowLinking,默认的配置应该是allowLinking=false,配置成true就可以解决这个问题了。
配置项配置在项目的Context元素上:
<Context path=”/” docBase=”/myApp” reloadable=”true” privilege=”true” allowLinking=”true”></Context>
扩展阅读:
Tomcat Document摘录:
If the value of this flag is
true
, symlinks will be allowed inside the web application, pointing to resources outside the web application base path. If not specified, the default value of the flag is
false
.
NOTE: This flag MUST NOT be set to true on the Windows platform (or any other OS which does not have a case sensitive filesystem), as it will disable case sensitivity checks, allowing JSP source code disclosure, among other security problems.
http://tomcat.apache.org/tomcat-6.0-doc/config/context.html