应用部署

应用部署前言

  • 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/ROOT

  • eshop解压缩所有文件放到 $CATALINA_BASE/webapps/ROOT 目录下
  • forum的文件放到 $CATALINA_BASE/webapps/forum/ 目录下

最终网页连接和目录的对应关系:

http://localhost/ #即对应eshop的应用,对应的目录是:$CATALINA_BASE/webapps/ROOT

http://localhost/forum/ #即对应forum的应用,对应的目录是:$CATALINA_BASE/webapps/forum/

其它说明:

  • $CATALINA_BASE 就是 tomcat 的家目录,比如:/usr/local/tomcat/

  • 如果同时存在 $CATALINA_BASE/webapps/forum/ 和 $CATALINA_BASE/webapps/ROOT/forum/,则以 $CATALINA_BASE/webapps/forum/优先生效

  • 每一个虚拟主机都可以使用appBase指令配置自己的站点目录,使用appBase目录下的ROOT目录作为主站目录

部署目录说明

  • Tomcat 中默认网站根目录是:$CATALINA_BASE/webapps/

  • $CATALINA_BASE: /usr/local/tomcat(即tomcat安装时的根目录)

  • $CATALINA_BASE/webapps/ 下面的每个目录都是对应的 WebApp

  • WebApp目录中,可能有以下子目录,但下面子目录是非必须的

    • WEB-INF/:当前目录WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml配置文件
    • META-INF/:类似于WEB-INF/,也是私有资源的配置信息,和WEB-INF/目录一样浏览器无法访问
    • classes/:类文件,当前webapp需要的类
    • lib/:当前应用依赖的jar包

部署目录规划

  • 实际生产环境参考范例
  • /data/tomcat/tomcat_appdir 保存web压缩包的目录
    • 如:
      • myapp_2022-03-06-22:06:43.tar.gz
      • myapp_2022-03-08-23:06:32.tar.gz
      • myapp.war 等…
  • /data/tomcat/tomcat_webdir 保存web压缩包解压后的目录,也就是java代码的实际存放目录
    • 如:
      • myapp_2022-03-06-22:06:43
      • myapp_2022-03-08-23:06:32 等…
  • /data/tomcat/tomcat_webapps tomcat加载目录,在server.xml定义,等价于/usr/local/tomcat/webapps/,主要是将此目录下的app以软连接的方式指向/data/tomcat/tomcat_webdir中的版本
    • 如:
      • /usr/local/tomcat/webapps/myapp –> /data/tomcat/tomcat_webdir/myapp_2022-03-08-23:06:32

目录创建方式

[root@tomcat-node1 ~]# mkdir -p /data/tomcat/tomcat_{appdir,webapps,webdir}

server.xml配置

[root@tomcat-node1 ~]# vim /usr/local/tomcat/conf/server.xml 
...
      <Host name="myapp"  appBase="/data/tomcat/tomcat_webapps">
...

主页部署

主页存放位置和查找次序说明

  • 默认情况下 tomcat 会在 $CATALINA_BASE/webapps/ROOT/ 目录下寻找主页文件
  • 查找次序如下:
    1. index.html
    2. index.htm
    3. index.jsp
  • 可以通过修改 $CATALINA_BASE/conf/web.xml 文件中的 标签中的内容修改默认页面文件查找次序

修改默认主页查找次序

全局修改默认主页

  • 优先级低于webAPP的专有配置
  • 需重启tomcat服务才能生效(测试发现 Tomcat/8.5.73 无需重启也可生效)
#准备测试页面
[root@centos8 ~]# echo 'index.jsp' > /usr/local/tomcat/webapps/ROOT/index.jsp 
[root@centos8 ~]# echo 'index.html' > /usr/local/tomcat/webapps/ROOT/index.html 
[root@centos8 ~]# echo 'index.htm' > /usr/local/tomcat/webapps/ROOT/index.htm

#修改前测试
[root@client ~]#curl 10.0.0.8:8080
index.html

#修改全局配置文件
[root@centos8 ~]# vim /usr/local/tomcat/conf/web.xml 
...
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>       
    </welcome-file-list>
...

#修改后测试
[root@client ~]#curl 10.0.0.8:8080
index.jsp

