1、Tomcat概述
前端
1.tomcat简介java
tomcat是基于JDK的web服务器,其能运行Servlet和JSP规范总。Tomcat 5支持最新的Servlet 2.4 和JSP 2.0规范。实际上Tomcat 部分是Apache服务器的扩展,但它是独立运行的。运行tomcat时,它实际上做为一个与Apache 独立的进程单独运行的。Apache 为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet。tomcat具备处理HTML页面的功能,另外它仍是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。mysql
官网:tomcat.apache.orglinux
附录:其余的java web服务器实现nginx
商业版本:WebSphere、WebLogic、Oc4j… …web
开源实现:Tomcat、jetty、Resin正则表达式
2.Tomcat配置文件sql
(1)配置文件种类shell
server.xml:主配置文件数据库
context.xml:每一个webapp有专用的配置文件,一般位于webapp应用程序目录下的WEB-INF目录中用于定义会话管理器、JDBC等;conf/context.xml是为各webapp提供默认配置;
web.xml:用于为全部的webapp提供默认部署相关的配置;
tomcat-users.xml:用户认证的帐号和密码配置文件;
catalina.policy:当使用-security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略;
catalina.properties:Java属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数;
logging.properties:日志相关的配置信息;
(2)主配置文件结构实例:
<?xmlversion='1.0' encoding='utf-8'?>
<Serverport="8005" shutdown="SHUTDOWN">
<ListenerclassName="org.apache.catalina.startup.VersionLoggerListener" />
<ListenerclassName="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on" />
<ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<ListenerclassName="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<GlobalNamingResources>
<Resource name="UserDatabase"auth="Container"
type="org.apache.catalina.UserDatabase"
description="User databasethat can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Connectorexecutor="tomcatThreadPool"
port="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina"defaultHost="localhost">
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina"defaultHost="localhost">
<RealmclassName="org.apache.catalina.realm.LockOutRealm">
<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true"autoDeploy="true">
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
3.Java Web服务组织结构
javaweb服务有特定的组织形式、层次型的目录结构;主要包含了servlet代码文件、JSP页面文件、类文件、部署描述符文件等;
/ |
web服务的根目录;相对的根路径 |
WEB-IN |
私有资源目录,一般存放当前web服务器自用的web.xml; |
META-I |
私有资源目录,一般存放当前web服务器自用的context.xml; |
classes/ |
此web服务的私有类; |
lib/ |
此web服务的私有类,被打包为jar格式类; |
index.jsp |
web服务的主页 |
webapp归档格式:.war:webapp;.jar:EJB的类库文件;.rar:资源适配器;.ear:企业级应用程序;
2、安装启动Tomcat
1.基于系统源安装RPM格式程序:openjdk + Tomcat
(1)安装jdk(java developmentkit,java开发工具箱)
jdk有两个版本:openjdk(开源版本)、Oracle JDK(商业版本)。此处用openjdk系列组件,须要安装三个程序包:java-1.7.0-openjdk、java-1.7.0-openjdk-devel、java-1.7.0-openjdk-devel
[root@localhost~]# yum install java-1.7.0-openjdk java-1.7.0-openjdk-develjava-1.7.0-openjdk-devel
(2)配置jdk环境变量
/usr/bin/java ->/etc/alternatives/java ->/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64/jre/bin/java,此三个位置是其软链接路径,目的是为了能够方便指向多个版本的JDK文件。
[root@localhost ~]# vim/etc/profile.d/java.sh # 添加java环境变量
export JAVA_HOME=/user/bin/java
[root@localhost ~]# exec bash # 重启shell进程以达到重读环境变量目的
[root@localhost ~]# java -version # 查看java版本肯定jdk可用
注意:
Tomcat调用JDK是强依赖于环境变量JAVA_HOME,而不是/usr/bin/java
(3)部署Tomcat
[root@localhost ~]# yum install tomcattomcat-lib # tomcat-lib在yum源码安装时会依赖安装,不要指明
[root@localhost ~]# yum innstall tomcat-webapps tomcat-admin-webapps # tomcat自带网页管理组件
(4)启动服务
[root@localhost~]# systemctl start tomcat.service
注意:
1) 监听端口:8080 8009,8005。8005端口能够链接此端口发送关闭命令;8080是http监控端口;8009是ajp协议监控端口。
2) 不能将默认端口8080改成80,可是在httpd反代的模式下能够监听在其余大于1024端口,仅有root用户才能使用1024内端口
3) java运行无需root权限,tomcat是以普通用户身份运行。
2.使用Oracle JDK+ Tomcat主站编译完成的安装包
(1)下载平台版本适合程序包至本地,安装jdk
[root@localhost~]# rpm -ivh jdk-8u25-linux-x64.rpm
(2)配置java环境变量
[root@localhost ~]# vim /etc/profile.d/java.sh
JAVA_HOME=/usr/java/latest
PATH=$JAVA_HOME/bin:$PATH
exportJAVA_HOME PATH
[root@localhost~]# exec bash
[root@localhost~]# java -version
(3) 安装官网下载Tomcat
[root@localhost~]# tar xf apache-tomcat-8.0.23.tar.gz -C /usr/local
[root@localhost~]# cd /usr/local
[root@localhostlocal]# ln -sv apache-tomcat-8.0.23/ tomcat
[root@localhostlocal]# cd tomcat/
注释:Tomcat的目录结构
bin:脚本及启动时用到的类
lib: 提供的j类库
man: 帮助手册
conf:配置文件
logs:日志文件
webapps:应用程序默认部署目录
work:工做目录,jsp代码编译成class文件装入JVM运行,临时放置编译文件位置
temp:临时文件目录
(4)启动环境变量
[root@localhost ~]# vim/etc/profile.d/tomcat.sh # 须要配置一个环境变量:CATALINA_BASE
CATALINA_BASE=/usr/local/tomcat
PATH=$CATALINA_BASE/bin:$PATH
export CATALINA_BASE PATH
[root@localhostbin]# exec bash
[root@localhost~]# catalina.sh start
此时能够调用/usr/local/tomcat/bin下的catalina.sh脚本运行,可是此时启动的tomcat进程是以root身份运行,不安全
(5)查看Tomcat和其调用的JDK版本信息
[root@localhost~]# catalina.sh version
3、tomcat配置组件
1.server:服务器组件
这是一个顶级组件,其是一个tomcat实例,即运行一个jvm进程。每一个server监听的端口不能相同,一个物理主机上启动多个server实例应该使用不一样的端口。
属性定义:port、shutdown、className,8005端口为关闭所使用
<Serverport="8005" shutdown="SHUTDOWN">
<ListenerclassName="org.apache.catalina.startup.VersionLoggerListener" />
2.service:服务组件
一个服务组件一般包含一个引擎和与此引擎相关联的一个或多个链接器。属性:name
<Service name="Catalina">
3.connector:链接器组件
负责链接客户端(能够是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,一般指的是接收客户发来请求的位置及服务器端分配的端口。默认端口一般是HTTP协议的8080,管理员也能够根据本身的须要改变此端口。一个引擎能够配置多个链接器,但这些链接器必须使用不一样的端口。
(1) tomcat做为独立的应用程序服务器,直接接受来自于浏览器的请求,此时仅能支持http、https协议传输
(2) tomcat实现反代模式,其请求未来自于前面的反代主机
当前端主机为httpd服务器可接受:http,https,ajp
当前端主机为nginx服务器:http,ajp
属性定义:
address |
链接器监听的IP地址,不给出 |
maxThreads |
最大并发线程数,默认为150 |
port |
监听的TCP端口 |
protocol |
链接器使用的协议,通常为HTTP/1.1或AJP/1.3 |
redirectPort |
重定向端口 |
connectionTimeout |
链接超时时长,单位为毫秒,默认为60000,一分钟 |
enableLookups |
是否经过DNS服务实现查询 |
acceptCount |
定义等待队列的长度 |
scheme |
客户端请求对应映射的协议 |
debug |
链接器是否启用调试功能 |
secure |
工做在安全模式下 |
clientAuth |
是否要验证客户端证书 |
sslProcotol |
ssl协议版本 |
实例:
<Connectorport="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Connectorport="8443"protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"SSLEnabled="true" scheme="https" secure="true"
clientAuth="false"sslProtocol="TLS" />
<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />
注意:
1) 采用前端代理的方式且在httpd时候禁用tomcat的http功能能极大的提升安全性;且客户端访问http端口为80,而tomcat定义端口只能为任意大于1024的端口
2) 实际生产中通常tomcat都是接受前端代理发来的请求,前端服务器和Tomcat之间通讯不会是https加密,因此端口重定向不会使用。在链接器中定义redirectPort重定向规则,若端口未定义被Tomcatcat监听,定义也是无效的
3) AJP: apachejserv protocol, 二进制协议
ajp方式的链接器只有在前端主机时httpd服务时候才能启用。ajp传输比http文本类型协议传输效率更高。ajp方式和http方式不能同时使用。
4.Engine:引擎(容器)组件
Servive的一个实例,即servlet引擎,默认引擎是catalina。其内部能够有一个或多个Host组件来定义站点;一般须要经过defaultHost的属性定义默认虚拟主机,defaultHost后定义选项须要在Host中对应定义
<Enginename="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true"autoDeploy="true">
</Engine>
经常使用属性:name、default、JvmRoute(定义路由用户请求的方式是否附加一些条件)
5.Host:虚拟主机组件
位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:
<Host name="localhost"appBase="webapps"
unpackWARs="true"autoDeploy="true"
xmlValidation="false"xmlNamespaceAware="false">
</Host>
经常使用属性:
name |
虚拟主机名称 |
appBase |
存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;能够为相对路径或绝对路径 |
autoDeploy |
Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动部署;默认为true; |
unpackWars |
在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true; |
xmlValidation |
是否验证xml语法合格性 |
xmlNamespaceAware |
关注xml名称空间 |
实例:
<Enginename="Catalina" defaultHost="localhost">
<Host name="localhost"appBase="webapps">
<Context path=""docBase="ROOT"/>
<Context path="/bbs"docBase="/web/bss"
reloadable="true"crossContext="true"/>
</Host>
<Hostname="mail.magedu.com" appBase="/web/mail">
<Context path="/"docBase="ROOT"/>
</Host>
</Engine>
注意:
主机别名定义:若是一个主机有两个或两个以上的主机名,额外的名称都可以以别名的形式进行定义<Alias></Alias>
6.context:上下文组件
相似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序;以下面的定义:
<!-- Tomcat Root Context -->
<Context path=""docBase="/web/webapps"/>
<!-- buzzin webapp -->
<Context path="/bbs"
docBase="/web/threads/bbs"
reloadable="true">
</Context>
<!-- chat server -->
<Context path="/chat"docBase="/web/chat"/>
<!-- darian web -->
<Context path="/darian"docBase="darian"/>
经常使用的属性定义:
1)docBase:相应的Web应用程序的存放位置;也可使用相对路径,起始路径为此Context所属Host中appBase定义的路径;docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系
2)path:相对于Web服务器根路径而言的URI;若是为空“”,则表示为此webapp的根路径;
若是context定义在一个单独的xml文件中,此属性不须要定义;
3)reloadable:是否容许从新加载此context相关的Web应用程序的类;默认为false;
注意:
1) 在Tomcat6中,每个context定义也可使用一个单独的XML文件进行,其文件的目录为$CATALINA_HOME/conf/<enginename>/<hostname>。能够用于Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。
2) path给定的路径不能以“/”结尾;
7.Realm组件:
一个Realm表示一个安全上下文,它是一个受权访问某个给定Context的用户列表和某用户所容许切换的角色相关定义的列表。所以,Realm就像是一个用户和组相关的数据库。定义Realm时唯一必需要提供的属性是classname,它是Realm的多个不一样实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。
JAASRealm:基于JavaAuthintication and Authorization Service实现用户认证;
JDBCRealm:经过JDBC访问某关系型数据库表实现用户认证;
JNDIRealm:基于JNDI使用目录服务实现认证信息的获取;
MemoryRealm:查找tomcat-user.xml文件实现用户信息的获取;
UserDatabaseRealm:基于UserDatabase文件(一般是tomcat-user.xml)实现用户认证,它实现是一个彻底可更新和持久有效的MemoryRealm,所以可以跟标准的MemoryRealm兼容;它经过JNDI实现;
配置实例:
UserDatabase的配置:
<RealmclassName=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
JDBC方式获取用户认证信息的配置:
<RealmclassName="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority"
connectionName="test"connectionPassword="test"
userTable="users"userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles"roleNameCol="role_name" />
8.Valve:阀门组件
Valve相似于过滤器,它能够工做于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内能够创建多个Valve,并且Valve定义的次序也决定了它们生效的次序。
Tomcat6中实现了多种不一样的Valve:
AccessLogValve:访问日志Valve
ExtendedAccessValve:扩展功能的访问日志Valve
JDBCAccessLogValve:经过JDBC将访问日志信息发送到数据库中;
RequestDumperValve:请求转储Valve;
RemoteAddrValve:基于远程地址的访问控制;
RemoteHostValve:基于远程主机名称的访问控制;
SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量;
JvmRouteBinderValve:在配置多个Tomcat为以Apache经过mod_proxy或mod_jk做为前端的集群架构中,当指望中止某节点时,能够经过此Valve将用记请求定向至备用节点;使用此Valve,必须使用JvmRouteSessionIDBinderListener;
ReplicationValve:专用于Tomcat集群架构中,能够在某个请求的session信息发生更改时触发session数据在各节点间进行复制;
SingleSignOn:将两个或多个须要对用户进行认证webapp在认证用户时链接在一块儿,即一次认证便可访问全部链接在一块儿的webapp;
ClusterSingleSingOn:对SingleSignOn的扩展,专用于Tomcat集群当中,须要结合ClusterSingleSignOnListener进行工做;
相关属性定义:
1)className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
2)allow:以逗号分开的容许访问的IP地址列表,支持正则表达式,所以,点号“.”用于IP地址时须要转义;仅定义allow项时,非明确allow的地址均被deny;
3) deny:以逗号分开的禁止访问的IP地址列表,支持正则表达式;使用方式同allow;
注意:
RemoteHostValve和RemoteAddrValve能够分别用来实现基于主机名称和基于IP地址的访问控制,控制自己能够经过allow或deny来进行定义,这有点相似于Apache的访问控制功能;以下面的Valve则实现了仅容许本机访问/probe:
<Context path="/probe"docBase="probe">
<ValveclassName="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1"/>
</Context>
实例:
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
className |
类名称,经常使用公司域名反写的方式。 |
directory |
默认相对路径,也可改成绝对路径 |
prefix |
日志文件的前缀 |
suffix |
日志文件的后缀 |
pattern |
记录的值日信息包含的内容 |
9.Listener
Listener用于建立和配置LifecycleListener对象,而LifecycleListener一般被开发人员用来建立和删除容器。
10.Loader
Java的动态装载功能是其语言功能强大表现之一,Servlet容器使用此功能在运行时动态装载servlet和它们所依赖类。Loader能够用于Context中控制java类的加载。
4、Tomcat的Web CUI控制接口配置
tomcat自带的应用程序实现管理功能:manager app: webapp管理工具、host manager:虚拟主机管理工具
1.manager app: webapp管理工具
(1)配置
[root@localhost tomcat]# vim./conf/tomcat-users.xml 添加以下:
<rolerolename="manager-gui"/>
<userusername="tomcat" password="s3cret"roles="manager-gui"/>
[root@localhosttomcat]# catalina.sh stop
[root@localhosttomcat]# catalina.sh start
说明:
1) 支持角色:
manager-gui |
容许访问HTMl图形化界面和状态页,最大权限 |
manager-script |
容许访问文本接口和状态页 |
manager-jmx |
JMX代理实现对状态管理 |
manager-status |
仅受权你用户访问状态页面 |
2) 配置后服务必须重启,应为java程序须要加载到内存
(2)展现
2.host manager:虚拟主机管理工具
(1)配置
[root@localhost tomcat]# vim./conf/tomcat-users.xml 添加以下:
<rolerolename="admin-gui"/>
<userusername="tomcat" password="s3cret"roles="admin-gui"/>
[root@localhosttomcat]# catalina.sh stop
[root@localhosttomcat]# catalina.sh start
支持角色:
admin-gui- allows access to the HTML GUI
admin-script- allows access to the text interface
(2)展现
注意:
当定义相同的用户同时可以使用这两个工具须要按照以下定义
<rolerolename="manager-gui" />
<rolerolename="admin-gui"/>
<userusername="tomcat" password="tomcat"roles="manager-gui,admin-gui"/>
配置完任意一个后均可查看状态页: