企业级web应用服务器--Tomcat(二)

一、Tomcat的文件结构和组成

1、目录结构

bin 服务停止、启动等相关程序和文件

conf 配置文件

lib 库目录

logs 日志目录

webapps 应用程序,应用部署目录

work jsp编译后的结果文件,建议提前预热访问

2、配置文件

注意:配置文件大小写敏感

3、组件

1)组件分层和分类

(1)顶级组件
Server,代表整个Tomcat容器,一台主机可以启动多tomcat实例,需要确保端口不要产生冲突
(2)服务类组件
Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine
(3)连接器组件
Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。
(4)容器类
Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。
(5)内嵌类
可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。
(6)集群类组件
listener、cluster
 
2)tomcat 内部组成

 

 

每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:

顶级组件:Server
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, ...
集群类组件:listener, cluster, ...
 
3)核心组件
Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个
创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
每个Service中,是Engine和其连接器Connector的关联配置
可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同
的端口。其作用就是处理来自客户端的不同的连接请求或响应
Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host
Engine对请求头做了分析,将请求发送给相应的虚拟主机
如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
Engine上的缺省虚拟主机可以修改
Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配
Context 定义应用程序单独的路径映射和配置
 
范例:多个组件关系 conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<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">
<Host name="localhost" appBase="webapps" unpackWARs="true"
autoDeploy="true">
<Context >
<Context />
</Host>
</Engine>
</Service>
</Server>
 
4)tomcat 处理请求过程
假设来自客户的请求为:http://localhost:8080/test/index.jsp
(1)浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1Connector获得此请求。
(2)Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
(3)Engine获得请求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host
(4)Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理
(5)localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
(6)Host匹配到路径为/test的Context
(7)path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet
(8)Context匹配到URL PATTERN为 *.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
(9)Context把执行完了之后的HttpServletResponse对象返回给Host
(10)Host把HttpServletResponse对象返回给Engine
(11)Engine把HttpServletResponse对象返回给Connector
(12)Connector把HttpServletResponse对象返回给浏览器端
 
4、应用部署
1)Tomcat的根目录结构
Tomcat中默认网站根目录是$CATALINA_BASE/webapps/
在Tomcat中部署主站应用程序和其他应用程序,和之前WEB服务程序不同。
 
nginx
假设在nginx中部署2个网站应用eshop、forum,假设网站根目录是/data/nginx/html,那么部署可以是这样的。
eshop解压缩所有文件放到 /data/nginx/html/ 目录下,forum 的文件放在 /data/nginx/html/forum/ 下。
最终网站链接有以下对应关系
http://localhost/ 对应于eshop的应用,即 /data/nginx/html/
http://localhost/forum/ 对应于forum的应用,即/data/nginx/html/forum/
 
Tomcat
Tomcat中默认网站根目录是$CATALINA_BASE/webapps/
在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。
将eshop解压后的文件放到这个$CATALINA_BASE/webapps/ROOT中。
bbs解压后文件都放在$CATALINA_BASE/webapps/forum目录下。
$CATALINA_BASE/webapps下面的每个目录都对应一个Web应用,即WebApp
最终网站链接有以下对应关系
http://localhost/ 对应于eshop的应用WebApp,即$CATALINA_BASE/webapps/ROOT/目录,
http://localhost/forum/ 对应于forum的应用WebApp,即$CATALINA_BASE/webapps/forum/
如果同时存在$CATALINA_BASE /webapps/ROOT/forum ,仍以 $CATALINA_BASE/webapps/forum/优先生效。每一个虚拟主机都可以使用appBase指令配置自己的站点目录,使用appBase目录下的ROOT目录作为主站目录。
 
2)JSP WebApp目录结构
$CATALINA_BASE/webapps下面的每个目录对应的WebApp,可能有以下子目录,但下面子目录是非必
须的
主页配置:默认按以下顺序查找主页文件 index.html,index.htm、index.jsp
WEB-INF/:当前目录WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml
配置文件
META-INF/:类似于WEB-INF,也是私有资源的配置信息,和WEB-INF/目录一样浏览器无法访问
classes/:类文件,当前webapp需要的类
lib/:当前应用依赖的jar包
 
