文章 78
评论 0
浏览 8357
1-Tomcat 基础功能

1-Tomcat 基础功能

1 Tomcat 基础功能

1.1 JDK

1.1.1 JDK和JRE

clipboard.png

Java SE API: Java 基础类库开发接口

JRE:Java Runtime Environment缩写,指Java运行时环境, 包含 JVM + Java核心类库

JDK:Java Development Kit,即 Java 语言的软件开发工具包,JDK协议基于 JRL(JavaResearchLicense)协议

clipboard.png

1.1.2 Oracle JDK版本

收费

从2019年1月份开始,Oracle JDK 开始对 Java SE 8 之后的版本开始进行商用收费,确切的说是8u201/202 之后的版本。如果你用 Java 开发的功能如果是用作商业用途的,如果还不想花钱购买的话,能免费使用的最新版本是 8u201/202。当然如果是个人客户端或者个人开发者可以免费试用Oracle JDK 所有的版本。

发版方式

在 JDK 9 发布之前,Oracle 的发版策略是以特性驱动的,只有重大的特性改变才会发布大版本,比如JDK 7 到 JDK 8,中间会发多个更新版本。而从 JDK 9 开始变为以时间驱动的方式。发布周期为6月一个大版本,比如 JDK 9 到 JDK 10,3个月一次补丁版,3年一个 LTS(长期支持版本)。

1.1.3 OpenJDK

OpenJDK是Sun公司采用GPL v2协议发布的JDK开源版本,于2009年正式发布。

官方网站:https://openjdk.java.net/projects/jdk6/

OpenJDK 7是基于JDK7的beta版开发,但为了也将Java SE 6开源,从OpenJDK7的b20构建反向分支开发,从中剥离了不符合Java SE 6规范的代码,发布OpenJDK 6。所以OpenJDK6和JDK6没什么关系,只是API兼容而已

OpenJDK使用GPL v2可以用于商业用途。目前由红帽维护。OpenJDK也有在其基础上的众多发行版,比如阿里的Dragonwell。

相对来说,Oracle jDK具有更好的响应能力和JVM性能,更加稳定。

1.1.4 二进制安装JDK

#脚本
JDK_FILE='jdk-8u281-linux-x64.tar.gz'
install_dir='/usr/local/'

install_jdk(){
[ -f $JDK_FILE ] || { echo "jdk压缩包不存在";exit; }
[ -h $install_dir/jdk ] && { echo "jdk已经安装";exit; }
tar xvf $JDK_FILE -C $install_dir
jdk_dir=`ls $install_dir | grep 'jdk'`
cd $install_dir
ln -s $jdk_dir jdk
echo "export JAVA_HOME=${install_dir}/jdk" >/etc/profile.d/jdk.sh
echo 'export PATH=$PATH:$JAVA_HOME/bin' >>/etc/profile.d/jdk.sh
echo 'export JRE_HOME=$JAVA_HOME/jre' >>/etc/profile.d/jdk.sh
echo 'export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/' >>/etc/profile.d/jdk.sh
}

1.2 安装 Tomcat

1.2.1 基于包安装 Tomcat

1.2.1.1 CentOS 包安装

#CentOS 8 包仓库中目前还没有提供tomcat相关包
[root@centos8 ~]#yum list tomcat
#CentOS 7 yum仓库源中自带的Tomcat 7.0版本安装,此方式安装tomcat版本较低,不推荐
[root@centos7 ~]#yum list tomcat*
#Ubuntu安装 tomcat
[root@ubuntu1804 ~]#apt -y install tomcat8 tomcat8-admin tomcat8-docs

1.2.2 二进制安装 Tomcat

CentOS 7 的yum源的tomcat版本老旧,而CentOS8 yum源里无tomcat

目前比较主流的Tomcat是8.5.X版本,推荐从Apache官网下载二进制tomcat包进行安装,此为生产常用方式

1.2.2.1 下载并安装

注意: 安装tomcat 前必须先部署JDK

官方和镜像站点下载:

https://tomcat.apache.org/download-80.cgi
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/

范例:二进制部署脚本

#安装JDK
install_jdk(){
#变量可自定义
JDK_FILE='jdk-8u281-linux-x64.tar.gz'
install_dir='/usr/local/'

[ -d $install_dir ] || mkdir ${install_dir} -pv
[ -f $JDK_FILE ] || { echo "jdk压缩包不存在";exit; }
java -version &>/dev/null && { echo "jdk已经安装";exit; }
tar xf $JDK_FILE -C $install_dir
jdk_dir=`ls $install_dir | grep 'jdk'`
cd $install_dir
ln -s $jdk_dir jdk
echo "export JAVA_HOME=${install_dir}/jdk" >/etc/profile.d/jdk.sh
echo 'export PATH=$PATH:$JAVA_HOME/bin' >>/etc/profile.d/jdk.sh
echo 'export JRE_HOME=$JAVA_HOME/jre' >>/etc/profile.d/jdk.sh
echo 'export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/' >>/etc/profile.d/jdk.sh
}



