tomcat启动后,发现网页无法打开,查看tomcat进程发现进程在,又查看tomcat启动日志显示正常启动,各种可能情况排查一遍后,发现tomcat-users.xml文件大小为零-----tomcat启动后tomcat-users.xml内容丢失了。把tomcat-users.xml重新拷贝过来,重启tomcat,问题解决了。但是tomcat-users.xml为什么会内容丢失那?
这个问题很久之前就出现过,之前感觉就是tomcat 的bug,偶尔遇到并不是常态,所以也没太关注,但最近一周连续出现了两次,领导开催了必须得有个解决办法,看来是得深入研究下啦!
网络上搜索了一下相关内容,发现这篇博客http://blog.csdn.net/spy2000/article/details/3891059 说的也是内容丢失的问题,他的结论是:将Tomcat6解压缩后,要将tomcat-users.xml文件<tomcat-users>标签内容里的注释符号删除,否则一旦运行,该标签内被注释的内容将被清空。这篇博客讲的是常态问题,丢失的内容只是<tomcat-users>标签里面的内容,而不是整个tomcat-users.xml里面的内容,作者没有深入研究为什么标签内有注释标签中内容就会丢失。
搜索了小半天发现网络上没有我这个情况,没办法只能先自已思考一下了。
先来个测试,在tomcat-users.xml里面加入一些空行,重启tomcat后发现tomcat-users.xml文件里面的空行没了,说明tomcat重启时重写了tomcat-users.xml文件,于是想了一个办法,把tomcat-users.xml文件的权限改成只读文件不就行了,于是chmod 444 (linux下)权限设成-r--r--r--,满怀希望的重启tomcat,结果发现我想多了,tomcat-users.xml文件权限又恢复成了-rw-r--r--,tomcat-users.xml文件还是被重写了。
看来得搞清楚tomcat加载tomcat-users.xml文件逻辑才行,搜索了一下发现是这样的:
tomcat启动的时候:
1、首先读取conf/tomcat-users.xml
2、然后将tomcat-users.xml文件中的内容写到一个新的文件tomcat-users.xml.new 中
3、最后将tomcat-users.xml.new 文件重命名为tomcat-users.xml
看来我这里遇到的问题应该是tomcat在写tomcat-users.xml.new里出错,内容没有写入,这个是非常态问题,偶尔遇到一次也是没有办法的(那个仁兄如果知道问题所在烦请告知一下,不胜感激!)
当然这样是没法跟领导交差的!
只能去想想tomcat加载tomcat-users.xml为什么要这么做?可不可以不这么做?带着这个问题无奈之下查看了tomcat的官方文档,终于查到了端倪所在:
http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html#UserDatabase_Resources
在讲解UserDatabase Resources一节中讲到:
modify $CATALINA_BASE/conf/server.xml to create the UserDatabase resource based on your XMl file. It should look something like this:
<Resource name="UserDatabase"
auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml"
readonly="false" />
The pathname attribute can be absolute or relative. If relative, it is relative to $CATALINA_BASE.
The readonly attribute is optional and defaults to false if not supplied. If the XML is writeable then it will be written to when Tomcat starts. WARNING: When the file is written it will inherit the default file permissions for the user Tomcat is running as. Ensure that these are appropriate to maintain the security of your installation.
tomcat-users.xml这个文件默认是非只读的,这种情况下这个文件在tomcat启动时会被重写,这种设置只要是在安全方面考虑的。如果不想tomcat这样做可以设置readonly为true。
赶紧测试一下,发现readonly为true后,tomcat果然不重写tomcat-users.xml文件,不重写当然也不会出意外造成内容丢失啦!问题解决!
具体修改位置,在conf/server.xml文件中找到GlobalNamingResources容器配置,在Resource中加入readonly="true",如下:
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" readonly="true"/>
</GlobalNamingResources>