3)主页设置
(1)全局配置实现修改默认主页文件
默认情况下 tomcat 会在$CATALINA_BASE/webapps/ROOT/目录下按以下次序查找文件,找到第一个则进行显示
index.html
index.htm
index.jsp
可以通过修改 $CATALINA_BASE/conf/web.xml 中的下面 <welcome-file-list>标签 内容修改默认页文件
范例: 修改默认主页文件
[root@centos8 tomcat]#pwd
/usr/local/tomcat
[root@centos8 tomcat]#echo '<h1>www.syk.top</h1>' > webapps/ROOT/index.html
[root@centos8 tomcat]#curl http://127.0.0.1:8080/
<h1>www.syk.top</h1>
[root@centos8 tomcat]#tail conf/web.xml
<!-- here, so be sure to include any of the default values that you wish -->
<!-- to use within your application. -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
[root@centos8 tomcat]#vim conf/web.xml
[root@centos8 tomcat]#tail conf/web.xml
<!-- here, so be sure to include any of the default values that you wish -->
<!-- to use within your application. -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
[root@centos8 tomcat]#systemctl restart tomcat
[root@centos8 tomcat]#curl http://127.0.0.1:8080/
(2)WebApp的专用配置文件
将上面主配置文件conf/web.xml中的 <welcome-file-list>标签 内容,复制到/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml中,如下所示:
范例: 针对主站点根目录设置专用配置文件
[root@centos8 tomcat]#vim webapps/ROOT/WEB-INF/web.xml
[root@centos8 tomcat]#cat webapps/ROOT/WEB-INF/web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
<welcome-file-list>
<welcome-file>index.html</welcome-file> #修改三个文件的顺序
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
#配置修改后,无需重启tomcat服务,即可观察首页变化
[root@centos8 tomcat]#curl http://127.0.0.1:8080/
范例: 针对特定APP目录设置专用配置文件
[root@centos8 tomcat]#cp -a webapps/ROOT/WEB-INF/ webapps/magedu/
[root@centos8 tomcat]#echo /usr/local/tomcat/webapps/magedu/test.html >
webapps/magedu/test.html
[root@centos8 tomcat]#tree webapps/magedu/
webapps/magedu/
├── index.htm
├── index.html
├── test.html
└── WEB-INF
└── web.xml
1 directory, 4 files
[root@centos8 tomcat]#cat webapps/magedu/WEB-INF/web.xml
......
<description>
Welcome to Tomcat
</description>
<welcome-file-list>
<welcome-file>test.html</welcome-file> #修改默认页面文件的顺序
<welcome-file>index.htm</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
#注意修改属性
[root@centos8 tomcat]#chown -R tomcat.tomcat webapps/magedu/
[root@centos7 ~]#curl http://www.magedu.org:8080/magedu/
/usr/local/tomcat/webapps/magedu/test.html
配置规则:
webApp的专有配置优先于系统的全局配置修改系统的全局配置文件,需要重新启动服务生效修改 webApp的专有配置,无需重启即可生效。
 
4)应用部署实现
(1)webAPP应用的归档格式
.war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp,html,配置文件等
.jar:EJB类文件的打包压缩类zip格式文件,,包括很多的class文件, 网景公司发明
.rar:资源适配器类打包文件,目前已不常用
.ear:企业级WebApp打包,目前已不常用
传统应用开发测试后,通常打包为war格式,这种文件部署到Tomcat的webapps目录下,并默认会自动解包展开和部署上线。
#conf/server.xml中文件配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
(2)部署方式
部署Deploy:将webapp的源文件放置到目标目录,通过web.xml和context.xml文件中配置的路径就可以访问该webapp,通过类加载器加载其特有的类和依赖的类到JVM上,即:最终用户可以通过浏览器访问该应用
自动部署:Tomcat一旦发现多了一个web应用APP.war包,默认会自动把它解压缩,加载并启动起来
手动部署
       冷部署:将webapp放到指定目录,才去启动Tomcat服务
       热部署:Tomcat服务不停止,需要依赖manager、ant脚本、tcd(tomcat clientdeployer)等工具
