tomcat简介
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前最新的版本为8.0。
与传统桌面应用程序不同,Tomcat中的应用程序是一个WAR(Web Archive)文件,它是由许多文件构成的一个压缩包。包中的文件按照一定的目录结构来组织,tomcat会自动检测和解压该文件。JSP文件第一次执行时,要先由Tomcat将其转化为Servlet文件,然后编译,所以速度慢一些,但后续的执行速度会更快。
Tomcat不是一个完整意义上的Jave EE服务器,它甚至都没有提供对哪怕是一个主要Java EE API的实现;但由于遵守apache开源协议,tomcat却又为众多的java应用程序服务器嵌入自己的产品中构建商业的java应用程序服务器,如JBoss和JOnAS。尽管Tomcat对Jave EE API的实现并不完整,然而很企业也在渐渐抛弃使用传统的Java EE技术(如EJB)转而采用一些开源组件来构建复杂的应用。这些开源组件如Structs、Spring和Hibernate,而Tomcat能够对这些组件实现完美的支持。
tomcat的特性
1、免费开源的轻量级的web服务器
2、tomcat部分是Apache的扩展,它与Apache结合工作时,作为Apache的进程独立运行
3、tomcat是一个servlet和JSP的web容器,默认模式是servlet容器
4、tomcat运行JSP页面和servlet,因此,它对静态页面的处理能力不如Apache,但是它处理动态页面能力比较强
5、适用于中小型系统和并发不是很多的场景
常见的web容器
商业版:
◇ Sun GlassFish Enterprise Server
◇ Sun Java System Web Server
◇ JBoss Enterprise Application Platform
◇ WebLogic Application Server
◇ Caucho's Resin Server
◇ WebSphere Application Server
◇ NetWeaver
非商业版:
◇ Apache Tomcat
◇ Apache Geronimo
◇ GlassFish
◇ JBoss Application Server
◇ Jetty
◇ Tiny Java Web Server
◇ Eclipse Virgo
tomcat架构组件
tomcat服务器时由一系列可配置的组件构造。其中核心组件式catalina servlet容器,它是其他所有tomcat组件的顶层容器。其中tomcat各组件的层次关系如下图所示:
server层:对应着server组件。逻辑上表示整个tomcat,一个tomcat实例,即整个catalina servlet容器。它处在tomcat顶层。每个JVM中只有一个tomcat实例。一个server层可以包含一个或多个service层。
service层:对应着service组件。一个service层包含一个Engine层以及一个或多个连接器(connector)。service组件将一个或多个连接器绑定在Engin层。connector组件监听端口,接受用户的请求,并把请求转交给Engin层处理,同时把处理后的结果返回给客户端。
连接器(connector):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。
Engin层:引擎是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回给相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
host层(主机层):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个host可以包含一个或多个context层。
context层(上下文):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。
tomcat中的其他嵌套类组件
阀门(Valve):用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件(Engin、host、context)中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息至文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
领域(Realm):用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。
tomcat的安装与配置
1、安装JDK
在安装tomcat之前,必须先安装JDK(Java Development Kit),这是sun公司免费提供的Java语言的软件开发工具包。其中包括了java虚拟机和一些库类。编写好的java源程序,编译后可形成字节码,只要安装了JDK,就可以利用JVM对这些字节码进行解释执行。
jdk下载网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
由于我这里下载的rpm包,所有我就直接使用rpm的形式安装:
# rpm -ivh jdk-8u45-linux-i586.rpm
安装完成后,可以使用如下命令查看该软件包生成的文件,由于生产的文件很多,建议使用more或less来查看,如:
# rpm -ql jdk1.8.0_45-1.8.0_45-fcs.i586 | less
使用该命令查看后可以知道jdk的家目录为/usr/java/jdk1.8.0_45
由于我直接使用rpm来安装的,因此在这里不需要设置环境变量。可以直接使用二进制程序,如查看jdk是否安装成功:
# java �Cversion
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) Client VM (build 25.45-b02, mixed mode, sharing)
出现如下信息则表示jdk安装成功。
2、安装tomcat
下载tomcat可以到tomcat的官网上去下载,根据自己的平台和版本选择相应的软件版本。tomcat的官网地址为:http://tomcat.apache.org/。在这里我使用的tomcat为tomcat7.0的版本。
# tar xf apache-tomcat-7.0.62.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv apache-tomcat-7.0.62 tomcat7
tomcat的启动和关闭
tomcat的二进制脚本文件为/usr/local/tomcat7/bin/catalina.sh。
启动tomcat
#/usr/local/tomcat7/bin/catalina.sh start
关闭tomcat
# /usr/local/tomcat7/bin/catalina.sh stop
查看tomcat是否启动
# netstat -tunlp | grep java
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 2251/java
tcp 0 0 :::8009 :::* LISTEN 2251/java
tcp 0 0 :::8080 :::* LISTEN 2251/java
注意:tomcat默认监听在8080端口。
至此,tomcat服务器已经安装完成,可以通过浏览器来访问其默认页面。如:
输入http://192.168.0.200:8080/,显示结果如下:
这是tomcat的默认主页,对应文件是tomcat安装目录下的webapps/ROOT/index.jsp。
3、tomcat的目录结构
在安装tomcat后,生成了几个目录结构,分别是:
bin:这个目录一般存放的是一些二进制程序,tomcat启动脚本cataline.sh就在这个目录中。
conf:这是一个配置文件目录,里面有许多配置文件,配置文件的格式一般是以.xml格式结尾的。因此,对于不懂xml语言的朋友最后是不要随便对这些配置文件进行修改。对于配置文件,将在下面介绍。
lib:这里面存放的是以.jar结尾的文件
log:这是日志目录。用于存放tomcat的日志
temp:这是存放临时文件的目录
webapps:这个目录很重要。这是tomcat的应用目录或者叫做web服务器的根目录。把文件放在这个目录下就可以通过tomcat服务器来进行访问。
work:存放JSP经过tomcat编译后的servlet文件
4、tomcat的配置文件
刚刚说过tomcat的配置文件目录为/usr/local/tomcat7/conf,这里面有许多以.xml格式结尾的文件,如:
server.xml:这是tomcat的主配置文件,包含service、connector、Engin、Real、Value、Hosts等组件的相关配置信息
web.xml:遵循servlet规范的标准配置文件,用于配置servlet,并未所有的web应用程序提供包含MIME映射等默认配置信息。
tomcat-user.xml:存放Realm认证时用到的相关角色、用户和密码等信息;tomcat自带的manager默认情况下会用到此文件;在tomcat中添加、删除用户、为用户指定角色等都可以通过编辑此文件来实现。
catalina.policy:java相关的安全策略配置文件,在系统资源上提供访问控制的能力
Catalina.properties:tomcat内部的packet的定义及相关访问控制,也包括对通过类装载器装载的内容的控制。tomcat6在启动时会读取该文件的相关设置。
logging.properties:此文件可用于用来定义日志记录器的组件及他们的相关配置信息,还可以指定日志文件的存储位置。
context.xml:所有host的默认配置信息。
6、server.xml配置文件简介
server.xml文件中可定义的元素非常多,包括Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等。在这里我们只对其常用的组件进行基本介绍,关于更多的参数的意思可以参考tomcat的官方文档。
组件 | 参数及其意思 |
Server | port:接收shutdown指令的端口,默认仅允许通过本机访问,默认为8005;各个sever的端口号不能一样; shutdown:发送此server用于实现关闭tomcat实例的命令字符串。默认为SHUTDOWN; className: 用于实现此Server容器的完全限定类的名称,默认为org.apache.catalina.core.StandardServer; |
Service | Name:指定service的名称,默认为catalina; className:用于实现service的类名,一般都是org.apache.catalina.core.StandardService。 |
Connector | address:指定连接器的监听地址,默认为所有地址,即为0.0.0.0; maxThreads:支持的最大并发连接数,默认为200; port:连接器监听的端口,该端口用来接受用户的请求的,默认为8080; protocol:连接器协议。默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3。关于连接器在下文进行介绍; redirectport:如果连接器使用的协议是http,当收到客户端发来的https请求时,则转发至此定义的端口上。 connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即一分钟; enableLookup:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;默认为true; acceptCount:设置等待队列的最大长度。通常在tomcat所有处理线程比较繁忙的情况下,新发来的请求将被放置到等待队列中。 |
Engine | defaulthost: Tomcat支持基于FQDN的虚拟主机,这些虚拟主机可以通过在Engine容器中定义多个不同的Host组件来实现;但如果此引擎的连接器收到一个发往非非明确定义虚拟主机的请求时,则需要将此请求发送给一个默认的虚拟主机进行处理,因此,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名; name:Engine组件的名称,用于日志和错误信息记录时区别不同的引擎; |
Host: 位于Engine容器中,用于接收请求并进行相应处理的主机或虚拟主机 |
appBase:此host的webapp目录。即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于$CATALINA_HOME(tomcat的家目录)的相对路径; autoDeploy: 在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true; unpackWars: 在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true; name:定义主机名称。默认为localhost; |
Context: 一个Context定义用于标识tomcat实例中的一个Web应用程序, 每一个context定义也可以使用一个单独的XML文件进行配置 |
docBase: 相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字; path:相对于Web应用程序根路径而言的URI;如果为空“”,则表示为此webapp的根路径;如果context定义在一个单独的xml文件中,此属性不需要定义; reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false;这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重启tomcat的情况下改变应用程序; |
Realm: 用来定义一个安全上下文,它是用来提供用户认证和授权,并为其分别角色的 |
className: 指定Realm使用的类名,这是定义Realm时必须提供的属性,此类必须实现org.apache.catalina.Realm接口。可以使用的类名有如下几个: 1、JAASRealm:基于Java Authintication and Authorization Service实现用户认证; 2、JDBCRealm:通过JDBC访问某关系型数据库表实现用户认证; 3、JNDIRealm:基于JNDI使用目录服务实现认证信息的获取; 4、MemoryRealm:查找tomcat-user.xml文件实现用户信息的获取; 5、UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证,它实现是一个完全可更新和持久有效的MemoryRealm,因此能够跟标准的MemoryRealm兼容;它通过JNDI实现; |
Valve 类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内可以建立多个Valve,而且Valve定义的次序也决定了它们生效的次序。 |
className:指定实现value的类名。Tomcat6以上版本实现了多种不同的Valve,这些类名有: 1、AccessLogValve:访问日志Valve 2、ExtendedAccessValve:扩展功能的访问日志Valve 3、JDBCAccessLogValve:通过JDBC将访问日志信息发送到数据库中; 4、RequestDumperValve:请求转储Valve; 5、RemoteAddrValve:基于远程地址的访问控制; 6、RemoteHostValve:基于远程主机名称的访问控制; 7、SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量; 8、JvmRouteBinderValve:在配置多个Tomcat为以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当期望停止某节点时,可以通过此Valve将用记请求定向至备用节点;使用此Valve,必须使用JvmRouteSessionIDBinderListener; 9、ReplicationValve:专用于Tomcat集群架构中,可以在某个请求的session信息发生更改时触发session数据在各节点间进行复制; 10、SingleSignOn:将两个或多个需要对用户进行认证的webapp在认证用户时连接在一起,即一次认证即可访问所有连接在一起的webapp; 11、ClusterSingleSingOn:对SingleSignOn的扩展,专用于Tomcat集群当中,需要结合ClusterSingleSignOnListener进行工作; allow:定义允许访问的IP地址列表,以逗号分开,支持正则表达式,因此,点号“.”用于IP地址时需要转义;仅定义allow项时,非明确allow的地址均被deny; deny:定义禁止访问的IP地址列表,以逗号分开的,支持正则表达式;使用方式同allow; |
Logger |
className:指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口; prefix:指定log文件的前缀 suffix:指定log文件的后缀 timestamp:如果为true,则log文件后面会加上时间。 如:localhost_log.2001-10-04.txt; |
7、web.xml文件
web.xml基于Java Servlet规范,可被用于每一个Java servlet容器,通常有两个存放位置,$CATALINA_BASE/conf和每个Web应用程序(通常是WEB-INF/web.xml)。Tomcat在deploy一个应用程序时(包括重启或重新载入),它首先读取conf/web.xml,而后读取WEB-INF/web.xml文件。
8、配置manager来管理应用程序的部署及监控
tomcat的管理工具具有如下功能:
(1)、远程Deploy新应用程序
(2)、清理空闲会话
(3)、在不重启的情况下可以undeploy应用程序
(4)、可以分析内存泄漏
(5)、可以查看服务器状态和JVM状态信息
启动manager功能,需要编辑配置文件tomcat-user.xml。在这里我的配置文件为/usr/local/tomcat7/conf/tomcat-user.xml。根据自己的需要可以添加如下行信息:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="standard"/>
<user username="tomcat" password="tomcat" roles="admin-gui,manager-script,standard"/>
其中role行是用来定义角色的,manager有4个管理角色:
a、manager-gui:允许访问HTML gui页面和状态页面
b、manager-script:允许访问文本界面和状态页面
c、manager-jmx:允许访问JMX代理和状态页面
d、manager-status:仅允许访问状态页面
<user…/>这一行是定义访问时需要提供的用户、密码及使用哪种角色来访问。
注意:添加完成之后,还需要重启tomcat服务器。
测试访问,在浏览器中输入http://192.168.0.200:8080/manager,输入tomcat-user.xml中定义的用户和密码后,显示的结果如下所示:
tomcat的管理平台,自上而下共分为5个部分,分别为:
1、Message
这一行是消息栏,表示tomcat管理平台情况,其值OK表示tomcat运行正常。
2、Manager
下面有4个链接选项,分别是List Application(web应用管理列表)、HTML Manager Help(基于html来管理的web应用帮助信息)、Manager Help(如何管理其他web应用帮助信息)、Server Status(tomcat的服务器状态信息)。系统默认连接时第一个。
(3)、Application
管理tomcat服务器的所有web应用,每一个web应用都有5个属性,分别是:
path:该web应用程序的存放位置,即docBase值;
Display Name:标记此web应用的一个名称,供GUI工具使用,对应于web.xml文件中的display-name属性;
Running:此web应用是否处于运行状态;
Sessions: Session连接数目;
Command:分为2行,上面一行提供若干个命令,用于tomcat处于运行状态时,如何管理这些web应用。其中Undeploy表示卸载web应用,并且删除webapps/目录下对应的文件;
(4)、Deploy应用程序
用来发布web应用的,有2种方式:
第一种方式是在Deploy directory or WAR file located on server这一个栏中填写该web应用的相关信息,包括web应用的URI,XML配置文件路径、WAR文件或者该web应用相对于webapps目录的文件路径。然后再点击“Deploy”按钮即可。就可以发布该web应用,发布后再Application列中可以看到该web应用信息。这种方式只能发布位于webapps/目录下的web应用。
第二种方式是在WAR file to deploy这一栏中点击“浏览”按钮,在弹出的会话框中选中要发布的WAR文件,然后再点击“Deploy”按钮,即可发布web应用。发布后的web应用可以在Application列中看到。这种发布方式可以发布位于任意目录下的web应用。
(5)、Server Information
显示tomcat服务器的相关信息
9、配置host-manager来管理虚拟主机的应用及其监控
启用host-manager功能基于html的方式来管理虚拟主机,需要在tomcat-user.xml文件中添加如下信息:
<role rolename="admin-gui" />
<user username="webuser" password="webuser" roles="admin-gui" />
然后重启tomcat服务器,在浏览器中输入如下信息:
http://192.168.0.200:8080/host-manager/,显示结果如下:
10、tomcat虚拟主机的实现
在tomcat的主配置文件server.xml中,一个Host组件就是一个虚拟主机,因此,要想实现tomcat的虚拟主机,需要在server.xml文件,添加相应host组件。在server.xml中有一个默认的虚拟主机,其主机名为localhost。如果需要实现tomcat的虚拟主机,需要在server.xml文件中,且在Engine容器中添加如下信息:
<Host name='www.xsl.com' appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase="web1" path="a" />
</Host>
<Host name='ftp.xsl.com' appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase="web2" path="b" />
</Host>
然后再webapps目录中创建如下目录和文件
# mkdir web1/a �Cpv
# mkdir web2/b �Cpv
# vim web1/a/a.html 这里添加测试的内容即可
# vim web2/b/b.html
在浏览器中进行测试:
注意:在测试前,需要对主机名进行地址解析,在这里我们可以在本地的hosts文件中添加相应的信息即可。
输入http://www.xsl.com:8080/web1/a/a.html,显示结果如下
输入http://ftp.xsl.com:8080/web2/b/b.html,显示结果如下