webAPP专有配置修改默认主页

  • 优先级高于全局配置
  • 无需重启tomcat即可生效
#准备测试页面
[root@centos8 ~]#echo 'index.jsp' > /usr/local/tomcat/webapps/WEB-INF/index.jsp 
[root@centos8 ~]#echo 'index.html' > /usr/local/tomcat/webapps/WEB-INF/index.html 
[root@centos8 ~]#echo 'index.htm' > /usr/local/tomcat/webapps/WEB-INF/index.htm

#修改前测试
[root@client ~]#curl 10.0.0.8:8080/WEB-INF
index.jsp

#修改webAPP专有配置
[root@centos8 ~]# vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml 
...
#在文件倒数第二行添加添加
    <welcome-file-list>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>

#测试访问
[root@client ~]#curl 10.0.0.8:8080/WEB-INF
index.htm

#全局配置如下:
#可以发现应用独立配置优先级高于全局配置
[root@centos8 ~]# vim /usr/local/tomcat/conf/web.xml 
...
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>       
    </welcome-file-list>
...

应用部署

将webapp的源文件放置到目标目录,通过web.xml和context.xml文件中配置的路径就可以访问该webapp,通过类加载器加载其特有的类和依赖的类到JVM上,最终实现用户可以通过浏览器访问该应用

应用的归档格式

  • *.war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源(如:jsp、html、配置文件等)
  • *.jar:EJB类文件的打包压缩类zip格式文件,包括很多

自动部署

  • Tomcat一旦发现多了一个web应用APP.war包后,默认会自动把它解压缩,加载并启动起来

  • **自动部署 和 自动反部署依赖于以下配置:**此配置也是默认值

  • 自动部署在生产中通常都是关闭的

    • 设置 unpackWARs=“false” autoDeploy=“false"后重启tomcat服务,将不会再进行自动部署和自动反部署,生产中为了防止被植入木马等恶意程序,因此我们要关闭自动部署
    [root@centos8 ~]# cd /usr/local/tomcat/
    [root@centos8 tomcat]# pwd
    /usr/local/tomcat
    [root@centos8 tomcat]# vim conf/server.xml 
    ...
          <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
    ...

实战案例:自动部署war包

准备war包

#准备war包中的文件
[root@centos8 ~]# mkdir /data/app
[root@centos8 ~]# cat /data/app/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

#打成war包(war包的名称决定了tomcat子目录的名称)
[root@centos8 app]# cd /data/app/
[root@centos8 app]# jar cvf app.war *
added manifest
adding: index.jsp(in = 118) (out= 103)(deflated 12%)
[root@centos8 app]# ls
app.war  index.jsp
[root@centos8 app]# file app.war 
app.war: Java archive data (JAR)

#修改war包权限
[root@centos8 app]# chown tomcat.tomcat app.war 

实现自动部署war包

#部署前查看
[root@centos8 ~]# ll /usr/local/tomcat/webapps/ -t
total 4
drwxr-x---  6 tomcat tomcat  114 Jan  1 01:40 manager
drwxr-x---  6 tomcat tomcat   79 Jan  1 01:40 host-manager
drwxr-x---  7 tomcat tomcat   99 Jan  1 01:40 examples
drwxr-x--- 15 tomcat tomcat 4096 Jan  1 01:40 docs
drwxr-x---  3 tomcat tomcat  223 Jan  1 01:40 ROOT

#将制作的war包拷贝到webapps目录下
[root@centos8 ~]# cp -a /data/app/app.war /usr/local/tomcat/webapps/
[root@centos8 ~]# ll /usr/local/tomcat/webapps/ -t
total 8
drwxr-x---  3 tomcat tomcat   39 Jan  2 19:13 app #自动解压缩的war包,和war包同名
-rw-r--r--  1 tomcat tomcat  555 Jan  2 19:08 app.war #拷贝的war包
drwxr-x---  6 tomcat tomcat  114 Jan  1 01:40 manager
drwxr-x---  6 tomcat tomcat   79 Jan  1 01:40 host-manager
drwxr-x---  7 tomcat tomcat   99 Jan  1 01:40 examples
drwxr-x--- 15 tomcat tomcat 4096 Jan  1 01:40 docs
drwxr-x---  3 tomcat tomcat  223 Jan  1 01:40 ROOT

