tomcat的部署与实践

关于什么是tomcat,其作用又是啥,我这里就不做过多的解释了,感兴趣的同学可以参考我其他文章或者其他优秀博客。我们这里直入主题。

1.安装前准备

我们先去tomcat官网https://tomcat.apache.org 下载我们需要的tomcat版本。我们这里选择tomcat8.5.50版本,如下图

 点击上面的版本依赖,我们会看到下图,从图中我们可以看到tomcat安装依赖java环境,我们这里下载的版本依赖jdk7或者更高的jdk版本。

 tomcat下载好之后我们通过xftp把包导入到我们的虚拟机上去,接下来用。

在介绍安装之前,我们来看一下我们的系统环境

[root@centos7 conf]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@centos7 conf]# uname -a
Linux centos7.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@centos7 conf]# systemctl stop firewalld.service               #这里是关闭centos7的防火墙
[root@centos7 conf]# systemctl disable firewalld.service 
[root@centos7 conf]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

Feb 11 17:42:40 centos7.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
Feb 11 17:42:43 centos7.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
Feb 11 18:40:23 centos7.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon...
Feb 11 18:40:23 centos7.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.
[root@centos7 conf]# setenforce 0                                   #这里是临时关闭selinux
[root@centos7 conf]# getenforce
Permissive
[root@centos7 conf]#

好了接下我们介绍tomcat的安装方式,目前tomcat主流的安装方式是yum安装和压缩包安装的方式。下面我就来讲解这两种方式;

2.安装方式:

1.yum安装的方式:

从上面的介绍我们可以看出tomcat的部署依赖java环境,不同版本的依赖不同版本的jdk版本,我这里通过yum的方式安装tomcat(默认安装的是tomcat7左右的版本,这个在下面会验证),安装的时候会默认帮我们解决java环境依赖,不过这里他们帮我们配置的是openjdk版本的,我这里不太建议使用openjdk,我这里一般都会先配置好oracle jdk版本的java环境,具体怎么配置,可以参考我的https://www.cnblogs.com/qingbaizhinian/p/12201073.html这篇文章。好了,我们下面来演示怎么用yum源部署tomcat。

[root@centos7 ~]# yum install tomcat tomcat-admin-webapps tomcat-webapps -y (这里用yum源部署tomcat.不止要安装tomcat包,还需要安装管理包tomcat-admin-webapps tomcat-webapps

这里的管理包的作用我们后面有机会在讲,好了我们接下来验证一下yum源安装的tomcat是什么版本。

 从这里我们看出yum源安装的是tomcat7左右的版本,版本较老。所以一般我不太建议yum源安装tomcat,这是根据个人喜好来的。好了我们现在卸载掉yum源安装的tomcat,卸载方法可以参考我其他文章。

2.压缩包安装的方式:

下面我来介绍一下tomcat的主流安装方式,通过官方的压缩包进行安装。

上面我已经在官网下载好压缩包,并以导入虚拟机了,我们现在来看一下。

 好了我们开始我们tomcat的安装,步骤如下。

#解压安装tomcat
[root@centos7 ~]# tar -xf apache-tomcat-8.5.50.tar.gz -C /usr/local/ (-C参数可以指定安装目录) [root@centos7 ~]# ln -sv /usr/local/apache-tomcat-8.5.50/ /usr/local/tomcat

#配置Tomcat环境 [root@centos7
~]# echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile [root@centos7 ~]# source /etc/profile
#对jdk及Tomcat安装目录递归授权root
[root@centos7 ~]# chown -R root.root /usr/java/default /usr/local/tomcat/

#检查环境变量配置情况
[root@centos7 ~]# cat /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
[root@centos7 ~]# tail -1 /etc/profile
export TOMCAT_HOME=/usr/local/tomcat

检查tomcat是否安装成功

[root@centos7 ~]# /usr/local/tomcat/bin/version.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/default
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.50
Server built:   Dec 7 2019 19:19:46 UTC
Server number:  8.5.50.0
OS Name:        Linux
OS Version:     3.10.0-957.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_211-b12
JVM Vendor:     Oracle Corporation
[root@centos7 ~]# 

3.tomcat目录介绍

[root@centos7 ~]# cd /usr/local/tomcat/
[root@centos7 tomcat]# tree -L 1
.
├── bin                            #用以启动,关闭Tomcat或者其他功能的脚本(.bat文件和.sh文件)                   
├── BUILDING.txt
├── conf                           # tomcat 配置文件存放目录
├── CONTRIBUTING.md
├── lib                            # web应用调用的jar包存放路径
├── LICENSE
├── logs                           #Catalina和其他Web应用程序的日志文件
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── temp                           # 存放临时文件
├── webapps
└── work                           # 存放编译产生的.java 与 .class文件