反部署undeploy:停止webapp运行,并从JVM上清除已经加载的类,从Tomcat应用目录中移除部署的文件
启动start:是webapp能够访问
停止stop:webapp不能访问,不能提供服务,但是JVM并不清除它
(3)部署webAPP的目录结构
常见开发项目目录组成
#目录结构一般由开发用工具自动生成,以下模拟生成相关目录
mkdir projects/myapp/{WEB-INF,META-INF,classes,lib} -pv
mkdir: 已创建目录 "projects"
mkdir: 已创建目录 "projects/myapp"
mkdir: 已创建目录 "projects/myapp/WEB-INF"
mkdir: 已创建目录 "projects/myapp/META-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/
#注意权限和属性
chown -R tomcat.tomcat /usr/local/tomcat/webapps/myapp
#访问http://YourIP:8080/myapp/
(4)案例
案例一:部署主页目录下的应用webAPP
[root@centos8 tomcat]#vim webapps/ROOT/test.jsp
[root@centos8 tomcat]#cat webapps/ROOT/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>
<%=request.getRequestURL()%>
</body>
</html>
[root@centos8 tomcat]#curl http://127.0.0.1:8080/test.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
hello jsp
<br>
http://127.0.0.1:8080/test.jsp
</body>
</html>
[root@centos8 tomcat]#tree work/Catalina/localhost/ROOT/
work/Catalina/localhost/ROOT/
└── org
└── apache
└── jsp
├── test_jsp.class
└── test_jsp.java
3 directories, 2 files
[root@centos8 tomcat]#
案例二:部署一个子目录的应用webAPP
[root@centos8 tomcat]#pwd
/usr/local/tomcat
[root@centos8 tomcat]#mkdir webapps/app1/
#利用之前实验的文件生成新应用
[root@centos8 tomcat]#cp -p webapps/ROOT/test.jsp webapps/app1/
[root@centos8 tomcat]#chown -R tomcat.tomcat webapps/app1/
[root@centos8 tomcat]#tree webapps/app1/
webapps/testapp1/
└── test.jsp
0 directories, 1 file
[root@centos8 tomcat]#curl http://127.0.0.1:8080/app1/test.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
hello jsp
<br>
<%=request.getRequestURL()%>
</body>
</html>
[root@centos8 tomcat]#tree work/Catalina/localhost/app1/
work/Catalina/localhost/app1/
└── org
└── apache
└── jsp
├── test_jsp.class
└── test_jsp.java
3 directories, 2 files
[root@centos8 tomcat]#
#删除应用
[root@centos8 tomcat]#rm -rf webapps/app1/
[root@centos8 tomcat]#ls webapps/
docs examples host-manager manager ROOT
[root@centos8 tomcat]#ls work/Catalina/localhost/
docs examples host-manager manager ROOT
案例三:自动的应用部署war包
#制作应用的war包文件
[root@centos8 ~]#ls /data/app2/
test.html test.jsp
[root@centos8 ~]#cat /data/app2/test.html
<h1>This is test html </h1>
[root@centos8 ~]#cat /data/app2/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("test jsp");
%>
<br>
<%=request.getRequestURL()%>
</body>
</html>
[root@centos8 ~]#cd /data/app2/
#生成war包文件app2.war,此文件的名称决定了tomcat子目录的名称
[root@centos8 app2]#jar cvf /data/app2.war *
added manifest
adding: test.html(in = 28) (out= 27)(deflated 3%)
adding: test.jsp(in = 329) (out= 275)(deflated 16%)
[root@centos8 app2]#cd /data/app2/
[root@centos8 app2]#ls
test.html test.jsp
[root@centos8 app2]#cd /data/
[root@centos8 data]#ls
app2 app2.war
[root@centos8 data]#file app2.war
app2.war: Java archive data (JAR)
[root@centos8 data]#chown tomcat.tomcat /data/app2.war
#自动应用部署上面的war包
[root@centos8 tomcat]#pwd
/usr/local/tomcat
[root@centos8 tomcat]#ls webapps/
docs examples host-manager manager ROOT
[root@centos8 tomcat]#ls work/Catalina/localhost/
docs examples host-manager manager ROOT
[root@centos8 tomcat]#cp -p /data/app2.war webapps/
#再次查看,tomcat将app2.war自动解压缩
[root@centos8 tomcat]#ll webapps/
total 8
drwxr-x--- 15 tomcat tomcat 4096 Feb 9 11:02 docs
drwxr-x--- 6 tomcat tomcat 83 Feb 9 11:02 examples
drwxr-x--- 5 tomcat tomcat 87 Feb 9 11:02 host-manager
drwxr-x--- 5 tomcat tomcat 103 Feb 9 11:02 manager
drwxr-x--- 3 tomcat tomcat 300 Feb 9 19:59 ROOT
drwxr-x--- 3 tomcat tomcat 55 Feb 9 20:14 app2
-rw-r--r-- 1 tomcat tomcat 862 Feb 9 20:05 app2.war
[root@centos8 tomcat]#ll webapps/app2
total 8
drwxr-x--- 2 tomcat tomcat 44 Feb 9 20:14 META-INF
-rw-r----- 1 tomcat tomcat 28 Feb 9 20:03 test.html
-rw-r----- 1 tomcat tomcat 329 Aug 30 02:30 test.jsp
#work目录会自动生成对应的app2的子目录,但目录内无内容
[root@centos8 tomcat]#tree work/Catalina/localhost/app2/
work/Catalina/localhost/app2/
0 directories, 0 files
#访问jsp文件后,tomcat会自动将jsp转换和编译生成work目录下对应的java和class文件
[root@centos8 tomcat]#curl http://127.0.0.1:8080/app2/test.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
hello jsp
</body>
</html>
[root@centos8 tomcat]#tree work/Catalina/localhost/app2/
work/Catalina/localhost/app2/
└── org
└── apache
└── jsp
├── test_jsp.class
└── test_jsp.java
3 directories, 2 files
[root@centos8 tomcat]#curl http://127.0.0.1:8080/app2/test.html
<h1>This is test html </h1>
[root@centos8 tomcat]#tree work/Catalina/localhost/app2/
work/Catalina/localhost/estapp2/
└── org
└── apache
└── jsp
├── test_jsp.class
└── test_jsp.java
3 directories, 2 files
#自动删除(反部署)
#[root@centos8 tomcat]#rm -f webapps/app2.war
[root@centos8 tomcat]#ls webapps/
docs examples host-manager manager ROOT app2
#过几秒再查看,发现app2目录也随之删除
[root@centos8 tomcat]#ls webapps/
docs examples host-manager manager ROOT
[root@centos8 tomcat]#ls webapps/
docs examples host-manager manager ROOT
[root@centos8 tomcat]#ls work/Catalina/localhost/
docs examples host-manager manager ROOT
 (5)基于WEB的管理Server status和Manager APP实现应用部署