install_tomcat(){
#变量可自定义
tomcat_file='apache-tomcat-8.5.64.tar.gz'
install_dir_to='/usr/local/'
dir=`pwd`
[ -f $tomcat_file ] || { echo "tomcat二进制压缩包不存在";exit; }
[ -d $install_dir_to ] || mkdir -p $install_dir_to
[ -h $install_dir_to/tomcat ] && { echo "tomcat已经安装";exit; }
java -version &>/dev/null || { install_jdk;. /etc/profile.d/jdk.sh; }
cd $dir
tar xf $tomcat_file  -C $install_dir_to
tomcat_dir=`ls $install_dir_to | grep tomcat`
cd $install_dir_to
ln -s $tomcat_dir tomcat
echo "PATH=$install_dir_to/tomcat/bin:\$PATH" >/etc/profile.d/tomcat.sh
id tomcat &>/dev/null || useradd -r -s /sbin/nologin tomcat
jdk_dir=`which java | sed -rn 's/(.*)(\/bin\/java)$/\1/p'`
cat >>$install_dir_to/tomcat/conf/tomcat.conf<<EOF
JAVA_HOME=$jdk_dir
JER_HOME=$jdk_dir/jre
EOF
chown -R tomcat.tomcat $install_dir_to/tomcat/
cat >/lib/systemd/system/tomcat.service<<EOF
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target 

[Service]
Type=forking
EnvironmentFile=$install_dir_to/tomcat/conf/tomcat.conf
ExecStart=$install_dir_to/tomcat/bin/startup.sh
ExecStop=$install_dir_to/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
}
install_tomcat

tomcat启动

#启动tomcat
[10:40:45 root@tomcat ~]#startup.sh 
#查看端口
[10:41:33 root@tomcat ~]#ss -ntl
State     Recv-Q    Send-Q            Local Address:Port       Peer Address:Port    
LISTEN    0         128                     0.0.0.0:111             0.0.0.0:*       
LISTEN    0         128                     0.0.0.0:22              0.0.0.0:*       
LISTEN    0         1            [::ffff:127.0.0.1]:8005                  *:*       
LISTEN    0         128                        [::]:111                [::]:*       
LISTEN    0         100                           *:8080                  *:*       
LISTEN    0         128                        [::]:22                 [::]:*  
#查看进程是以root启动的
[root@centos8 ~]#ps aux|grep tomcat
#关闭tomcat
[10:41:35 root@tomcat ~]#shutdown.sh
#或者以下也可以,指定10s后停止,默认5s
[root@centos8 ~]#catalina.sh stop 10
#再次用不同方式启动tomcat
[root@centos8 ~]#catalina.sh start
#再次用不同方式关闭tomcat
[root@centos8 ~]#catalina.sh stop

打开浏览器访问:http://tomcat:8080/,正常可以看到以下界面

clipboard.png

扩展知识:tomcat 和 catalina 关系

Tomcat的servlet容器在4.X版本中被Craig McClanahan(Apache Struts项目的创始人,也是Tomcat的Catalina 的架构师)重新设计为Catalina.即Catalina就是servlet容器。
Tomcat的核心分为3个部分:
(1)Web容器:处理静态页面;
(2)JSP容器:把jsp页面翻译成一般的 servlet
(3)catalina: 是一个servlet容器,用于处理servlet
Catalina是美国西海岸靠近洛杉矶22英里的一个小岛,因为其风景秀丽而著名,曾被评为全美最漂亮的小岛。Servlet运行模块的最早开发者Craig McClanahan因为喜欢Catalina岛,故以Catalina命名他所开发这个模块,另外在开发的早期阶段,Tomcat是被搭建在一个叫Avalon的服务器框架上,而Avalon则是Catalina岛上的一个小镇的名字,于是想一个与小镇名字相关联的单词也是自然而然。设计者估计是想把tomcat设计成最美的轻量级容器吧。下图为该小岛。

1.3 tomcat的文件结构和组成

1.3.1 目录结构

目录说明
bin服务启动、停止等相关程序和文件
conf配置文件
lib库目录
logs日志目录
webapps应用程序,应用部署目录
workjsp编译后的结果文件,建议提前预热访问

1.3.2 配置文件

1.3.2.1 配置文件说明

