⼆、tomcat的主配置⽂件详解
⼀、tomcat的⽬录结构
[root@tomcat ~]# cd /usr/local/tomcat/
[root@tomcat tomcat]# tree -L 1
.
├── bin      #→⽤以启动、关闭Tomcat或者其它功能的脚本(.bat⽂件和.sh⽂件)
├── conf      #→⽤以配置Tomcat的XML及DTD⽂件
├── lib      #→存放web应⽤能访问的JAR包
├── LICENSE
├── logs      #→Catalina和其它Web应⽤程序的⽇志⽂件
├── NOTICE
├── RELEASE-NOTES
├──
├── temp    #→临时⽂件
├── webapps  #→Web应⽤程序根⽬录
└── work      #→⽤以产⽣有JSP编译出的Servlet的.java和.class⽂件
7 directories, 4 files
[root@tomcat tomcat]# cd webapps/
[root@tomcat webapps]# ll
total 20
drwxr-xr-x 14 root root 4096 Oct 512:09 docs        #→tomcat帮助⽂档
drwxr-xr-x 6 root root 4096 Oct 512:09 examples      #→web应⽤实例
drwxr-xr-x 5 root root 4096 Oct 512:09 host-manager  #→管理
drwxr-xr-x 5 root root 4096 Oct 512:09 manager      #→管理
drwxr-xr-x 3 root root 4096 Oct 512:09 ROOT          #→默认⽹站根⽬录
⼆、tomcat的配置⽂件及组件说明
组件分类
顶级组件
Server,代表整个Tomcat容器
服务类组件
Service,组织Engine和Connector,⾥⾯只能包含⼀个Engine
连接器组件
Connector,有HTTP、HTTPS、A JP协议的连接器
容器类
Engine、Host、Context都是容器类组件,可以嵌⼊其它组件,内部配置如何运⾏应⽤程序。
内嵌类
可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组
件内定义。
集类组件
listener、cluster
tomcat的构建组成
名称说明
Server              Tomcat运⾏的进程实例
Connector          负责客户端的HTTP、HTTPS、A JP等协议的连接。⼀个Connector只属于某⼀个Engine
Service            ⽤来组织Engine和Connector的关系
Engine              响应并处理⽤户请求。⼀个引擎上可以绑定多个Connector
Host                虚拟主机
Context            应⽤的上下⽂,配置路径映射path => directory
AJP(Apache Jserv protocol)是⼀种基于TCP的⼆进制通讯协议,apache私有协议。
核⼼组件
1、Tomcat启动⼀个Server进程。可以启动多个Server,但⼀般只启动⼀个
2、创建⼀个Service提供服务。可以创建多个Service,但⼀般也只创建⼀个
1)每个Service中,是Engine和其连接器Connector的关联配置
3、可以为这个Server提供多个连接器Connector,这些Connector使⽤了不同的协议,绑定了不同的端⼝。其作⽤就是处理来⾃客户端的不同的连接请求或响应
3、Service内部还定义了Engine,引擎才是真正的处理请求的⼊⼝,其内部定义多个虚拟主机Host
1)Engine对请求头做了分析,将请求发送给相应的虚拟主机
2)如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
3)Engine上的缺省虚拟主机可以修改
4、Host定义虚拟主机,虚拟主机有name名称,通过名称匹配
5、Context定义应⽤程序单独的路径映射和配置
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
tomcat虚拟主机怎么设置<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
1、hosts/DNS域名解析
2、浏览器端的请求被发送到服务端端⼝8080,Tomcat进程监听在此端⼝上。通过侦听的HTTP/1.1 Connector获得此请求。
3、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
4、Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host
5、Engine匹配到名为localhost的Host。即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机
6、localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
7、Host匹配到路径为/test的Context
8、path=/test的Context获得请求/index.jsp,在它的mapping table中寻对应的servlet
9、Context匹配到URL PATTERN为*.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象,作为参数调⽤JspServlet的doGet或doPost⽅法。
10、Context把执⾏完了之后的HttpServletResponse对象返回给Host
11、Host把HttpServletResponse对象返回给Engine
12、Engine把HttpServletResponse对象返回给Connector
13、Connector把HttpServletResponse对象返回给浏览器端
三、tomcat的应⽤部署介绍
1、根⽬录
Tomcat中默认⽹站根⽬录是CATALINA_BASE/webapps/ROOT 在Tomcat中部署主站应⽤程序和其他应⽤程序,和之前WEB服务程序不同。
nginx 假设在nginx中部署2个⽹站应⽤eshop、bbs,假设⽹站根⽬录是/var/www/html,那么部署可以是这样的。 eshop解压缩所有⽂件放到/var/www/html/⽬录下。 bbs的⽂件放在/var/www/html/bbs下。
Tomcat Tomcat中默认⽹站根⽬录是CATALINA_BASE/webapps/ 在Tomcat的webapps⽬录中,有个⾮常特殊的⽬录ROOT,它就是⽹站默认根⽬录。将eshop解压后的⽂件放
到这个ROOT中。 bbs解压后⽂件都放在CATALINA_BASE/webapps/bbs⽬录下。
特别注意:bbs与ROOT在同⼀级平⾏⽬录下。
每⼀个虚拟主机的⽬录都可以使⽤appBase配置⾃⼰的站点⽬录,⾥⾯都可以使⽤ROOT⽬录作为主站⽬录。
2、JSP WebApp⽬录结构
1)主页配置:⼀般指定为index.jsp或index.html 2)WEB-INF/:当前WebApp的私有资源路径,通常存储当前应⽤使⽤的l和l配置⽂件 3)META-INF/:类似于WEB-INF 4)classes/:类⽂件,当前webapp需要的类 5)lib/:当前应⽤依赖的jar包
案例介绍
默认/usr/local/tomcat/l中定义了访问页⾯的顺序
cat /usr/local/tomcat/l
......
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
......
默认的顺序为index.html-->index.htm-->index.jsp
可以在⽹站根⽬录中/usr/local/tomcat/webapps/ROOT/l修改,默认/usr/local/tomcat/l
cat /usr/local/tomcat/webapps/ROOT/l
......
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
......
该⽂件的优先级⾼于/usr/local/tomcat/l⽂件
顺序为index.jsp-->index.html-->index.htm
3、webapp归档格式
.war:WebApp打包
.jar:EJB类打包⽂件
.rar:资源适配器类打包⽂件
.ear:企业级WebApp打包
传统应⽤开发测试后,通常打包为war格式,这种⽂件部署到了Tomcat的webapps下,还可以⾃动展开。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
域名⽹站根路径⾃动解压⾃动部署
4、部署Deploy
部署:将webapp的源⽂件放置到⽬标⽬录,通过l和l⽂件中配置的路径就可以访问该webapp,通过类加载器加载其特有的类和依赖的类到JVM上。
⾃动部署Auto Deploy:Tomcat发现多了这个应⽤就把它加载并启动起来
⼿动部署
冷部署:将webapp放到指定⽬录,才去启动Tomcat
热部署:Tomcat服务不停⽌,需要依赖manager、ant脚本、tcd(tomcat clientdeployer)等⼯具
反部署undeploy:停⽌webapp的运⾏,并从JVM上清除已经加载的类,从Tomcat应⽤⽬录中移除部署的⽂件
启动start:是webapp能够访问
停⽌stop:webapp不能访问,不能提供服务,但是JVM并不清除它
5、简单案例
案例1:添加⼀个⽂件,test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例⼦</title>
</head>
<body>
后⾯的内容是服务器端动态⽣成字符串,最后拼接在⼀起
<%
out.println("hello jsp");
%>
<br>
<%=RequestURL()%>
</body>
</html>
案例2:添加⼀个应⽤模拟部署⼀个应⽤
# cd
常见开发项⽬⽬录组成
# mkdir projects/myapp/{WEB-INF,classes,lib} -pv
mkdir: 已创建⽬录"projects"
mkdir: 已创建⽬录"projects/myapp"
mkdir: 已创建⽬录"projects/myapp/WEB-INF"
mkdir: 已创建⽬录"projects/myapp/classes"
mkdir: 已创建⽬录"projects/myapp/lib"
常见应⽤⾸页,内容就⽤上⾯的test.jsp
# vi projects/myapp/index.jsp
⼿动复制项⽬⽬录到webapps⽬录下去
# cp -r projects/myapp/ /usr/local/tomcat/webapps/
使⽤YourIP:8080/myapp/访问试试看
四、配置⽂件说明
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.JasperListener" />
<Listener className="org.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.ThreadLocalLeakPreventionListener" />
<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="l" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.alm.LockOutRealm">
<Realm className="org.alm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">
<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>
1.1 8005端⼝说明
<Server port="8005" shutdown="SHUTDOWN">
8005是Tomcat的管理端⼝,默认监听在127.0.0.1上。SHUTDOWN这个字符串接收到后就会关闭此Server。
使⽤8005端⼝来关闭tomcat
[root@node1 ~]# ps -ef |grep tomcat
java    149171004:33 ?        00:00:09 /usr/java/default/bin/java -Djava.fig.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize= root    1826017136005:39 pts/000:00:00grep --color=auto tomcat
[root@node1 ~]# telnet 127.0.0.18005
Trying 127.0.
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.
[root@node1 ~]# ps -ef |grep tomcat
root    1829017136005:40 pts/000:00:00grep --color=auto tomcat
这个管理功能建议禁⽤,改shutdown为⼀串猜不出的字符串。
<Server port="8005" shutdown="44ba3c71d57f494992641b258b965f28">
1.2 ⽤户认证及权限
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-
->
<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="l" />
</GlobalNamingResources>
⽤户认证,配置⽂件是l。打开l,我们需要⼀个⾓⾊manager-gui。
<tomcat-users xmlns="/xml"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/>
<user username="ywx" password="123456" roles="manager-gui"/>
</tomcat-users>
Tomcat启动加载后,这些内容是常驻内存的。如果配置了新的⽤户,需要重启Tomcat。
⽤户权限配置
⽂件路径/usr/local/tomcat/webapps/manager/l
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionF
ilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
看正则表达式就知道是本地访问了,由于当前访问地址是,可以修改正则为
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+"
可以访问管理页⾯
1.3 定义server
<Service name="Catalina">
⼀般情况下,⼀个Server实例配置⼀个Service,name属性相当于该Service的ID。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
链接器配置。
redirectPort,如果访问HTTPS协议,⾃动转向这个连接器。但⼤多数时候,Tomcat并不会开启HTTPS,因为Tomcat往往部署在内部,HTTPS性能较差。
<Engine name="Catalina" defaultHost="localhost">
引擎配置。
defaultHost指向内部定义某虚拟主机。缺省虚拟主机可以改动,默认localhost。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
虚拟主机配置。 name必须是主机名,⽤主机名来匹配。
appBase,当前主机的⽹页根⽬录,是相对于CATALINA_HOME,也可以使⽤绝对路径
unpackWARs是否⾃动解压war格式 a
utoDeploy 热部署,⾃动加载并运⾏应⽤
1.4、虚拟主机配置实验
尝试再配置⼀个虚拟主机,并将myapp部署到/data/webapps⽬录下
<Host name="node1.magedu" appBase="/data/webapps/" unpackWARs="true" autoDeploy="true" />
常见虚拟主机根⽬录
# mkdir /data/webapps -pv
mkdir: 已创建⽬录"/data"
mkdir: 已创建⽬录"/data/webapps"
# cp -r ~/projects/myapp/ /data/webapps/ROOT
# pwd
/usr/local/tomcat
# bin/shutdown.sh
# bin/startup.sh
1.5 Context配置
Context作⽤:
1) 路径映射
2) 应⽤独⽴配置,例如单独配置应⽤⽇志、单独配置应⽤访问控制
<Context path="/test" docBase="/data/test" reloadable="false" />
path指的是访问的路径
docBase,可以是绝对路径,也可以是相对路径(相对于Host的appBase)
reloadable,true表⽰如果WEB-INF/classes或META-INF/lib⽬录下.class⽂件有改动,就会将WEB应⽤重新加载,性能消耗很⼤。⽣成环境中,会使⽤false来禁⽤。将~/projects/myapp/下⾯的项⽬⽂件复制到/data/下
# cp -r ~/projects/myapp /data/myappv1
# cd /data
# ln -sv myappv1 test
可以修改⼀下index.jsp好区别⼀下。 Tomcat的配置⽂件l中修改如下
<Host name="www.ywx" appBase="/data/webapps"
unpackWARs="true" autoDeploy="true" >
<Context path="/test" docBase="/data/test" reloadable="false" />
</Host>