7 directories, 7 files
webapps目录介绍 [root@centos7 tomcat]# cd webapps
/ [root@centos7 webapps]# ll total 4 drwxr-x---. 15 root root 4096 Feb 9 01:36 docs # tomcat 帮助文档 drwxr-x---. 6 root root 83 Feb 9 01:36 examples # web应用实例 drwxr-x---. 5 root root 87 Feb 9 01:36 host-manager # 主机管理 drwxr-x---. 5 root root 103 Feb 9 01:36 manager # 管理 drwxr-x---. 3 root root 283 Feb 9 01:36 ROOT # 默认站点根目录 Tomcat配置文件目录介绍(conf)

4.Tomcat的启动

启动程序:/usr/local/tomcat/bin/startup.sh
关闭程序:/usr/local/tomcat/bin/shutdown.sh

[root@centos7 conf]# /usr/local/tomcat/bin/startup.sh  #程序启动
Using CATALINA_BASE:   /usr/local/tomcat    #检查环境变量CATALINA_BASE
Using CATALINA_HOME:   /usr/local/tomcat    #检查环境变量CATALINA_HOME
Using CATALINA_TMPDIR: /usr/local/tomcat/temp   #检查环境变量CATALINA_TMPDIR
Using JRE_HOME:        /usr/local/jdk   #检查环境变量JRE_HOME
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@centos7 conf]# netstat -antup | grep java
tcp        0      0 :::8080                     :::*                        LISTEN      1352/java           
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      1352/java           
tcp        0      0 :::8009                     :::*                        LISTEN      1352/java           

访问网站

网址:192.168.195.166:8080(访问时请注意关闭iptables,这个前面我在系统环境那里已经做了)

查看Tomcat的日志

5.Tomcat管理功能使用

测试功能,生产环境不要用:
Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的Web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。

[root@centos7 ~]# vim /usr/local/tomcat/conf/tomcat-users.xml
.......
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>      #这里的账号和密码不需要在系统中创建的。
  </tomcat-users>     #在此行前加入上面三行,还需要注意取消注释。
.....
tomcat8.5开始还需要改下面几个文件。
编辑/usr/local/tomcat/webapps/manager/META-INF/context.xml和/usr/local/tomcat/webapps/host-manager/META-INF/context.xml(/usr/local/tomcat是tomcat程序的目录)这两个文件,将其中的这一行注释掉
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />

上面的操作的配置文件里内容截图如下

 

 接下来重启tomcat就可以了,重启步骤应该就不用在讲了吧。重启后在浏览器里输入http://192.168.195.166:8080/manager/status进入tomcat的管理界面,然后输入我们在配置文件中配的账号和密码。如下截图是没做配置和配置好的界面。

 配置后

6.Tomcat主配置文件Server.xml详解

1.Server.xml组件类别

  • 顶级组件:位于整个配置的顶层,如server。
  • 容器类组件:可以包含其他组件的组件,如service,engine,host,context
  • 连接器组件:连接用户请求至tomcat,如connector。
  • 被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve,logger。
<server>
     <service>
     <connector />
     <engine>
     <host>
     <context></context>
     </host>
     <host>
     <context></context>
     </host>
     </engine>
     </service>
</server>

2.组件介绍

组件名称

功能介绍

engine

核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host

host

类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。

context

定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的根目录,类似于httpdalias,其还能为webapp指定额外的属性,如部署方式等。

connector

接收用户请求,类似于httpdlisten配置监听端口的。

service(服务)

connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engineservice内部有两个connector,一个engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service内部可以有多个connector

server

表示一个运行于JVM中的tomcat实例。

Valve

阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve)

logger

日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。

realm

可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealmMemoryRealmJDBCRealm

UserDatabaseRealm

使用JNDI自定义的用户认证库。

MemoryRealm

认证信息定义在tomcat-users.xml中。

JDBCRealm

认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。

Tomcat内部组成图如下

 

<?xml version='1.0' encoding='utf-8'?>
<!--
<Server>元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素.
    port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
    shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置
-->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.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="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <!--service服务组件-->
  <Service name="Catalina">
    <!--
    connector:接收用户请求,类似于httpd的listen配置监听端口.
        port指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
        address:指定连接器监听的地址,默认为所有地址(即0.0.0.0)
        protocol连接器使用的协议,支持HTTP和AJP。AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议)。
        minProcessors服务器启动时创建的处理请求的线程数
        maxProcessors最大可以创建的处理请求的线程数
        enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
        redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
        acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
        connectionTimeout指定超时的时间数(以毫秒为单位)
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <!--engine,核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host
        defaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
    -->
    <Engine name="Catalina" defaultHost="localhost">
      <!--Realm表示存放用户名,密码及role的数据库-->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <!--
      host表示一个虚拟主机
        name指定主机名
        appBase应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps" ,相对于CATALINA_HOME而言的,也可以写绝对路径。
        unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
        autoDeploy:在tomcat启动时,是否自动部署。
        xmlValidation:是否启动xml的校验功能,一般xmlValidation="false"。
        xmlNamespaceAware:检测名称空间,一般xmlNamespaceAware="false"-->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <!--
        Context表示一个web应用程序,通常为WAR文件
            docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。
            path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****
            reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序
        -->
        <Context path="" docBase="" debug=""/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

