应用部署实现
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">
部署方式
部署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并不清除它
部署WebApp的目录结构
常见开发项目目录组成
#目录结构一般由开发用工具自动生成,以下模拟生成相关目录
[root@centos8 tomcat]# 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内部
[root@centos8 tomcat]# vi projects/myapp/index.jsp
#手动复制项目目录到webapps目录下去
[root@centos8 tomcat]# cp -r projects/myapp/ /usr/local/tomcat/webapps/
#注意权限和属性
[root@centos8 tomcat]# chown -R tomcat.tomcat /usr/local/tomcat/webapps/myapp
#访问http://YourIP:8080/myapp/
案例:手动的应用部署
部署主页目录下的应用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
基于WEB的管理Server status和Manager APP实现应用部署
tomcat 提供了基于WEB的管理页面,默认由 tomcat-admin-webapps.noarch包提供相关文件
实现WEB的管理Server status和Manager APP
打开浏览器可以访问tomcat管理的默认管理页面,点击下图两个按钮都会出现下面提示403的错误提示默认的管理页面被禁用,启用方法如下
[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,我们需要一个角色managergui
[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|172..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|172.31.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文件。
方式1: 指定目录部署软件
[root@centos8 ~]# mkdir -p /data/myapp/
[root@centos8 ~]# echo /data/myapp/index.html > /data/myapp/index.html
#按下面信息添写,实现下面链接的访问
http://172.31.0.8:8080/test1/
#自动将/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
方式2: 部署war包文件
常见配置详解
端口8005/tcp 安全配置管理
在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">
</Host>
</Engine>
</Service>
</Server>
<Server port="8005" shutdown="SHUTDOWN">
8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个
字符串,tomcat接收到后就会关闭此Server。
此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现
或者port修改成 0, 会使用随机端口,如:36913
生产环境推荐使用:port设为-1等无效端口,将关闭此功能
此行不能被注释,否则无法启动tomcat服务
范例:
<Server port="8005" shutdown="44ba3c71d57f49xdffsgsfh65f28">
范例:修改8005/tcp端口管理命令
[root@centos8 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port
Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 *:8080 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:*
LISTEN 0 100 *:8009 *:*
[root@centos8 ~]# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN #执行命令关闭tomcat
Connection closed by foreign host.
显示指定的http服务器版本信息
默认不显示tomcat的http的Server头信息, 可以指定tomcat的http的Server头信息为相应的值
#conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" Server="SOME STRING"/>
其它配置
conf/server.xml中可以配置service,connector, Engine,Host等
service配置
一般情况下,一个Server实例配置一个Service,name属性相当于该Service的ID。
<Service name="Catalina">
连接器配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
redirectPort,如果访问HTTPS协议,自动转向这个连接器。但大多数时候,Tomcat并不会开启HTTPS,因为Tomcat往往部署在内部,HTTPS性能较差
引擎配置
<Engine name="Catalina" defaultHost="localhost">
defaultHost 配置
defaultHost指向内部定义某虚拟主机。缺省虚拟主机可以改动,默认localhost。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
多虚拟主机配置
多虚拟主机配置说明
name 必须是主机名,用主机名来匹配
appBase 当前主机的网页根目录,是相对于$CATALINA_HOME ,也可以使用绝对路径
unpackWARs 是否自动解压war格式
autoDeploy 热部署,自动加载并运行应用
虚拟主机配置过程
再添加和配置一个新的虚拟主机,并将myapp部署到/data/webapps目录下
[root@tomcat ~]# vim conf/server.xml
#在文件最后面增加下面内容
<Host name="web1.magedu.org" appBase="/data/webapps/" unpackWARs="True"
autoDeploy="false">
#虚拟主机专有访问日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="web1_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s
%b" />
</Host>
#以下行是自带的不需要修改
</Engine>
</Service>
</Server>
#或者如果不加日志也可以用下面简化写法
<Host name="web1.llongxuan.vip" appBase="/data/webapps/" unpackWARs="True"
autoDeploy="false"/>
准备虚拟主机的数据目录
常见虚拟主机根目录
# [root@tomcat ~]# mkdir /data/webapps/ROOT -pv
#[root@tomcat ~]# chown -R tomcat.tomcat /data/webapps
# [root@tomcat ~]# echo web1.longxuan.vip > /data/webapps/ROOT/index.html
测试
刚才在虚拟主机中主机名定义node1.longxuan.vip,所以需要主机在本机手动配置一个域名解析。
如果是windows,修改在C:WindowsSystem32driversetc下的hosts文件,需要管理员权限。
使用http://web1.longxuan.vip:8080/访问查看
案例:tomcat实现多虚拟主机
[root@centos8 tomcat]# pwd
/usr/local/tomcat
[root@centos8 tomcat]# vim conf/server.xml
[root@centos8 tomcat]# tail conf/server.xml
pattern="%h %l %u %t "%r" %s %b" />
</Host>
#添加了以下四行
<Host name="node1.longxuan.vip" appBase="/data/webapps1">
</Host>
<Host name="node2.longxuan.vip" appBase="/data/webapps2">
</Host>
</Engine>
</Service>
</Server>
#对每个虚拟主机,准备数据
[root@centos8 ~]# mkdir /data/webapps{1,2}/ROOT -pv
mkdir: created directory '/data/webapps1/ROOT'
mkdir: created directory '/data/webapps2/ROOT'
[root@centos8 ~]# cat /data/webapps1/ROOT/index.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>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<br>
<%=request.getRequestURL()%>
</body>
</html>
[root@centos8 ~]# cat /data/webapps2/ROOT/index.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>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<br>
<%=request.getRequestURL()%>
</body>
</html>
#设置权限
[root@centos8 ~]# chown -R tomcat.tomcat /data/webapps{1,2}/
测试
[root@centos8 ~]# curl http://node1.longxuan.vip:8080/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
http://node1.longxuan.vip:8080/
</body>
</html>
[root@centos8 ~]# curl http://node2.longxuan.vip:8080/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
http://node2.mlongxuan.vip:8080/
</body>
</html>
案例:修改tomcat实现多虚拟主机的端口为80
[root@centos8 ~]# vim /usr/local/tomcat/conf/server.xml
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
#注意: 因为以tomcat用户运行,不能直接使用1024以下的端口,需要修改tomcat的运行身份,否则会出现下面错误
[root@centos8 ~]# tail -f /usr/local/tomcat/logs/catalina.out
Caused by: java.net.SocketException: Permission denied
[root@centos8 ~]# vim /lib/systemd/system/tomcat.service
[Service]
.....
#User=tomcat
#Group=tomcat
[root@centos8 ~]# systemctl daemon-reload
[root@centos8 ~]# systemctl restart tomcat
基于web方式的Host Manager虚拟主机管理
可以通过tomcat的管理页面点下面Host Manager按钮进入管理虚拟主机的页面,默认Host Manager 管理页被禁用
允许本机访问配置如下
[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"/> #3.4.4.6添加的内容
<role rolename="admin-gui" /> #添加新的role
<user username="admin" password="123456" roles="manager-gui,admin-gui"/> #再加新role
</tomcat-users>
[root@centos8 tomcat]# systemctl restart tomcat
重启Tomcat后,点击"Host Manager"按钮
允许远程主机访问
但通过远程访问地址仍无法访问Host Manager管理页面
默认无法通过网络远程访问Host Manager管理页面
[root@centos8 tomcat]# vim webapps/host-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|172.31.0.d+" />
<Manager sessionAttributeValueClassNameFilter="java.lang.
(?:Boolean|Integer|Long|Number|String)|org.apach
e.catalina.filters.CsrfPreventionFilter$LruCache(?:$1)?|java.util.
(?:Linked)?HashMap"/>
</Context>
无需重启服务,直接访问,输入前面的用户和密码,即可登录成功
创建新的虚拟主机
可以管理虚拟主机
#创建虚拟主机前,必须先创建相关目录,否则创建虚拟机不成功
[root@centos8 ~]# mkdir /data/node1/ROOT/
[root@centos8 ~]# echo node1.longxuan.vip > /data/node1/ROOT/index.html
[root@centos8 ~]# chown -R tomcat.tomcat /data/node1/
Context 配置
Centext 配置方式
Context作用:
路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能
应用独立配置,例如单独配置应用日志、单独配置应用访问控制
#映射指定路径
<Context path="/test" docBase="/data/test" reloadable="true" />
#映射站点的根目录
<Context path="/" docBase="/data/website" reloadable="true" />
#还可以添加日志等独立的配置
<Context path="/test" docBase="/data/test" reloadable="true" >
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_test_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
说明:
path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径
优先更高
docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)
reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB
应用重新加载。生产环境中,建议使用false来禁用。
Centext实现过程
将~/projects/myapp/下面的项目文件复制到/data/下,可以修改一下index.jsp 区别一下
[root@centos8 ~]# cp -r ~/projects/myapp /data/myapp-v1
[root@centos8 ~]# vim /data/myappv1/index.jsp
[root@centos8 ~]# cd /data
[root@centos8 ~]# ln -sv myapp-v1 test
注意:这里特别使用了软链接,原因方便后期版升级或回滚,如是是版本升级,需要将软链接指向
myappv2,重新启动。如果新版上线后,出现问题,重新修改软链接到上一个版本的目录,并重启,就可以实现回滚
修改conf/server.xml设置context
Tomcat的配置文件server.xml中修改如下,重启Tomcat生效
<Host name="node1.ongxuan.vip" appBase="/data/webapps"
unpackWARs="true" autoDeploy="true" >
<Context path="/test" docBase="/data/test" reloadable="true" />
</Host>
测试
使用http://node1.longxuan.vip:8080/test/
Valve组件
valve(阀门)组件可以定义日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
valve存在多种类型:
定义访问日志:org.apache.catalina.valves.AccessLogValve
定义访问控制:org.apache.catalina.valves.RemoteAddrValve
示例:
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="172.31.0.d+"/>
案例范例:虚拟主机上利用context实现虚拟目录
#在前面范例的基础上实现,继续创建node1.longxuan.vip虚拟主机下的物理子目录
[root@centos8 ~]# mkdir /data/webapps1/app1/
[root@centos8 ~]# echo /data/webapps1/app1/index.html >
/data/webapps1/app1/index.html
[root@centos8 ~]# curl http://node1.longxuan.vip:8080/app1/
/data/webapps1/app1/index.html
#利用context实现node1.longxuan.vip虚拟主机下的虚拟子目录
[root@centos8 tomcat]# vim conf/server.xml
[root@centos8 tomcat]# tail conf/server.xml
</Host>
<Host name="node1.longxuan.vip" appBase="/data/webapps1">
#加下面六行
<Context path="/app1" docBase="/data/app1" reloadable="true" >
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node1.longxuan.vip_app1" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="171.31.0.7"/>
</Context>
</Host>
<Host name="node2.longxuan.vip" appBase="/data/webapps2">
</Host>
</Engine>
</Service>
</Server>
[root@centos8 tomcat]# systemctl restart tomcat
#因数据没有准备好,出现下面错误
[root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
curl: (7) Failed to connect to node1.longxuan.vip port 8080: Connection refused
#准备数据目录
[root@centos8 tomcat]# mkdir /data/app1-v1
[root@centos8 tomcat]# echo /data/app1-v1/index.html > /data/app1-v1/index.html
[root@centos8 tomcat]# ln -s /data/app1-v1/ /data/app1
[root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
curl: (7) Failed to connect to node1.longxuan.vip port 8080: Connection refused
#数据目录准备好,还需要重新启动服务,才能访问
[root@centos8 tomcat]# systemctl restart tomcat
[root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
/data/app1-v1/index.html
[root@centos7 ~]# curl -I http://node1.longxuan.vip:8080/app1/
HTTP/1.1 403
Content-Type: text/html;charset=utf-8
Content-Language: en
Transfer-Encoding: chunked
Date: Tue, 14 Jul 2021 06:48:54 GMT
#可以看到此目录单独的访问日志
[root@centos8 ~]# cat /usr/local/tomcat/logs/node1.magedu.org_app1.2021-06-14.log
172.31.0.8 - - [14/Jul/2021:14:36:01 +0800] "GET /app1/ HTTP/1.1" 200 330
172.31.0.7 - - [14/Jul/2021:14:48:07 +0800] "GET /app1/ HTTP/1.1" 403 618
范例: 基于前面环境,实现软件升级和回滚功能
#升级版本
[root@centos8 tomcat]# mkdir /data/app1-v2
[root@centos8 tomcat]# echo /data/app1-v2/index.html > /data/app1-v2/index.html
[root@centos8 tomcat]# rm -f /data/app1
#删除软链接,仍然可以访问旧版本
[root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
/data/app1-v1/index.html
#重新服务后,出现错误
[root@centos8 tomcat]# systemctl restart tomcat
[root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
curl: (7) Failed to connect to node1.longxuan.vip port 8080: Connection refused
#新建软链接,指向新版,仍需重启服务才生效
[root@centos8 tomcat]# ln -s /data/app1-v2/ /data/app1
[root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
curl: (7) Failed to connect to node1.longxuan.vip port 8080: Connection refused
[root@centos8 tomcat]# systemctl restart tomcat
[root@centos8 tomcat]# curl http://node1.mlongxuan.vip:8080/app1/
/data/app1-v2/index.html
#软件降级或回滚
[root@centos8 tomcat]# rm -f /data/app1
[root@centos8 tomcat]# ln -s /data/app1-v1/ /data/app1
[root@centos8 tomcat]# systemctl restart tomcat
[root@centos8 tomcat]# curl http://node1.longxuan.vip:8080/app1/
/data/app1-v1/index.html