概述
tomcat 是JSP Container的开源实现,tomcat是 Java 2 EE 技术体系的不完整实现,tomcat在使用前需要部署Java环境。
http://tomcat.apache.org/
一.Tomcat 简介
1.1 核心组件
Tomcat的核心组件:server.xml
基本格式:
<Server>
<Service>
<connector/>
<connector/>
…
<Engine>
<Host>
<Context/> #相当于alias
<Context/>
…
<Value/>
</Host> #virtual host
<Host>
…
</Host>
…
</Engine>
</Service>
</Server>
1.2 组件类型简介
Tomcat的架构:
它由一组嵌套的层次和组件组成,一般可分为以下四类:
顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系;
连接器:连接客户端(可以是浏览器或Web服务器)请求至Servlet容器,
容器:包含一组其它组件;
被嵌套的组件:位于一个容器当中,但不能包含其它组件;
各常见组件:
1、服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。
2、服务(service):一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。
连接器类组件:
3、连接器(connectors):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。
容器类组件:
4、引擎(Engine):引擎通是指处理请求的Servlet引擎组件,即CatalinaServlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
5、主机(Host):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。
6、上下文(Context):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。
被嵌套类(nested)组件:
这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。
7、阀门(Valve):用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
8、日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
9、领域(Realm):用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。
引擎(Engine):引擎是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它从HTTPconnector接收请求并响应请求。它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
Tomcat连接器架构:
基于Apache做为Tomcat前端的架构来讲,Apache通过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。而对Tomcat来说,每个Web容器实例都有一个Java语言开发的连接器模块组件,在Tomcat6中,这个连接器是org.apache.catalina.Connector类。这个类的构造器可以构造两种类别的连接器:HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。但可以简单地通过在server.xml配置文件中实现连接器的创建,但创建时所使用的类根据系统是支持APR(Apache Portable Runtime)而有所不同。
APR是附加在提供了通用和标准API的操作系统之上一个通讯层的本地库的集合,它能够为使用了APR的应用程序在与Apache通信时提供较好伸缩能力时带去平衡效用。
同时,需要说明的是,mod_jk2模块目前已经不再被支持了,mod_jk模块目前还apache被支持,但其项目活跃度已经大大降低。因此,目前更常用的方式是使用mod_proxy模块。
如果支持APR:
HTTP/1.1:org.apache.cotote.http11.Http11AprProtocolAJP/1.3:org.apache.coyote.ajp.AjpAprProtocol
1 2 | HTTP/1.1:org.apache.cotote.http11.Http11AprProtocol AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol |
连接器协议:
Tomcat的Web服务器连接器支持两种协议:AJP和HTTP,它们均定义了以二进制格式在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。
AJP(ApacheJServ Protocol)协议:目前正在使用的AJP协议的版本是通过JK和JK2连接器提供支持的AJP13,它基于二进制的格式在Web服务器和Tomcat之间传输数据,而此前的版本AJP10和AJP11则使用文本格式传输数据。
HTTP协议:诚如其名称所表示,其是使用HTTP或HTTPS协议在Web服务器和Tomcat之间建立通信,此时,Tomcat就是一个完全功能的HTTP服务器,它需要监听在某端口上以接收来自于商前服务器的请求。
1.3. 组件架构:
二. 安装Tomcat:
2.1 依赖环境JDK安装:
使用oricl官方jdk或者openjdk均可以,base仓库自带的有openjdk
#此处使用官方包安装:
准备好JDK包,直接使用RPM命令安装即可:
[root@node74 ~]# rpm -ivhjdk-8u25-linux-x64.rpm
安装路径:
[root@node74 ~]# cd /usr/java/
[root@node74 java]# ls
default jdk1.8.0_25 latest
版本指定方式:
当多个版本都安装时候,latest软链接到的需要使用的版本,再通过在/etc/profile.d/下定义
jdk.sh:
exportJAVA_HOME=/usr/java/latest
exportPATH=$JAVA_HOME/bin:$PATH
. /etc/profile.d/jdk.sh生效
2.2 tomcat安装方式
1. Base Repo:#默认base仓库已经有tomcat,直接yum安装即可
常用安装组合,解决依赖关系:
tomcat, tomcat-lib, tomcat-admin-webapps, tomcat-webapps,tomcat-docs-webapp
#webapps用于提供WEB管理功能
启动tomcat服务
此时打开端口8080 8009 8005
2. 源码方式Tomcatbinary release:
#此方式无需编译,创建软链接既可以安装
tar xfapache-tomcat-VERSION.tar.gz -C /usr/local/
cd /usr/local
ln-sv apache-tomcat-VERSION tomcat
/etc/profile.d/tomcat.sh
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
#此方式下,需要借助catalina.sh来启动,以及执行其他操作
tomcat的启用最好用普通用户,所以创建tomcat用户,并修改目录的属主和属组,启动服务,如下:
# useradd tomcat
# chown -R :tomcat /usr/local/tomcat/* //为填加tomcat的可读权限;权限不能设置太大
# chown -R tomcat /usr/local/tomcat/{log,work,temp,conf}//某些特定的文件夹
su – tomcat -c '/usr/local/tomcat/bin/catalina.sh start'
在生产中,更多采用base源yum安装
catalina.sh 工具
#该工具位于tomcat目录的bin下,当使用源码创建软链接形式安装时,需要借助此工具
#用于综合调用其他脚本来完成各种功能的
# catalina.sh –help
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run StartCatalina in the current window
run -security Start in the current window withsecurity manager
start Start Catalina in a separate window
start -security Start in a separate window withsecurity manager
stop StopCatalina, waiting up to 5 seconds for the process to end
stop n Stop Catalina, waiting up to n secondsfor the process to end
stop -force StopCatalina, wait up to 5 seconds and then use kill -KILL if still running
stop n -force Stop Catalina, wait up to n secondsand then use kill -KILL if still running
configtest Run a basic syntax check on server.xml – check exit code for result
version What version of tomcat are you running?
2.3 tomcat程序环境
1. tomcat的目录结构
#此为使用源码创建软链接形式安装时的程序环境
bin:脚本,及启动时用到的类;
conf:配置文件目录;
lib:库文件,Java类库,jar;
logs:日志文件目录;
temp:临时文件目录;
webapps:webapp的默认目录,即应用程序的根目录ROOT
work:工作目录;jsp文件编译为类文件以及执行等涉及的全部过程文件,都放于此处
webapps/host-manager ,manager : WEB GUI管理界面用到的管理程序
webapps/doc : 使用文档,使用方式: http://ip:8080/docs/
webapps/examle: 示例
webapps/ROOT: 默认的应用根目录
2. rpm包安装的程序环境:
主配置文件存放目录:/etc/tomcat/
webapps存放位置:/usr/share/tomcat/webapps/
webapps:webapp的默认目录
work:工作目录;jsp文件编译为类文件以及执行等涉及的全部过程文件,都放于此处
webapps/host-manager ,manager : WEB GUI管理界面用到的管理程序
webapps/doc : 使用文档,使用方式: http://ip:8080/docs/
webapps/example: 示例
webapps/ROOT: 默认的主页根目录,主页根目录的映射
三.tomcat的配置详解:
3.1 yum 安装下的配置文件分类(/etc/tomcat):
server.xml:主配置文件;
web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置;
context.xml:每个web都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置;
tomcat-users.xml:用户认证的账号和密码文件;
catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略;
catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数;
logging.properties:日志系统相关的配置;
#备注:通常使用默认值就足够使用
3.2 TOMCAT 组件详解
Tomcat以面向对象的方式运行,它可以在运行时动态加载配置文件中定义的对象结构,这有点类似于apache的httpd模块的调用方式。server.xml中定义的每个主元素都会被创建为对象,并以某特定的层次结构将这些对象组织在一起下面是个样样例配置:
<Server port="8005" shutdown="SHUTDOWN"> 启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令,使用 telnet 连接8005 端口可以直接执行 SHUTDOWN 命令来关闭 Tomcat。各Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口。这个端口的定义用于为管理员提供一个关闭此实例的便捷途径,因此,管理员可以直接telnet至此端口使用SHUTDOWN命令关闭此实例。不过,基于安全角度的考虑,这通常不允许远程进行。 将8005的连接器的端口改为-1,关闭内置的管理端口8005,能加快tomcat服务启动或停止的速度
<Listener className=”org.apache.catalina.core.JasperListener” /> <Listener className=”org.apache.catalina.mbeans.ServerLifecycleListener” /> <Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener” /> className: 用于实现此Server容器的完全限定类的名称, //类名,指定的,名字逆序书写默认为org.apache.catalina.core.StandardServer; <GlobalNamingResources> <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”/> </GlobalNamingResources> <Service name=”Catalina”> Service主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议接收入站请求交将其转发至关联的引擎进行处理。困此,Service要包含一个引擎、一个或多个连接器connector。 如上面示例中的定义: <Service name=”Catalina”> 这定义了一个名为Catalina的Service,此名字也会在产生相关的日志信息时记录在日志文件当中。 <Connector port=”8080″ protocol=”HTTP/1.1″ maxThreads=”150″ connectionTimeout=”20000″ redirectPort=”8443″/> Connector组件: 进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类: Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等; Tomcat作为独立服务器:请求来自于web浏览器; Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个Connector仅能对应一个Engine,一个引擎可以有一个或多个连接器,以适应多种请求方式。 定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有4种: 1) HTTP连接器 2) SSL连接器 3) AJP 1.3连接器 4) proxy连接器 定义连接器时可以配置的属性非常多,但通常定义HTTP连接器时必须定义的属性只有“port“,定义AJP连接器时必须定义的属性只有”protocol”,因为默认的协议为HTTP。以下为常用属性的说明:
下面是一个定义了多个属性的SSL连接器: <Connector port=”8443″ maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″ enableLookups=”false” acceptCount=”100″ debug=”0″ scheme=”https” secure=”true” clientAuth=”false” sslProtocol=”TLS” /> 注意: 1) 采用前端代理的方式且在httpd时候禁用tomcat的http功能能极大的提高安全性;且客户端访问http端口为80,而tomcat定义端口只能为任意大于1024的端口 2)实际生产中一般tomcat都是接受前端代理发来的请求,前端服务器和Tomcat之间通信不会是https加密,所以端口重定向不会使用。在连接器中定义redirectPort重定向规则,若端口未定义被Tomcatcat监听,定义也是无效的 3) AJP: apachejserv protocol, 二进制协议 ajp方式的连接器只有在前端主机时httpd服务时候才能启用。ajp传输比http文本类型协议传输效率更高。ajp方式和http方式不能同时使用。
<Engine name=”Catalina” defaultHost=”localhost”>
Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件。如前面示例中定义的: <Engine name=”Catalina” defaultHost=”localhost”> 常用的属性定义: defaultHost:Tomcat支持基于FQDN的虚拟主机,这些虚拟主机可以通过在Engine容器中定义多个不同的Host组件来实现;但如果此引擎的连接器收到一个发往非非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名; name:Engine组件的名称,用于日志和错误信息记录时区别不同的引擎; Engine容器中可以包含Realm、Host、Listener和Valve子容器。
<Host name=”localhost” appBase=”webapps” unpackWARs=”true” autoDeploy=”true” xmlValidation=”false” xmlNamespaceAware=”false”> </Host> Host组件: 位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义: 常用属性说明:
虚拟主机定义示例: 示例1: vim /etc/tomcat/server.xml <Host name=”www.zabiengs.com” appBase=”/web/bss” unpackWARs=”true” autoDeploy=”true”> </Host> mkdir -pv /web/bss/ROOT/{lib,classes,WEB-INF} vim /web/bss/ROOT/index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>Test Page</title> </head> <body> <% out.println("hello,mylove"); %> </body> </html> 测试: 示例2内含context组件 <Engine name=”Catalina” defaultHost=”localhost”> <Host name=”localhost” appBase=”webapps”> <Context path=”/” docBase=”ROOT”/> #相对路径访问webapps 访问webapps下的ROOT <Context path=”/bbs” docBase=”/web/bss”/>#访问webapps/bbs 访问/web/bss </Engine> 注:path为虚拟路径,访问时的路径,注意:一定要加“/”,docbase后不加“/” Context组件: Context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序 1) docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字; 2) path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径;如果context定义在一个单独的xml文件中,此属性不需要定义,有可能是别名; 3) reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false;
主机别名定义: 如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义,如下: <Host name=”www.ttlsa.com” appBase=”webapps” unpackWARs=”true”> <Alias>feiyu.com</Alias> </Host>
</Engine> </Service> </Server>
</Realm> Realm组件: 一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm就像是一个用户和组相关的数据库。定义Realm时惟一必须要提供的属性是classname,它是Realm的多个不同实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。
下面是一个常见的使用UserDatabase的配置: <Realm className=”org.apache.catalina.realm.UserDatabaseRealm” resourceName=”UserDatabase”/> 下面是一个使用JDBC方式获取用户认证信息的配置: <Realm className=”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” />
Valve组件: Valve类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内可以建立多个Valve,而且Valve定义的次序也决定了它们生效的次序。实现了多种不同的Valve:
RemoteHostValve和RemoteAddrValve可以分别用来实现基于主机名称和基于IP地址的访问控制,控制本身可以通过allow或deny来进行定义,这有点类似于Apache的访问控制功能;如下面的Valve则实现了仅允许本机访问/probe: <Host name=”localhost” appBase=”webapps” unpackWARs=”true” autoDeploy=”true”> <Context path=”/probe” docBase=”probe”> <Valve className=”org.apache.catalina.valves.RemoteAddrValve” allow=”127.0.0.1″/> </Context> 其中相关属性定义有: 1) className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve; 2) allow:以逗号分开的允许访问的IP地址列表,支持正则表达式,因此,点号“.”用于IP地址时需要转义;仅定义allow项时,非明确allow的地址均被deny; 3) deny: 以逗号分开的禁止访问的IP地址列表,支持正则表达式;使用方式同allow;
<Valve className=”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.3 JSP WebAPP的组织结构:
JSP WebAPP的组织结构:应用程序基本都遵循这个目录结构
[root@www/usr/share/tomcat/webapps/webapp]# ls
classes index.jsp lib META-INF WEB-INF
/: webapps的根目录;每个应用程序都有一个该目录
index.jsp:默认主页;
WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;
META-INF/:类似于WEB-INF/;
classes/:类文件,当前webapp所提供的类;
lib/:类文件,当前webapp所提供的类,被打包为jar格式;
webapp归档格式:
.war:webapp
#默认使用的java应用文件,一般都打包成此格式
#放在webapp下,tomcat可以自动识别解压使用
.jar:EJB的类打包文件;
.rar:资源适配器类打包文件;
.ear:企业级webapp;
3.4 部署(deploy)webapp的相关操作:
部署 //:应用程序依赖到的类必须被加载到JVM(JAVA虚拟机)中才能运行
1. deploy:将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此webapp;将其特有的类和依赖的类通过class loader装载至JVM(若不加载相关类,则无法通过http访问到);
注意: 当手动去为一个新的jsp网页在/webapps下创建根目录时候,需要包含以下几个子目录(创建webapp特有的目录结构);
webapps/???/ROOT/{lib,classes,WEB-INF,META-INF}
以及在/???/ROOT/下需要创建一个index.jsp
2.部署有两种方式:
自动部署:auto deploy不建议用,通过测试可以
手动部署: (需要手动重启tomcat才能生效)
冷部署:把webapp复制到指定的位置,而后才启动tomcat;
热部署:在不停止tomcat的前提下进行部署;
部署工具:manager、ant脚本、tcd(tomcatclient deployer)等;
3. 指令:
undeploy:反部署,停止webapp,并从tomcat实例上卸载webapp;
start:启动处于停止状态的webapp;
stop:停止webapp,不再向用户提供服务;其类依然在jvm上;
redeploy:重新部署;
4. 部署路径:
yum 安装模式:
/usr/share/tomcat/webapps/
源码安装模式:
一般位于: /usr/local/tomcat/webapps
自定义路径:
任意路径均可,但是需要在站点根目录下创建一个ROOT目录,并包含index.jsp 文件, /lib ,/WEB-INF, /classes子目录,不能直接将应用程序文件放在根目录下,必须放于根下的ROOT中
4.1冷部署
mkdir/usr/share/tomcat/webapps/test/{WEB-INF,META-INF,lib,classes}
vim /test/index.jsp
#增加如下内容
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println("Test :Hello world"); %>
</body>
</html>
重启tomcat服务后,测试访问 URL/test 页面是否显示 Test : Hello world
4.2热部署
4.2.1使用部署工具进行热部署
布置新的webapps相关文件,此处为了方便演示,将test复制重命名为test2后演示热部署过程
cd /usr/share/tomcat/webapps
cp -a test/ test2/
#修改下index.jsp文件,使其与test的index.jsp文件内容不同,以示区别
vim /usr/share/tomcat/webapps/test2/index.jsp
<%@page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println("Test2 :Hello world");
%>
</body>
</html>
在Tomcat默认页面上,使用”ManagerApps”工具,可在Deploy一段的“Context Path (required):”中填写 test2 ,点击deploy即完成部署。
4.2.2添加<context/>标签
1.热加载:
在server.xml -> context属性中 设置 reloadable="true"
<Context docBase="xxx" path="/xxx" reloadable="true"/>
2.热部署:在server.xml -> context 属性中 设置 autoDeploy="true"
<Context docBase="xxx" path="/xxx" autoDeploy="true"/>
同样可以:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="xxx" path="/xxx"/>
</Host>
区别:
热加载:服务器会监听 class 文件改变,包括web-inf/class,wen-inf/lib,web-inf/web.xml等文件,若发生更改,则局部进行加载,不清空session ,不释放内存。开发中用的多,但是要考虑内存溢出的情况。
热部署:整个项目从新部署,包括你从新打上.war 文件。 会清空session ,释放内存。项目打包的时候用的多。
查看部署环境:
cd /var/cache/tomcat/work下使用tree命令查看
可以看到这里面有.java文件和.class文件,这是JSP把index.jsp通过servlet转换成.java文件,然后通过complie编译成bytecodes自解码的.class文件,然后在JVM中运行
3.5 tomcat的两个管理应用:
manager
host-manager
#要使用此功能,需要安装 tomcat-admin-webapps,tomcat-webapps两个包
使用方式:
在web gui页面中,点击nanger app/host manager 输入管理员账号密码即可使用
#注意默认管理功能不开启,需要手动授权账号
授权用户: #在输入密码时,点击取消,即会出现提示信息
在/etc/tomcat/tomcat-user.xml中修改定义:
可启用的功能: #直接取消注释即可, 注释服为”<!– –>”
<!– <role rolename=”admin”/> –>
<role rolename=”admin-gui”/>
<!– <role rolename=”admin-script”/> –>
<!– <role rolename=”manager”/> –>
<role rolename=”manager-gui”/>
<!– <role rolename=”manager-script”/> –>
<!– <role rolename=”manager-jmx”/> –>
<!– <role rolename=”manager-status”/> –>
授权用户:
<user username=”role1″ password=”tomcat” roles=”admin-gui,manager-gui“/>
#授权给用户的权限,需要在上面先开启对应权限功能
#可开启的功能:
manager-gui | 允许访问HTMl图形化界面和状态页,最大权限 |
manager-script | 允许访问文本接口和状态页 |
manager-jmx | JMX代理实现对状态管理 |
manager-status | 仅授权你用户访问状态页面 |
eg:
<role rolename=”manager-gui”/>
#开启manager-gui功能
<user username=”tomcat” password=”tomcat” roles=”manager-gui“/>
#将开启的manager-gui功能授权给tomcat用户,密码为tomcat
服务器状态信息server status-JVM
EendSpace : 新生带
SurvivorSpace : 存活带
TenuredGen: 老年带
3.6 WEB-GUI 中的部署功能
3.7 添加主机
在/etc/tomcat/server.xml中定义<host>
Host Manager进入添加
四. LNMT:Linux Nginx MySQLTomcat
4.1 client请求传送流程
Client (http) –> nginx (reverse proxy)(http) –> tomcat (http connector)
注意: nginx 仅支持使用Http协议反代给后端的tomcat ,而httpd 支持ajp协议;
4.2 nginx配置:
1. 与常规的反代配置一样,直接添加location即可:
location / {
proxy_pass http://10.1.249.69:8080/;
}
若后端为tomcat 集群,则依然按照常规的集群定义upstream即可
2. 若希望nginx自行处理静态内容时则:
location ~* .(jsp|do)$ {
proxy_pass http://tc1.magedu.com:8080;
}
五. LAMT:Linux Apache(httpd)MySQL Tomcat
5.1 httpd 反代模块:
# httpd支持使用http协议以及ajp协议反代给后端的tomcat
1. httpd的代理模块:
proxy_module
proxy_http_module:适配http协议客户端;
proxy_ajp_module:适配ajp协议客户端;(几乎不用)
2. 客户端请求传送流程:
Client (http) –> httpd (proxy_http_module)(http) –>tomcat (http connector)
Client (http) –> httpd (proxy_ajp_module)(ajp) –>tomcat (ajp connector)
5.2 proxy_http_module配置实例:
proxy_http_module代理配置示例:
<VirtualHost *:80>
ServerName tc1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://tc1.magedu.com:8080/
ProxyPa***everse / http://tc1.magedu.com:8080/
<Location />
Require all granted
</Location>
</VirtualHost>
5.3 proxy_ajp_module 配置实例
proxy_ajp_module代理配置示例:
<VirtualHost *:80>
ServerName tc1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass /ajp://10.1.249.69:8009/
ProxyPa***everse /ajp://10.1.249.69:8009/
<Location />
Require all granted
</Location>
</VirtualHost>
转载于:https://blog.51cto.com/13157015/1979157
最后
以上就是感性衬衫为你收集整理的tomcat的全部内容,希望文章能够帮你解决tomcat所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复