由于当前项目性质原因,从开始到现在使用的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的一个基础入门使用了解,可能还有所遗漏,后续补充。还是那句话,具体问题需要具体分析,毕竟工具在手上,如何用好也确实是一门技巧。

【WEB】Tomcat基础使用知识的更多相关文章

  1. Java Web开发基础零星知识

    1. Web的三个核心标准 万维网的核心标准有三个,分别是URL.HTTP和HTML. URL(统一资源定位符,Universal Resource Locator),为描述Internet上的网页以 ...

  2. linux web服务基础知识,dns

    #web服务基础知识c/s 客户端/服务器b/s 浏览器/服务器 nginx   >   web  server  服务端浏览器  >    web  client  客户端 #dns解析 ...

  3. web前端基础知识及快速入门指南

    web前端基础知识及快速入门指南 做前端开发有几个月了,虽然说是几个月,但是中间断断续续的上课.考试以及其它杂七杂八的事情,到现在居然一直感觉自己虽然很多前端的知识很眼熟,却也感觉自己貌似也知识在门口 ...

  4. web service基础知识

    Web服务基础 用户访问网站的基本流程 我们每天都会用web客户端上网,浏览器就是一个web客户端,例如谷歌浏览器,以及火狐浏览器等. 当我们输入www.oldboyedu.com/时候,很快就能看到 ...

  5. Web安全之Web 安全介绍与基础入门知识

    web安全介绍与基础入门知识 安全与安全圈 甲方与乙方 甲方:如腾讯,阿里等需要安全服务的公司 乙方:提供安全服务产品的服务型安全公司 web与二进制 web,研究web安全 二进制,研究如客户端安全 ...

  6. web服务器专题:tomcat基础及模块

    Web服务器专题:Tomcat(一)基础架构 针对java系的经典服务器,打算系统的整理一下Tomcat的机制和一些原理,以此记录. 插一则题外话,关于tomat这个名字的由来:Tomcat 名称的由 ...

  7. 20155305《网络对抗》Web安全基础实践

    20155305<网络对抗>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL ...

  8. Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”

    Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...

  9. Tomcat基本入门知识及发布,虚拟访问及启动碰到的错误,虚拟目录,虚拟路径,各种Tomcat的配置

    Tomcat容器入门介绍 转自javaresearch.com由timgball 整理 Tomcat是一个免费的开源Web服务器,最新版本是5.5.1,支持Servlet2.4,JSP2.0,非常适合 ...

随机推荐

  1. [linux] 结构化命令-for

    1 for命令 # for:迭代循环:默认空格为分隔符 for var in list do commands done 1.1 读取列表中的值 #!usr/bin/bash for test in ...

  2. SQL触发器实例讲解

    SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Inser ...

  3. javascript父级鼠标移入移出事件中的子集影响父级的处理方法

    一.我们先分析其产生的原因: 1.当鼠标从父级移入子集时触发了父级的两个事件:a.父级的mouseout事件(父级离开到子集):b.由于事件冒泡影响,又触发了父级的mouseover事件(父级移入父级 ...

  4. less 里面 opacity的写法

    今天写了个opacity, 竟然less编译不过,上网搜了一个写法 .opacity (@opacity) { @opacityPercentage: @opacity * 100; opacity: ...

  5. NPOI导出Excel(含有超过65335的处理情况)

    NPOI导出Excel的网上有很多,正好自己遇到就学习并总结了一下: 首先说明几点: 1.Excel2003及一下:后缀xls,单个sheet最大行数为65335 Excel2007 单个sheet ...

  6. C语言小练习一

    题目要求:国王将金币作为工资,发放给忠诚的骑士.第1天,骑士收到一枚金币:之后两天(第2天和第3天)里,每天收到两枚金币:之后三天(第4.5.6天)里,每天收到三枚金币:之后四天(第7.8.9.10天 ...

  7. C++内存分配及变长数组的动态分配

    //------------------------------------------------------------------------------------------------ 第 ...

  8. 记录Python学习中的几个小问题

    记录Python学习中的几个小问题,和C#\JAVA的习惯都不太一样. 1.Django模板中比较两个值是否相等 错误的做法 <option value="{{group.id}}&q ...

  9. 在 Mac OS 上创建并运行 ASP.NET Core 1.0 网站

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  10. JS与Jquery学习笔记(一)

    一. Javascript的作用域,大坑! 1. JS作用域奇怪表现之一:预编译 在其他的语言里我们如果使用一个变量在声明其之前,是会报错的,但是在js里面却不一定,比如: function f1() ...