7.tomcat的主页实验

未做主页实验前访问的页面:

 接下来我们写个html文件,操作如下

[root@centos7 ~]# cd /usr/local/tomcat/webapps/ROOT/       
[root@centos7 ROOT]# echo "<h1>hello,Stranger</h1>" > index.html

接下来我们在访问:

 这里我们会有一个疑问,为什么我写了html文件,就把之前的页面文件顶替了,原因如下

[root@centos7 ROOT]# ll
total 184
-rw-r-----. 1 root root 27235 Dec  8 03:23 asf-logo-wide.svg
-rw-r-----. 1 root root   713 Dec  8 03:21 bg-button.png
-rw-r-----. 1 root root  1918 Dec  8 03:21 bg-middle.png
-rw-r-----. 1 root root  1401 Dec  8 03:21 bg-nav.png
-rw-r-----. 1 root root  3103 Dec  8 03:21 bg-upper.png
-rw-r-----. 1 root root 21630 Dec  8 03:21 favicon.ico
-rw-r--r--  1 root root    24 Feb 12 18:32 index.html
-rw-r-----. 1 root root 12219 Dec  8 03:23 index.jsp
-rw-r-----. 1 root root  7136 Dec  8 03:23 RELEASE-NOTES.txt
-rw-r-----. 1 root root  5581 Dec  8 03:23 tomcat.css
-rw-r-----. 1 root root  2066 Dec  8 03:21 tomcat.gif
-rw-r-----. 1 root root  5103 Dec  8 03:21 tomcat.png
-rw-r-----. 1 root root  2376 Dec  8 03:21 tomcat-power.gif
-rw-r-----. 1 root root 67795 Dec  8 03:23 tomcat.svg
drwxr-x---. 2 root root    21 Feb 12 18:41 WEB-INF
[root@centos7 ROOT]# ll WEB-INF/     
total 4
-rw-r-----. 1 root root 1227 Dec  8 03:23 web.xml                      #这里是每个webapp自己的部署方式,
[root@centos7 ROOT]# tail /usr/local/tomcat/conf/web.xml               #这个就是所有webapp的部署方式。相当于全局配置,
  <!-- 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—INF下的web.xml
里,因为这里不建议改全局配置,然后改一下顺序,把index.jsp放上面,在访问一下。
</web-app> [root@centos7 ROOT]#

改了相关配置后,我们在访问,如果没变,需要我们重启一下tomcat,一般不用重启。

 从这里我们可以看到刚刚改配置的作用了吧。

8.模拟部署一个应用 

# 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"

常见应用首页,
# vi projects/myapp/index.jsp
手动复制项目目录到webapps目录下去
# cp -r projects/myapp/ /usr/local/tomcat/webapps/
使用http://YourIP:8080/myapp/访问试试看

[root@centos7 ~]# mkdir projects/myapp/{WEB-INF,classes,lib} -pv
[root@centos7 ~]# vim projects/myapp/index.jsp
[root@centos7 ~]# cat projects/myapp/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>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out.println("hello jsp");
%>
</body>
</html>[root@centos7 ~]# 

 1.虚拟主机的配置

在生产工作中经常需要几个web项目部署在一台服务器上,但是不可能为了访问不同的项目还要加上端口吧,这个时候tomcat的虚拟主机就起到作用了,可以通过不同的url达到访问不同的项目。那tomcat的虚拟主机怎么配呢,具体配置如下。

修改tomcat的主配置文件,添加一个虚拟主机,修改如下:

 根据上图修改的虚拟主机配置,我们创建虚拟主机根目录。

[root@centos7 ~]# mkdir /data/webapps -pv
mkdir: created directory ‘/data/webapps’
[root@centos7 ~]# cp -r /usr/local/tomcat/webapps/myapp/ /data/webapps/ROOT      #这里是借用上面的目录。
[root@centos7 ~]# vim /data/webapps/ROOT/index.jsp                               #为了区分做出修改
[root@centos7 ~]# cat /data/webapps/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>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out.println("welcome qingbai1");
%>
</body>
</html>

然后我们在自己的windows上修改自己的Host文件添加域名。

 2.context的配置

appBase 放的是应用目录,放java的war包,放在appBase下,则war包会自动解压;

如果我们的应用放在docBase下,不能放war包,把war包的内容解压后放在docBase定义应用存放的路径下。(其实二者都是定义放网页文件的的路径,只是 一个需要解压一个不需要而已),一般通过通过docBase来定义网站的根目录,讲明白一点就是docBase可以定义目录直接通过ip和端口访问,appBase定义目录的只能通过Ip加端口加定义目录下指定目录进行访问,如果直接定义appBase,然后通过ip加端口访问只会报404错误。

 

原文地址:https://www.cnblogs.com/qingbaizhinian/p/12274326.html