官方帮助文档:http://tomcat.apache.org/tomcat-8.5-doc/index.html

在tomcat安装目录下的 conf 子目录中,有以下的 tomcat 的配置文件

clipboard.png

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

范例:查看配置文件

[10:48:05 root@tomcat conf]#wc -l server.xml web.xml context.xml tomcat-users.xml catalina.policy catalina.properties logging.properties 
   171 server.xml
  4731 web.xml
    30 context.xml
    44 tomcat-users.xml
   260 catalina.policy
   214 catalina.properties
    75 logging.properties
  5525 total

1.3.2.2 日志文件

参考文档: https://cwiki.apache.org/confluence/display/TOMCAT/Logging

日志格式: https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Access_Logging

[root@centos8 ~]#ls /usr/local/tomcat/logs/ -l
catalina.2020-07-14.log  #tomcat服务日志
catalina.out               #tomcat服务日志
host-manager.2020-07-14.log   #host manager管理日志
localhost.2020-07-14.log       #默认主机日志
localhost_access_log.2020-07-14.txt  ##默认主机访问日志
manager.2020-07-14.log        #manager 管理日志

范例: tomcat的访问日志格式

[10:51:54 root@tomcat conf]#tail /usr/local/tomcat/conf/server.xml 
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <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" />  #说明: "在html中表示双引号"符号
      </Host>
    </Engine>
  </Service>
</Server>
#查看访问日志
[10:59:03 root@tomcat conf]#tail -f /usr/local/tomcat/logs/localhost_access_log.2021-03-16.txt 
192.168.10.1 - - [16/Mar/2021:10:58:50 +0800] "GET / HTTP/1.1" 200 11156
192.168.10.1 - - [16/Mar/2021:10:58:50 +0800] "GET /favicon.ico HTTP/1.1" 200 21630
192.168.10.1 - - [16/Mar/2021:10:58:50 +0800] "GET / HTTP/1.1" 200 11156

1.3.3 组件

1.3.3.1 组件分层和分类

顶级组件

Server,代表整个Tomcat容器,一台主机可以启动多tomcat实例,需要确保端口不要产生冲突

服务类组件

Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine

连接器组件

Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。

容器类

Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。

内嵌类

可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。

集群类组件

listener、cluster

1.3.3.2 Tomcat 内部组成

由上述组件就构成了Tomcat,如下图

clipboard.png

clipboard.png

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

顶级组件:Server
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, ...
集群类组件:listener, cluster, ...

1.3.3.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>

1.3.3.4 tomcat 处理请求过程

假设来自客户的请求为:http://localhost:8080/test/index.jsp

  • 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1Connector获得此请求。
  • Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
  • Engine获得请求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host
  • Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理
  • localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
  • Host匹配到路径为/test的Context
  • path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet
  • Context匹配到URL PATTERN为 *.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
  • Context把执行完了之后的HttpServletResponse对象返回给Host
  • Host把HttpServletResponse对象返回给Engine
  • Engine把HttpServletResponse对象返回给Connector
  • Connector把HttpServletResponse对象返回给浏览器端

1.4 应用部署

1.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目录作为主站目录。

范例: 主页目录和编码

[11:16:05 root@tomcat ROOT]#cat /usr/local/tomcat/webapps/ROOT/index.html
<h1>偷得浮生</h1>
[11:16:37 root@tomcat ROOT]#curl 192.168.10.81:8080/index.html -I
HTTP/1.1 200 
Accept-Ranges: bytes
ETag: W/"22-1615864565000"
Last-Modified: Tue, 16 Mar 2021 03:16:05 GMT
Content-Type: text/html   #tomcat无指定编码,浏览器自动识别为GBK,可能会导致乱码
Content-Length: 22
Date: Tue, 16 Mar 2021 03:16:49 GMT
#httpd服务器默认指定编码为UTF-8,因为服务器本身不会出现乱码
#nginx服务器默认在响应头部没有批定编码,也会出现乱码
#浏览器的设置默认不是UTF-8,可能会导致乱码
#修改网页指定编码
[11:19:46 root@tomcat ROOT]#cat /usr/local/tomcat/webapps/ROOT/index.html
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>tomcat</title>
</head>
<h1>偷得浮生</h1>

1.4.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包

1.4.3 主页设置

1.4.3.1 全局配置实现修改默认主页文件

默认情况下 tomcat 会在$CATALINA_BASE/webapps/ROOT/目录下按以下次序查找文件,找到第一个则进行显示

  • index.html
  • index.htm
  • index.jsp

可以通过修改 $CATALINA_BASE/conf/web.xml 中的下面 标签 内容修改默认页文件
范例:修改默认主页文件