#测试访问
[root@client ~]#curl 10.0.0.18:8080/app/

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
[root@client ~]#curl 10.0.0.18:8080/app/ -I
HTTP/1.1 200 
Set-Cookie: JSESSIONID=83A175C613AA5E389C50AB6CC21ECECB; Path=/app; HttpOnly
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 02 Jan 2022 11:15:44 GMT

#还会生成一些其它文件相关
[root@centos8 ~]# tree /usr/local/tomcat/webapps/app
/usr/local/tomcat/webapps/app
├── index.jsp
└── META-INF
    ├── MANIFEST.MF
    └── war-tracker

手动部署

手动部署分类

  • 冷部署:

    • 部署前停止tomcat服务,然后将webapp放到指定目录,最后再去启动tomcat服务
  • 热部署:

    • tomcat服务不停止,需要依赖manager、ant脚本、tcd(tomcat client deployer)等工具

实战案例:手动部署

#手动部署前
[root@centos8 ~]# ll -t /usr/local/tomcat/webapps/
total 4
drwxr-x---  6 tomcat tomcat  114 Jan  1 01:40 manager
drwxr-x---  6 tomcat tomcat   79 Jan  1 01:40 host-manager
drwxr-x---  7 tomcat tomcat   99 Jan  1 01:40 examples
drwxr-x--- 15 tomcat tomcat 4096 Jan  1 01:40 docs
drwxr-x---  3 tomcat tomcat  223 Jan  1 01:40 ROOT

#手动部署
[root@centos8 ~]# unzip /data/app/app.war -d /usr/local/tomcat/webapps/app
Archive:  /data/app/app.war
   creating: /usr/local/tomcat/webapps/app/META-INF/
  inflating: /usr/local/tomcat/webapps/app/META-INF/MANIFEST.MF  
  inflating: /usr/local/tomcat/webapps/app/index.jsp  
[root@centos8 ~]# chown -R tomcat.tomcat /usr/local/tomcat/webapps/app

#查看结果
total 4
drwxr-xr-x  3 tomcat tomcat   39 Jan  2 19:55 app
drwxr-x---  6 tomcat tomcat  114 Jan  1 01:40 manager
drwxr-x---  6 tomcat tomcat   79 Jan  1 01:40 host-manager
drwxr-x---  7 tomcat tomcat   99 Jan  1 01:40 examples
drwxr-x--- 15 tomcat tomcat 4096 Jan  1 01:40 docs
drwxr-x---  3 tomcat tomcat  223 Jan  1 01:40 ROOT

反部署

  • 即移除部署(回滚)

  • 停止webapp运行,并从JVM上清除已经加载的类,再从tomcat应用目录中移除部署的文件

自动反部署

#反部署前
[root@centos8 ~]# ll /usr/local/tomcat/webapps/ -t
total 8
drwxr-x---  3 tomcat tomcat   39 Jan  2 19:13 app
-rw-r--r--  1 tomcat tomcat  555 Jan  2 19:08 app.war
drwxr-x---  6 tomcat tomcat  114 Jan  1 01:40 manager
drwxr-x---  6 tomcat tomcat   79 Jan  1 01:40 host-manager
drwxr-x---  7 tomcat tomcat   99 Jan  1 01:40 examples
drwxr-x--- 15 tomcat tomcat 4096 Jan  1 01:40 docs
drwxr-x---  3 tomcat tomcat  223 Jan  1 01:40 ROOT

#删除目录中的war包
[root@centos8 ~]# rm -f /usr/local/tomcat/webapps/app.war 

#查看结果(app目录也随之删除)
[root@centos8 ~]# ll /usr/local/tomcat/webapps/ -t
total 4
drwxr-x---  6 tomcat tomcat  114 Jan  1 01:40 manager
drwxr-x---  6 tomcat tomcat   79 Jan  1 01:40 host-manager
drwxr-x---  7 tomcat tomcat   99 Jan  1 01:40 examples
drwxr-x--- 15 tomcat tomcat 4096 Jan  1 01:40 docs
drwxr-x---  3 tomcat tomcat  223 Jan  1 01:40 ROOT