由于当前项目性质原因,从开始到现在使用的WEB服务器都是WAS,而Tomcat的基础知识也慢慢地被遗忘。由于种种原因,让我参与到了另外一个全新的项目,使用的是Tomcat6.X,所以复习是必须的,而写却却是复习的一种高效手段。
一、Tomcat的基本配置
/conf/是Tomcat的配置文件目录,该目录下的问题都是和WEB容器的配置相关,以下分别学习一下:
content.xml
Tomcat官网这这样解释这个文件的:
If Tomcat is unable to identify the appropriate resource factory and/or additional configuration information is required, additional Tomcat specific configuration must be specified before Tomcat can create the resource. Tomcat specific resource configuration is entered in the <Context> elements that can be specified in either $CATALINA_BASE/conf/server.xml or, preferably, the per-web-application context XML file (META-INF/context.xml).
结合我对英文的那么丁点的理解和网友的一些中文介绍,这就是一个JNDI的全局内容配置文件(例如数据量线程池等)。再说就是跟我们平时项目里面的/WEB-INFO/web.xml是类似的,官网还指出:
If a resource has been defined in a <Context> element it is not necessary for that resource to be defined in /WEB-INF/web.xml. However, it is recommended to keep the entry in /WEB-INF/web.xml to document the resource requirements for the web application.
如果项目的web.xml配置了相同的资源,则web.xml的配置会覆盖content.xml,除非content.xml的配置资源override属性为true。具体怎么配置就不多说了,如果需要用到,最好看Tomcat官网的配置介绍。
logging.properties
从名称就可以看出,这是Tomcat输出日志的配置文件,具体的格式说明同样可参考官方文档说明
tomcat-users.xml
顾名思义,这既是Tomcat管理平台的用户配置文件,想进入Tomcat控制台操作必须得在这里配置用户和相关角色。例如:
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="tomcat"/> <role rolename="manager"/> <role rolename="admin"/> <user username="tomcat" password="tomcat" roles="tomcat,manager,admin"/> </tomcat-users>
web.xml
如果不熟悉Tomcat配置的人,在这里看到web.xml配置文件的,多少有点惊讶,毕竟我们平时接触较多的还是项目中/WEB-INFO/下的web.xml配置文件。但别忘了,我们启动Tomcat后不也是能打开控制台页面吗,没错,其实这是整个Tomcat工程的WEB配置文件。打开这个web.xml可以看到许多的servlet配置,这些都是Tomcat工程的配置,还有许多MIME(Multipurpose Internet Mail Extensions)的配置,最熟悉莫过于会话的配置:
<session-config> <session-timeout>30</session-timeout> </session-config>
为什么我们发布的工程会话都是默认30分钟超时,就是这里配置的原因,所以说,这个/conf/web.xml的配置参数对整个Tomcat的所有项目都有效,也就是全局共享的。conf/web.xml文件中的设定会应用于所有的web应用程序,而某些web应用程序的WEB-INF/web.xml中的设定只应用于该应用程序本身。
server.xml
这是Tomcat算是最基本的配置文件,WEB容器的基本配置都在这里,包括端口、虚拟机、线程池等配置信息。关于这个server.xml的配置说明,网上众说纷纭的,大家都是站在各自理解的角度去写并且没有版本说明。对于配置的准确说明,还是建议看Tomcat官网的官方解释和例子去理解。
catalina.policy
理解这个文件前可能需要先理解一下java.policy的原理,java.policy主要是配置Java的一些代码调用权限,例如防止第三方jar包对JVM的破坏等,好比System.exit()这个方法是用来结束当前正在运行中的java虚拟机。如果每个人都有权限,那么谁都可以执行,一个不小心给某个人用错了,那得多蛋疼。没错,这可以通过设置java.policy来配置相关权限。当然在现实真正考虑去使用到这一特性的项目,我相信不多。而Tomcat中的安全管理原理基本与前面JDK中的security类似,只是启动时需要在start后面添加-security参数,tomcat会自动读取 conf/catalina.policy 文件中的权限配置。附上一句Tomcat官网的一句原话:
The security policies implemented by the Java SecurityManager are configured in the $CATALINA_BASE/conf/catalina.policy file. This file completely replaces the java.policy file present in your JDK system directories. The catalina.policy file can be edited by hand, or you can use the policytool application that comes with Java 1.2 or later.
需要的话可以参考一下这个博客园友的认真介绍和学习java.policy的相关知识。
catalina.properties
Tomcat官网介绍:
Configuring Package Protection in Tomcat
Starting with Tomcat 5, it is now possible to configure which Tomcat internal package are protected againts package definition and access. See http://java.sun.com/security/seccodeguide.html for more information.
WARNING: Be aware that removing the default package protection could possibly open a security hole
从介绍可以看出这是一个在Tomcat容器里对包权限管理的配置文件,主要包含三部分:
#第一部分:安全设置
package.access
package.definition
#第二部分:类加载设置
common.loader
server.loader
shared.loader
#第三部分:字符缓存设置
tomcat.util.buf.StringCache.byte.enabled
tomcat.util.buf.StringCache.char.enabled
tomcat.util.buf.StringCache.trainThreshold
tomcat.util.buf.StringCache.cacheSize
二、Tomcat的安全配置
如果Tomcat是通过其它反向代理服务转发的话,公网网络隔离也是必须的安全防护手段,当然,没有人觉得安全是足够的,除了网络的安全限制,Tomcat自身的配置也会关系到Tomcat的使用安全。我主要还是通过网友们的经验总结出以下几种安全事项:
1、修改shutdown命令字符
在server.xml的server节点有一个shutdown属性,来看一下官网对这个属性的解释:
The command string that must be received via a TCP/IP connection to the specified port number, in order to shut down Tomcat.
也就是说,通过TPC/IP连接后发送这个shutdown属性配置的字符串命令就可以关闭Tomcat,但有一点要注意,这个连接必须是本地的,但也不排除主机被操控。所以还是建议修改这个端口和关闭命令,也不好让别人容易猜到。这个修改不影响shutdown.sh的执行,运行shutdown.sh一样可以关闭服务器。
2、增加防火墙
这就是在本地服务器增加防火墙策略,只允许应用访问的端口进来,其它一概拒绝,也可以确保Tomcat的安全性,这需要因人而已,但也是一个手段。
3、Tomcat管理台的安全
Tomcat管理台的文件主要存放在/webapp/下,如果不需要可以全部删除,又或者通过tomcat-user.xml增加角色和密码。
4、运行错误网页
如果找不到网页即出现404错误,会显示服务器版本号,服务器配置也一目了然,
为了避免这种情况,希望自定义设置错误页面。
修改/conf/web.xml文件,在文件的倒数第二行(一行之前)加入<error-page>的配置内容,跟在工程的/WEB-INFO/web.xml下配置的规则一样,然后在/webapp/ROOT/下加入自定义的错误页面。
5、屏蔽目录文件自动列出的方法
修改/ conf/web.xml文件:
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
其中把<param-value>false</param-value>就是代表已经机制目录文件列表显示。但在我的Tomcat6.X版本设置为true也显示不出来,可能跟版本有关。
6、以非root用户运行
这并非只有Tomcat,其它程序都应该尽量用非root运行。
7、关闭8009端口
8009端口是tomcat和apache的mod_proxy_ajp,mod_jk沟通的端口,没有用到就关了。
8、Tomcat记录客户端的访问日志
日志是重要的数据参考,有必要可以考虑开启Tomcat访问日志,代价是会消耗一定的性能。配置方法是在加上/conf/server.xml配置文件上添加Valve节点,具体配置可以查看Tomcat官方文档。
9、关闭应用自动部署
在/conf/server.xml配置文件的host节点里关闭war自动部署,防止被植入木马等恶意程序。
<Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false" xmlValidation="false" xmlNamespaceAware="false">
三、Tomcat的监控配置
监控一个系统不可或缺的部分,Tomcat的管理平台是有监控功能的,具体路径是:
IP:PORT/manager/status
但这并不能满足远程脚本监控的需要,此外,Tomcat还支撑通过JMX进行监控,具体配置如下(Tomcat6.x Linux):
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Djava.rmi.server.hostname=192.168.88.128 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access"
这句配置语句是在# ----- Execute The Requested Command -----------------------------------------上面
Java监控例子:
String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi"; JMXServiceURL serviceURL = new JMXServiceURL(jmxURL); Map map = new HashMap(); // 用户名密码,在jmxremote.password文件中查看 String[] credentials = new String[] { "monitorRole", "tomcat" }; map.put("jmx.remote.credentials", credentials); JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map); MBeanServerConnection mbsc = connector.getMBeanServerConnection(); // 端口最好是动态取得 ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080"); MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName); // tomcat的线程数对应的属性值 String attrName = "currentThreadCount"; MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes(); System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName));
注意:我配置调试过程中遇到了无法访问127.0.0.1地址,原因跟服务器的hostname对应的IP配置(/etc/hosts)有关,如果真遇到了可以网上搜索一下。
详细介绍请看Tomcat官网
四、Tomcat的性能优化
1、操作系统调优
如果是并发量大的应用,需要设置操作系统的最大文件打开数:
/etc/sysctl.conf
/etc/security/limits.conf
2、Java虚拟机调优
具体JVM参数说明不再详细介绍,网上确实很多,平时我主要调整的还是-Xmx和-Xms。其他使用默认就好。当然,具体问题具体分析。Tomcat的Jvm参数是在(Linux)/bin/ catalina.sh配置文件调整的。
3、禁用DNS查询
在/conf/server.xml配置文件有许多DNS查询的配置,尽量禁用,毕竟这些性能不能浪费。
4、线程池调整
Tomcat容器的线程池配置也是在/conf/server.xml里面配置的,具体的配置参数可以参考官网说明进行适当的调整。
5、HTTP协议的调整
Tomcat6.X支持的三种Connector的运行模式分别是
BIO
bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。
NIO
nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。
APR
apr(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。
通过以上介绍的得知各种模式的介绍,例如应用是SOA型应用,我想APR的作用不会很大,毕竟不是静态文件服务器,还是建议了解清楚大概原理再具体问题具体分析使用。
6、压错传输
可以通过对/conf/server.xml的Connector进行配置,属性为有:
compression="on" //是否启用压缩 on为启用(文本数据压缩) off为不启用, force 压缩所有数据
compressionMinSize1="2048" //当超过最小数据大小才进行压缩
noCompressionUserAgents="gozilla, traviata" //哪些客户端发出的请求不压缩,默认是不限制
compressableMimeType=“text/html,text/xml,text/javascript,text/css,text/plain,,application/octet-stream” //配置想压缩的数据类型
总结
对于以上提的四大点也算是Tomcat的一个基础入门使用了解,可能还有所遗漏,后续补充。还是那句话,具体问题需要具体分析,毕竟工具在手上,如何用好也确实是一门技巧。