tomcat 提供了基于WEB的管理页面,默认由 tomcat-admin-webapps.noarch包提供相关文件
实现WEB的管理Server status和Manager APP
打开浏览器可以访问tomcat管理的默认管理页面,点击下图两个按钮都会出现下面提示403的错误提示

 

 

默认的管理页面被禁用,启用方法如下 :
        修改conf/conf/tomcat-users.xml
[root@centos8 tomcat]#ls conf/
Catalina context.xml logging.properties tomcat-users.xml
catalina.policy jaspic-providers.xml server.xml tomcat-users.xsd
catalina.properties jaspic-providers.xsd tomcat.conf web.xml
#查看配置信息
[root@centos8 tomcat]#cat conf/server.xml
<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="conf/tomcat-users.xml" /> #由此文件指定授权用户信息
</GlobalNamingResources> 
用户认证,配置文件是conf/tomcat-users.xml。打开tomcat-users.xml,我们需要一个角色manager
gui。
[root@centos8 tomcat]#vim conf/tomcat-users.xml
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
#加下面两行,指定用户和密码
<role rolename="manager-gui"/>
<user username="admin" password="123456" roles="manager-gui"/>
</tomcat-users>
#修改全局配置文件需要重启服务生效
[root@centos8 tomcat]#systemctl restart tomcat 
 
    修改webapps/manager/META-INF/context.xml 
<?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\.CsrfPreve
ntionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
 
查看正则表达式就知道是本地访问了,由于当前访问地址是192.168.x.x,可以修改正则表达式为
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+" 
 
范例:
[root@centos8 tomcat]#vim webapps/manager/META-INF/context.xml
<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|10\.0\.0\.\d+" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apach
e\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.
(?:Linked)?HashMap"/>
</Context>
#修改WebApp的配置无需重启服务即可生效 
#再次通过浏览器访问两个按钮Server Status和Manager App,可以看到以下管理界面,输入前面的用户和密码进行登录

基于WEB应用程序管理器实现APP的部署

web应用程序管理界面可以实现一下功能:

Applications 应用程序管理,可以启动、停止、重加载、反部署、清理过期session 
Deploy 可以热部署,也可以部署war文件。
 
方式一:指定目录部署软件
[root@centos8 ~]#mkdir -p /data/myapp/
[root@centos8 ~]#echo /data/myapp/index.html > /data/myapp/index.html
#按下面信息添写,实现下面链接的访问
http://10.0.0.8:8080/test1/
Context Path (required): 指定通过浏览器访问的虚拟目录
WAR or Directory URL:指定真正存放文件的实际磁盘目录路径

 

#自动将/data/myapp目录下的数据复制到webapps/test1下面
[root@centos8 ~]#tree /usr/local/tomcat/webapps/test1/
/usr/local/tomcat/webapps/test1/
└── index.html
0 directories, 1 file
[root@centos8 ~]#cat /usr/local/tomcat/webapps/test1/index.html
/data/myapp/index.html
方式二:部署war包文件

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-05-18 16:01  一动不动的咸鱼  阅读(121)  评论(0编辑  收藏  举报