[11:23:38 root@tomcat 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>

1.4.3.2 WebApp的专用配置文件

将上面主配置文件conf/web.xml中的 标签 内容,复到 /usr/local/tomcat/webapp /ROOT/WEB-INF/web.xml中,如下所示:

范例: 针对主站点根目录设置专用配置文件

[11:23:44 root@tomcat tomcat]#cp conf/web.xml webapps/ROOT/WEB-INF/
[11:25:38 root@tomcat tomcat]#vim webapps/ROOT/WEB-INF/web.xml
        <welcome-file>index.jsp</welcome-file>  #修改三个文件的顺序
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.html</welcome-file>
#配置修改后,无需重启tomcat服务,即可观察首页变化
[11:27:08 root@tomcat tomcat]#curl 192.168.10.81:8080

范例: 针对特定APP目录设置专用配置文件

[11:27:56 root@tomcat webapps]#mkdir zhangzhuo
[11:28:17 root@tomcat webapps]#cp -a ROOT/WEB-INF/ zhangzhuo/
[11:28:35 root@tomcat webapps]#echo /usr/local/tomcat/webapps/zhangzhuo/test.html > zhangzhuo/test.html
[11:30:06 root@tomcat zhangzhuo]#echo /usr/local/tomcat/webapps/zhangzhuo/index.html > index.html
[11:30:27 root@tomcat zhangzhuo]#echo /usr/local/tomcat/webapps/zhangzhuo/index.jps > index.jsp
[11:30:40 root@tomcat zhangzhuo]#echo /usr/local/tomcat/webapps/zhangzhuo/index.htm > index.htm
[11:31:04 root@tomcat zhangzhuo]#tree 
.
├── index.htm
├── index.html
├── index.jsp
├── test.html
└── WEB-INF
    └── web.xml
[11:33:41 root@tomcat ~]#tail /usr/local/tomcat/webapps/zhangzhuo/WEB-INF/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>
[11:34:10 root@tomcat ~]#curl 192.168.10.81:8080/zhangzhuo/
/usr/local/tomcat/webapps/zhangzhuo/index.html

配置规则:

  • webApp的专有配置优先于系统的全局配置
  • 修改系统的全局配置文件,需要重新启动服务生效
  • 修改 webApp的专有配置,无需重启即可生效

1.4.4 应用部署实现

1.4.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">

1.4.4.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并不清除它

1.4.4.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/

1.4.4.7 基于WEB的管理Server status和Manager APP实现应用部署

tomcat 提供了基于WEB的管理页面,默认由 tomcat-admin-webapps.noarch包提供相关文件

默认的管理页面被禁用,启用方法如下

修改conf/conf/tomcat-users.xml

[14:16:34 root@tomcat tomcat]#tail conf/tomcat-users.xml
#加下面两行,指定用户和密码
<role rolename="manager-gui"/>
<user username="admin" password="" roles="manager-gui"/>
#修改全局配置文件需要重启服务生效

修改webapps/manager/META-INF/context.xml

[14:19:06 root@tomcat tomcat]#tail webapps/manager/META-INF/context.xml 
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<Context antiResourceLocking="false" privileged="true" >
  <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
                   sameSiteCookies="strict" />
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
#查看正则表达式就知道是本地访问了,由于当前访问地址是192.168.x.x,可以修改正则表达式为\d+\.\d+\.\d+\.\d+

再次通过浏览器访问两个按钮Server Status和Manager App,可以看到以下管理界面,输入前面的用户和密码进行登录

1.4.5 常见配置详解

1.4.5.1 端口8005/tcp 安全配置管理

在conf/server.xml 有以下内容

<Server port="8005" shutdown="SHUTDOWN">

8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串,tomcat接收到后就会关闭此Server。

此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现

或者port修改成 0, 会使用随机端口,如:36913

port设为-1等无效端口,将关闭此功能

此行不能被注释,否则无法启动tomcat服务

1.4.5.2 显示指定的http服务器版本信息

默认不显示tomcat的http的Server头信息, 可以指定tomcat的http的Server头信息为相应的值

#conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000"
redirectPort="8443" Server="zhangzhuo"/>

[14:27:35 root@tomcat tomcat]#curl 192.168.10.81:8080 -I
HTTP/1.1 200 
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 16 Mar 2021 06:27:38 GMT
Server: zhangzhuo

1.4.5.3 其它配置

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 配置
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

1.4.5.4 多虚拟主机配置

  • name 必须是主机名,用主机名来匹配
  • appBase 当前主机的网页根目录,是相对于 $CATALINA_HOME ,也可以使用绝对路径
  • unpackWARs 是否自动解压war格式
  • autoDeploy 热部署,自动加载并运行应用

虚拟主机配置过程

  • 再添加和配置一个新的虚拟主机,并将myapp部署到/data/webapps目录下
[14:32:31 root@tomcat tomcat]#vim conf/server.xml 
#在文件最后面增加下面内容
      <Host name="www.zhangzhuo.org"  appBase="/data/webapps/"                                                                                                             
            unpackWARs="true" autoDeploy="false">
        <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>
#或者如果不加日志也可以用下面简化写法
<Host name="www.zhangzhuo.org" appBase="/data/webapps/" unpackWARs="True"
autoDeploy="false"/>
  • 准备虚拟主机的数据目录
[14:36:56 root@tomcat tomcat]#mkdir /data/webapps/ROOT -pv
[14:38:01 root@tomcat tomcat]#chown -R tomcat: /data/webapps
[14:38:32 root@tomcat tomcat]#echo www.zhangzhuo.org >/data/webapps/ROOT/index.html
  • 测试

刚才在虚拟主机中主机名定义www.zhangzhuo.org,所以需要主机在本机手动配置一个域名解析。如果是windows,修改在C:\Windows\System32\drivers\etc下的hosts文件,需要管理员权限。

使用http://www.zhangzhuo.org:8080/访问查看

[14:49:30 root@tomcat tomcat]#curl www.zhangzhuo.org:8080
www.zhangzhuo.org

实战案例:tomcat实现多虚拟主机

[14:54:37 root@tomcat tomcat]#pwd
/usr/local/tomcat
[14:54:38 root@tomcat tomcat]#vim conf/server.xml
       <Host name="node1.zhangzhuo.org"  appBase="webapps" unpackWARs="true" autoDeploy="true"/>                                                                            
      <Host name="node2.zhangzhuo.org"  appBase="webapps" unpackWARs="true" autoDeploy="true"/>
#对每个虚拟主机,准备数据
[15:05:32 root@tomcat tomcat]#mkdir /data/webapps{1,2}/ROOT -pv
[15:06:12 root@tomcat tomcat]#echo /data/webapps1/ROOT/index.html >/data/webapps1/ROOT/index.html
[15:06:58 root@tomcat tomcat]#echo /data/webapps2/ROOT/index.html >/data/webapps2/ROOT/index.html
#设置权限
[15:07:05 root@tomcat tomcat]#chown -R tomcat: /data/*
#准备虚拟主机的名称解析
[15:07:31 root@tomcat tomcat]#echo 192.168.10.81 node1.zhangzhuo.org >>/etc/hosts
[15:08:03 root@tomcat tomcat]#echo 192.168.10.81 node2.zhangzhuo.org >>/etc/hosts
[15:09:06 root@tomcat tomcat]#systemctl restart tomcat.service
#测试
[15:09:14 root@tomcat tomcat]#curl node1.zhangzhuo.org:8080
/data/webapps1/ROOT/index.html
[15:09:33 root@tomcat tomcat]#curl node2.zhangzhuo.org:8080
/data/webapps2/ROOT/index.html

1.4.5.5 基于web方式的Host Manager虚拟主机管理

可以通过tomcat的管理页面点下面Host Manager按钮进入管理虚拟主机的页面

默认Host Manager 管理页被禁用,解决方法类似于3.4.4.6

<role rolename="admin-gui"/>
<user username="admin" password="" roles="admin-gui"/>

1.4.5.6 Context 配置

Context作用:

  • 路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能
  • 应用独立配置,例如单独配置应用日志、单独配置应用访问控制
#路径映射
<Context path="/test" docBase="/data/test" 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实现过程

  • 将/data/webapps1/下面的项目文件复制到/opt/下,可以修改一下index.html 区别一下
注意:这里特别使用了软链接,原因方便后期版升级或回滚,如是是版本升级,需要将软链接指向myappv2,重新启动。如果新版上线后,出现问题,重新修改软链接到上一个版本的目录,并重启,就可以实现回滚
  • 修改conf/server.xml设置context
</Host>
      <Host name="node1.zhangzhuo.org"  appBase="/data/webapps1/" unpackWARs="true" autoDeploy="true">
    <Context path="/opt" docBase="/opt/" reloadable="true"/>                                                                                                               
      </Host>
  • 测试
[15:37:52 root@tomcat opt]#curl node1.zhangzhuo.org:8080/opt/
/opt/index.html

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

标题:1-Tomcat 基础功能
作者:Carey
地址:HTTPS://zhangzhuo.ltd/articles/2021/03/20/1616227444881.html

生而为人

取消