Tomcat 基础功能
Tomcat 介绍
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML静态资源页面的功能,它还是一个Servlet和JSP容器
起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James DuncanDavidson,在1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级项目
Tomcat 仅仅实现了Java EE规范中与Servlet、JSP相关的类库,是JavaEE不完整实现。
Tomcat 各版本区别
| Servlet Spec | JSP Spec | EL Spec | WebSocket Spec | Authentication (JASPIC) Spec | Apache Tomcat Version | Latest Released Version | Supported Java Versions |
|---|---|---|---|---|---|---|---|
| 6.0 | 3.1 | 5.0 | 2.1 | 3.0 | 10.1.x | 10.1.2 | 11 and later |
| 5.0 | 3.0 | 4.0 | 2.0 | 2.0 | 10.0.x (superseded) | 10.0.27 (superseded) | 8 and later |
| 4.0 | 2.3 | 3.0 | 1.1 | 1.1 | 9.0.x | 9.0.69 | 8 and later |
| 3.1 | 2.3 | 3.0 | 1.1 | 1.1 | 8.5.x | 8.5.84 | 7 and later |
| 3.1 | 2.3 | 3.0 | 1.1 | N/A | 8.0.x (superseded) | 8.0.53 (superseded) | 7 and later |
| 3.0 | 2.2 | 2.2 | 1.1 | N/A | 7.0.x (archived) | 7.0.109 (archived) | 6 and later (7+ for WebSocket) |
| 2.5 | 2.1 | 2.1 | N/A | N/A | 6.0.x (archived) | 6.0.53 (archived) | 5 and later |
| 2.4 | 2.0 | N/A | N/A | N/A | 5.5.x (archived) | 5.5.36 (archived) | 1.4 and later |
| 2.3 | 1.2 | N/A | N/A | N/A | 4.1.x (archived) | 4.1.40 (archived) | 1.3 and later |
| 2.2 | 1.1 | N/A | N/A | N/A | 3.3.x (archived) | 3.3.2 (archived) | 1.1 and later |
| Servlet Spec | JSP Spec | EL Spec | WebSocket Spec | Authentication (JASPIC) Spec | Apache Tomcat Version | Latest Released Version | Supported Java Versions |
|---|---|---|---|---|---|---|---|
| 5.0 | 3.0 | 4.0 | 2.0 | 2.0 | 10.0.x | 10.0.0-M1 | 8 and later |
| 4.0 | 2.3 | 3.0 | 1.1 | 1.1 | 9.0.x | 9.0.31 | 8 and later |
| 3.1 | 2.3 | 3.0 | 1.1 | 1.1 | 8.5.x | 8.5.51 | 7 and later |
| 3.1 | 2.3 | 3.0 | 1.1 | N/A | 8.0.x (superseded) | 8.0.53 (superseded) | 7 and later |
| 3.0 | 2.2 | 2.2 | 1.1 | N/A | 7.0.x | 7.0.100 | 6 and later (7+ for WebSocket) |
| 2.5 | 2.1 | 2.1 | N/A | N/A | 6.0.x (archived) | 6.0.53 (archived) | 5 and later |
| 2.4 | 2.0 | N/A | N/A | N/A | 5.5.x (archived) | 5.5.36 (archived) | 1.4 and later |
| 2.3 | 1.2 | N/A | N/A | N/A | 4.1.x (archived) | 4.1.40 (archived) | 1.3 and later |
| 2.2 | 1.1 | N/A | N/A | N/A | 3.3.x (archived) | 3.3.2 (archived) | 1.1 and later |
Tomcat 安装
基于包安装 Tomcat
CentOS 包安装 tomcat
范例: Rocky 基于EPEL源安装 tomcat
[root@rocky8 ~]#yum list |grep tomcat
tomcat.noarch 1:9.0.65-2.el8
epel
tomcat-admin-webapps.noarch 1:9.0.65-2.el8
epel
tomcat-docs-webapp.noarch 1:9.0.65-2.el8
epel
tomcat-el-3.0-api.noarch 1:9.0.65-2.el8
epel
tomcat-jsp-2.3-api.noarch 1:9.0.65-2.el8
epel
tomcat-lib.noarch 1:9.0.65-2.el8
epel
tomcat-native.x86_64 1.2.35-1.el8
epel
tomcat-servlet-4.0-api.noarch 1:9.0.65-2.el8
epel
tomcat-webapps.noarch 1:9.0.65-2.el8
epel
[root@rocky8 ~]#
[root@rocky8 ~]#yum -y install tomcat tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps
[root@rocky8 ~]#systemctl enable --now tomcat.service
范例: CentOS 8 包仓库中目前还没有提供tomcat相关包
[root@centos8 ~]#yum list tomcat
Last metadata expiration check: 1:25:35 ago on Wed 15 Jul 2020 09:01:28 AM CST.
Error: No matching Packages to list
CentOS 7 yum仓库源中自带的Tomcat 7.0版本安装,此方式安装tomcat版本较低,不推荐
范例:在CentOS 7 上安装 tomcat
[root@centos7 ~]#yum list tomcat*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base:
Available Packages
tomcat.noarch 7.0.76-9.el7_6
base
tomcat-admin-webapps.noarch 7.0.76-9.el7_6
base
tomcat-docs-webapp.noarch 7.0.76-9.el7_6
base
tomcat-el-2.2-api.noarch 7.0.76-9.el7_6
base
tomcat-javadoc.noarch 7.0.76-9.el7_6
base
tomcat-jsp-2.2-api.noarch 7.0.76-9.el7_6
base
tomcat-jsvc.noarch 7.0.76-9.el7_6
base
tomcat-lib.noarch 7.0.76-9.el7_6
base
tomcat-native.x86_64 1.2.21-1.el7
epel
tomcat-servlet-3.0-api.noarch 7.0.76-9.el7_6
base
tomcat-webapps.noarch 7.0.76-9.el7_6
base
tomcatjss.noarch 7.2.1-8.el7_6
base
[root@centos7 ~]#yum -y install tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp
[root@centos7 ~]#systemctl enable --now tomcat
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service
to /usr/lib/systemd/system/tomcat.service.
[root@centos7 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer
Address:Port
LISTEN 0 100 127.0.0.1:25
*:*
LISTEN 0 128 *:22
*:*
LISTEN 0 100 [::1]:25
[::]:*
LISTEN 0 1 [::ffff:127.0.0.1]:8005
[::]:*
LISTEN 0 100 [::]:8009
[::]:*
LISTEN 0 100 [::]:8080
[::]:*
LISTEN 0 128 [::]:22
[::]:*
[root@centos7 ~]#getent passwd tomcat
tomcat:x:53:53:Apache Tomcat:/usr/share/tomcat:/sbin/nologin
[root@centos7 ~]#ps aux|grep tomcat
tomcat 1328 0.4 11.2 2298188 112004 ? Ssl 21:32 0:11
/usr/lib/jvm/jre/bin/java -classpath
/usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-
juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -
Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -
Djava.io.tmpdir=/var/cachetomcat/temp -
Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -
Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
org.apache.catalina.startup.Bootstrap start
root 1521 0.0 0.0 112712 960 pts/0 R+ 22:15 0:00 grep --
color=auto tomcat
打开浏览器访问:http://tomcat:8080/
Ubuntu 包安装 tomcat
范例: Ubuntu22.04 安装 tomcat9
[root@ubuntu2204 ~]#apt list |grep tomcat
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
libtomcat9-embed-java/jammy-updates 9.0.58-1ubuntu0.1 all
libtomcat9-java/jammy-updates 9.0.58-1ubuntu0.1 all
libtomcatjss-java/jammy 8.0.0-2 all
tomcat-jakartaee-migration/jammy 0.2.0-1 all
tomcat9-admin/jammy-updates 9.0.58-1ubuntu0.1 all
tomcat9-common/jammy-updates 9.0.58-1ubuntu0.1 all
tomcat9-docs/jammy-updates 9.0.58-1ubuntu0.1 all
tomcat9-examples/jammy-updates 9.0.58-1ubuntu0.1 all
tomcat9-user/jammy-updates 9.0.58-1ubuntu0.1 all
tomcat9/jammy-updates 9.0.58-1ubuntu0.1 all
[root@ubuntu2204 ~]#apt update && apt -y install tomcat9 tomcat9-admin tomcat9-docs tomcat9-examples
[root@ubuntu2204 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port
Peer Address:Port Process
LISTEN 0 4096 127.0.0.53%lo:53
0.0.0.0:*
LISTEN 0 128 0.0.0.0:22
0.0.0.0:*
LISTEN 0 128 127.0.0.1:6010
0.0.0.0:*
LISTEN 0 128 [::]:22
[::]:*
LISTEN 0 128 [::1]:6010
[::]:*
LISTEN 0 100 *:8080
*:*
范例:Ubuntu20.04安装tomcat9
[root@ubuntu2004 ~]#apt update
[root@ubuntu2004 ~]#apt list tomcat*
Listing... Done
tomcat9-admin/focal-security,focal-updates,now 9.0.31-1ubuntu0.1 all [installed]
tomcat9-common/focal-security,focal-updates,now 9.0.31-1ubuntu0.1 all
[installed,automatic]
tomcat9-docs/focal-security,focal-updates,now 9.0.31-1ubuntu0.1 all [installed]
tomcat9-examples/focal-security,focal-updates,now 9.0.31-1ubuntu0.1 all
[installed]
tomcat9-user/focal-security,focal-updates 9.0.31-1ubuntu0.1 all
tomcat9/focal-security,focal-updates,now 9.0.31-1ubuntu0.1 all [installed]
[root@ubuntu2004 ~]#apt -y install tomcat9 tomcat9-admin tomcat9-docs tomcat9-examples
范例: Ubuntu18.04安装 tomcat8
[root@ubuntu1804 ~]#apt update
[root@ubuntu1804 ~]#apt -y install tomcat8 tomcat8-admin tomcat8-docs
二进制安装 Tomcat
CentOS 7 的yum源的tomcat版本老旧,而CentOS8 yum源里无tomcat
目前比较主流的Tomcat是8.5.X版本,推荐从Apache官网下载二进制tomcat包进行安装,此为生产常用方式
下载并安装
注意: 安装tomcat 前必须先部署JDK
官方和镜像站点下载:
https://tomcat.apache.org/download-80.cgi
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/
#安装Tomcat之前先安装Java
#官网或镜像网站下载:
[root@centos8 ~]#wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.50/bin/apache-tomcat-8.5.50.tar.gz
[root@centos8 ~]#tar xf apache-tomcat-8.5.50.tar.gz -C /usr/local/
[root@centos8 ~]#cd /usr/local/
[root@centos8 local]#ln -s apache-tomcat-8.5.50/ tomcat
#指定PATH变量
[root@centos8 ~]#echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh
[root@centos8 ~]#. /etc/profile.d/tomcat.sh
[root@centos8 ~]#echo $PATH
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk/bin:/root/bin
#查看当前变量设置和命令用法
[root@centos8 ~]#catalina.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Usage: catalina.sh ( commands ... )
commands:
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security manager
start Start Catalina in a separate window
start -security Start in a separate window with security manager
stop Stop Catalina, waiting up to 5 seconds for the process to
end
stop n Stop Catalina, waiting up to n seconds for the process to
end
stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL
if still running
stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL
if still running
configtest Run a basic syntax check on server.xml - check exit code for
result
version What version of tomcat are you running?
Note: Waiting for the process to end and use of the -force option require that
$CATALINA_PID is defined
#查看环境变量和版本信息
[root@centos8 ~]#catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Server version: Apache Tomcat/8.5.59
Server built: Oct 6 2020 16:57:18 UTC
Server number: 8.5.59.0
OS Name: Linux
OS Version: 4.18.0-193.el8.x86_64
Architecture: amd64
JVM Version: 1.8.0_261-b12
JVM Vendor: Oracle Corporation
#启动tomcat
[root@centos8 ~]#startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/jre
Using CLASSPATH:
/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
#查看端口
[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启动的
[root@centos8 ~]#ps aux|grep tomcat
root 12994 34.1 9.4 2155140 76912 pts/0 Sl 22:38 0:02
/usr/local/jdk/jre/bin/java -
Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -
Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -
Djdk.tls.ephemeralDHKeySize=2048 -
Djava.protocol.handler.pkgs=org.apache.catalina.webresources -
Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -
Dignore.endorsed.dirs= -classpath
/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -
Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -
Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap
start
root 13039 0.0 0.1 12108 1076 pts/0 R+ 22:38 0:00 grep --
color=auto tomcat
#关闭tomcat
[root@centos8 ~]#shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/jre
Using CLASSPATH:
/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
#或者以下也可以,指定10s后停止,默认5s
[root@centos8 ~]#catalina.sh stop 10
[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 128 [::]:22
[::]:*
#再次用不同方式启动tomcat
[root@centos8 ~]#catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/jre
Using CLASSPATH:
/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[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
*:*
#再次用不同方式关闭tomcat
[root@centos8 ~]#catalina.sh stop
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/jre
Using CLASSPATH:
/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
打开浏览器访问:http://tomcat:8080/,正常可以看到界面
扩展知识: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英里的一个小岛,因为其风景秀丽而著名,曾被评为全美最漂亮的小岛。(想去看请下载GTAV)Servlet运行模块的最早开发者Craig McClanahan因为喜欢Catalina岛,故以Catalina命名他所开这个模块,另外在开发的早期阶段,Tomcat是被搭建在一个叫Avalon的服务器框架上,而Avalon则是Catalina岛上的一个小镇的名字,于是想一个与小镇名字相关联的单词也是自然而然。设计者估计是想把tomcat设计成最美的轻量级容器吧。下图为该小岛。

配置 tomcat 自启动的 service 文件
#创建tomcat专用帐户 创建用户默认会创建同名的组
[root@centos8 ~]#useradd -r -s /sbin/nologin tomcat
#准备service文件中相关环境文件
[root@centos8 ~]#vim /usr/local/tomcat/conf/tomcat.conf
[root@centos8 ~]#cat /usr/local/tomcat/conf/tomcat.conf
#两个变量至少设置一项才能启动 tomcat
JAVA_HOME=/usr/local/jdk
#JRE_HOME=/usr/local/jdk/jre
#如果不指定上面变量,/var/log/messages文件中会出现下面无法启动错误提示
Mar 15 14:30:09 centos8 startup.sh[1530]: Neither the JAVA_HOME nor the JRE_HOME
environment variable is defined
Mar 15 14:30:09 centos8 startup.sh[1530]: At least one of these environment
variable is needed to run this program
[root@centos8 ~]#chown -R tomcat.tomcat /usr/local/tomcat/
#创建tomcat.service文件
[root@centos8 ~]#vim /lib/systemd/system/tomcat.service
[root@centos8 ~]#cat /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
#以下二选一
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
#或者,如果没有创建上面的/usr/local/tomcat/conf/tomcat.conf文件,可以加下面一行也可
Environment=JAVA_HOME=/usr/local/jdk
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@centos8 ~]#systemctl daemon-reload
[root@centos8 ~]#systemctl enable --now tomcat
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service →
/usr/lib/systemd/system/tomcat.service.
[root@centos8 ~]#systemctl status tomcat
● tomcat.service - Tomcat
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor
preset: disabled)
Active: active (running) since Sat 2020-02-08 23:37:02 CST; 5s ago
Process: 14312 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited,
status=0/SUCCESS)
Main PID: 14320 (java)
Tasks: 43 (limit: 4895)
Memory: 64.2M
CGroup: /system.slice/tomcat.service
└─14320 /usr/local/jdk/jre/bin/java -
Djava.util.logging.config.file=/usr/local/tomcat/conf/logging>
Feb 08 23:37:02 centos8.localdomain systemd[1]: Starting Tomcat...
Feb 08 23:37:02 centos8.localdomain systemd[1]: Started Tomcat.
#查看日志
[root@centos8 ~]#tail /var/log/messages
Mar 15 14:32:13 centos8 systemd[1]: Reloading.
Mar 15 14:32:23 centos8 systemd[1]: Starting Tomcat...
Mar 15 14:32:23 centos8 startup.sh[1575]: Tomcat started.
Mar 15 14:32:23 centos8 systemd[1]: Started Tomcat.
实战案例: 一键安装 tomcat 脚本
#!/bin/bash
TOMCAT_VERSION=9.0.69
JDK_VERSION=8u351
TOMCAT_FILE="apache-tomcat-${TOMCAT_VERSION}.tar.gz"
JDK_FILE="jdk-${JDK_VERSION}-linux-x64.tar.gz"
JDK_DIR="/usr/local"
TOMCAT_DIR="/usr/local"
DIR=`pwd`
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$2" && $MOVE_TO_COL
echo -n "["
if [ $1 = "success" -o $1 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $1 = "failure" -o $1 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_jdk(){
if [ ! -f "$DIR/$JDK_FILE" ];then
color 1 "$JDK_FILE 文件不存在"
exit;
elif [ -d $JDK_DIR/jdk ];then
color 1 "JDK 已经安装"
exit
else
[ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi
tar xvf $DIR/$JDK_FILE -C $JDK_DIR
cd $JDK_DIR && ln -s jdk* jdk
cat > /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=$JDK_DIR/jdk
export PATH=\$PATH:\$JAVA_HOME/bin
#export JRE_HOME=\$JAVA_HOME/jre
#export CLASSPATH=.:\$JAVA_HOME/lib/:\$JRE_HOME/lib/
EOF
. /etc/profile.d/jdk.sh
java -version && color 0 "JDK 安装完成" || { color 1 "JDK 安装失败" ; exit; }
}
install_tomcat(){
if ! [ -f "$DIR/$TOMCAT_FILE" ];then
color 1 "$TOMCAT_FILE 文件不存在"
exit;
elif [ -d $TOMCAT_DIR/tomcat ];then
color 1 "TOMCAT 已经安装"
exit
else
[ -d "$TOMCAT_DIR" ] || mkdir -pv $TOMCAT_DIR
fi
tar xf $DIR/$TOMCAT_FILE -C $TOMCAT_DIR
cd $TOMCAT_DIR && ln -s apache-tomcat-*/ tomcat
echo "PATH=$TOMCAT_DIR/tomcat/bin:"'$PATH' > /etc/profile.d/tomcat.sh
id tomcat &> /dev/null || useradd -r -s /sbin/nologin tomcat
cat > $TOMCAT_DIR/tomcat/conf/tomcat.conf <<EOF
JAVA_HOME=$JDK_DIR/jdk
EOF
chown -R tomcat.tomcat $TOMCAT_DIR/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=$TOMCAT_DIR/tomcat/conf/tomcat.conf
ExecStart=$TOMCAT_DIR/tomcat/bin/startup.sh
ExecStop=$TOMCAT_DIR/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now tomcat.service &> /dev/null
systemctl is-active tomcat.service &> /dev/null && color 0 "TOMCAT 安装完成" || {
color 1 "TOMCAT 安装失败" ; exit; }
}
install_jdk
install_tomcat
基于容器启动
root@ubuntu2204 ~]#cat docker-compose.yml
version: '3.6'
volumes:
tomcat_webapps: {}
networks:
monitoring:
driver: bridge
ipam:
config:
- subnet: 172.31.0.0/24
services:
tomcat:
#image: tomcat:jdk11
build:
context: tomcat
dockerfile: Dockerfile
expose:
- 8080
ports:
- 8080:8080
volumes:
- tomcat_webapps:/usr/local/tomcat/webapps
networks:
- monitoring
environment:
TZ: Asia/Shanghai
root@ubuntu2204 ~]#cat tomcat/Dockerfile
FROM tomcat:9.0-jdk17-openjdk-slim
ADD ./sources.list /etc/apt/sources.list
ENV TOMCAT_SIMPLECLIENT_VERSION=0.12.0
ENV TOMCAT_EXPORTER_VERSION=0.0.15
RUN mv /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/
root@ubuntu2204 ~]#docker-compose up -d
Tomcat 的文件结构和组成
目录结构
| 目录 | 说明 |
|---|---|
| bin | 服务启动、停止等相关程序和文件 |
| conf | 配置文件 |
| lib | 库目录 |
| logs | 日志目录 |
| webapps | 应用程序,应用部署目录 |
| work | jsp编译后的结果文件,建议提前预热访问,升级应用后,删除此目录数据才能更新 |
范例:查看tomcat相关目录和文件
[root@centos8 tomcat]#pwd
/usr/local/tomcat
[root@centos8 tomcat]#ls
bin conf lib logs README.md RUNNING.txt
webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
[root@centos8 tomcat]#ls bin
bootstrap.jar ciphers.sh daemon.sh shutdown.bat
tomcat-native.tar.gz
catalina.bat commons-daemon.jar digest.bat shutdown.sh
tool-wrapper.bat
catalina.sh commons-daemon-native.tar.gz digest.sh startup.bat
tool-wrapper.sh
catalina-tasks.xml configtest.bat setclasspath.bat startup.sh
version.bat
ciphers.bat configtest.sh setclasspath.sh tomcat-juli.jar version.sh
[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]#ls lib
annotations-api.jar ecj-4.6.3.jar servlet-api.jar tomcat-i18n-fr.jar
tomcat-jni.jar
catalina-ant.jar el-api.jar tomcat-api.jar tomcat-i18n-ja.jar
tomcat-util.jar
catalina-ha.jar jasper-el.jar tomcat-coyote.jar tomcat-i18n-ko.jar
tomcat-util-scan.jar
catalina.jar jasper.jar tomcat-dbcp.jar tomcat-i18n-ru.jar
tomcat-websocket.jar
catalina-storeconfig.jar jaspic-api.jar tomcat-i18n-de.jar tomcat-i18n-zh-
CN.jar websocket-api.jar
catalina-tribes.jar jsp-api.jar tomcat-i18n-es.jar tomcat-jdbc.jar
[root@centos8 tomcat]#ls logs
catalina.2020-02-09.log host-manager.2020-02-09.log localhost_access_log.2020-02-09.txt
catalina.out localhost.2020-02-09.log manager.2020-02-09.log
[root@centos8 tomcat]#ls webapps/
docs examples host-manager manager ROOT
[root@centos8 tomcat]#ls work/
Catalina
[root@centos8 tomcat]#ls work/Catalina/
localhost
[root@centos8 tomcat]#ls work/Catalina/localhost/
docs examples host-manager manager ROOT
[root@centos8 tomcat]#ll -i work/Catalina/localhost/
total 0
68039883 drwxr-x--- 2 tomcat tomcat 6 Feb 9 11:02 docs
135579640 drwxr-x--- 2 tomcat tomcat 6 Feb 9 11:02 examples
202681358 drwxr-x--- 2 tomcat tomcat 6 Feb 9 11:02 host-manager
571365 drwxr-x--- 2 tomcat tomcat 6 Feb 9 11:02 manager
571364 drwxr-x--- 2 tomcat tomcat 6 Feb 9 11:02 ROOT
[root@centos8 tomcat]#ll -i webapps/
total 4
202681088 drwxr-x--- 15 tomcat tomcat 4096 Feb 9 11:02 docs
202681094 drwxr-x--- 6 tomcat tomcat 83 Feb 9 11:02 examples
571165 drwxr-x--- 5 tomcat tomcat 87 Feb 9 11:02 host-manager
68039687 drwxr-x--- 5 tomcat tomcat 103 Feb 9 11:02 manager
68039663 drwxr-x--- 3 tomcat tomcat 283 Feb 9 11:02 ROOT
[root@centos8 tomcat]#tree work/Catalina/localhost/
work/Catalina/localhost/
├── docs
├── examples
├── host-manager
├── manager
└── ROOT
[root@centos8 tomcat]#curl http://10.0.0.8:8080/
#当访问过后,work目录中生成新文件
[root@centos8 tomcat]#tree work/Catalina/localhost/
work/Catalina/localhost/
├── docs
├── examples
├── host-manager
├── manager
└── ROOT
└── org
└── apache
└── jsp
├── index_jsp.class #字节码文件
└── index_jsp.java #servlet文件
#tomcat会自动的将jsp文件生成java源文件,再编译成class文件
[root@centos8 tomcat]#less work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.java
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.50
* Generated at: 2020-02-09 03:20:20 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long>_jspx_dependants;
配置文件和日志
配置文件说明
官方帮助文档:http://tomcat.apache.org/tomcat-8.5-doc/index.html
在tomcat安装目录下的 conf 子目录中,有以下的 tomcat 的配置文件
| 文件名 | 说明 |
|---|---|
| server.xml | 主配置文件 |
| web.xml | 每个 webapp 只有“部署”后才能被访问,它的部署方式通常由 web.xml 进行定义,其存放位置为 WEB-INF/目录中;此文件为所有的 webapps 提供默认部署相关的配置,每个 web 应用也可以使用专用配置文件,来覆盖全局文件 |
| context.xml | 用于定义所有 web 应用均需加载的 Context 配置,此文件为所有的 webapps 提供默认配置,每个 web 应用也可以使用自己专用的配置,它通常由专用配置文件 context.xml 来定义,其存放位置为 WEB-INF/目录中,覆盖全局的文件 |
| tomcat-users.xml | 用户认证的账号和密码文件 |
| catalina.policy | 当使用 security 选项启动 tomcat 时,用于为 tomcat 设置安全策略 |
| catalina.properties | Tomcat 环境变量的配置,用于设定类加载器路径,以及一些与 JVM 调优相关参数 |
| logging.properties | Tomcat 日志系统相关的配置,可以修改日志级别和日志路径等 |
注意:配置文件大小写敏感
范例:查看配置文件
[root@centos8 conf]#pwd
/usr/local/tomcat/conf
[root@centos8 conf]#ls
Catalina context.xml logging.properties tomcat-users.xml
catalina.policy j aspic-providers.xml server.xml tomcat-users.xsd
catalina.properties jaspic-providers.xsd tomcat.conf web.xml
[root@centos8 conf]#wc -l server.xml web.xml context.xml tomcat-users.xml catalina.policy catalina.properties logging.properties
167 server.xml
4726 web.xml
30 context.xml
44 tomcat-users.xml
271 catalina.policy
214 catalina.properties
75 logging.properties
5527 total
范例: 主要配置文件内容
[root@centos8 ~]#grep -v '\-\-' /usr/local/tomcat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
define subcomponents such as "Valves" at this level.
Documentation at /docs/config/server.html
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.security.SecurityListener" />
<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" />
Documentation at /docs/jndi-resources-howto.html
.............
日志文件
tomcat 日志文件说明
参考文档: https://cwiki.apache.org/confluence/display/TOMCAT/Logging
tomcat有五类日志:catalina、localhost、manager、admin、host-manager
catalina.out
catalina.out即标准输出和标准出错,所有输出到这两个位置的都会进入catalina.out,这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。默认这个日志文件是不会进行自动切割的,我们需要借助其他工具进行切割(注意:catalina.out文件如果过大会影响)
catalina.YYYY-MM-DD.log
catalina.{yyyy-MM-dd}.log是tomcat自己运行的一些日志,这些日志还会输出到catalina.out,但是应用向console输出的日志不会输出到catalina.{yyyy-MM-dd}.log,它是tomcat的启动和暂停时的运行日志,注意,它和catalina.out是里面的内容是不一样的。
localhost.YYYY-MM-DD.log
localhost.{yyyy-MM-dd}.log主要是应用初始化(listener, filter, servlet)未处理的异常最后被tomcat捕获而输出的日志,它也是包含tomcat的启动和暂停时的运行日志,但它没有catalina.2018-09-19.log日志全。它只是记录了部分日志。
localhost_access_log.YYYY-MM-DD.txt
这个是访问tomcat的日志,请求时间和资源,状态码都有记录。
host-manager.YYYY-MM-DD.log
这个是放tomcat的自带的manager项目的日志信息的,未看到有什么重要的日志信息。
manager.YYYY-MM-DD.log
这个是tomcat manager项目专有的日志文件.
范例: tomcat中的日志文件
[root@tomcat ~]#cat /usr/local/tomcat/conf/logging.properties
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
handlers = 1catalina.org.apache.juli.AsyncFileHandler,
2localhost.org.apache.juli.AsyncFileHandler,
3manager.org.apache.juli.AsyncFileHandler, 4host-
manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.AsyncFileHandler,
java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8
2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8
3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8
4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8
############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers =
2localhost.org.apache.juli.AsyncFileHandler
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level =
INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers
= 3manager.org.apache.juli.AsyncFileHandler
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-
manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-
manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler
.......
[root@centos8 ~]#ls /usr/local/tomcat/logs/ -1
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 访问日志格式
日志格式: https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Access_Logging
%a - Remote IP address
%A - Local IP address
%b - Bytes sent, excluding HTTP headers, or '-' if zero
%B - Bytes sent, excluding HTTP headers
%h - Remote host name (or IP address if enableLookups for the connector is
false)
%H - Request protocol
%l - Remote logical username from identd (always returns '-')
%m - Request method (GET, POST, etc.)
%p - Local port on which this request was received. See also %{xxx}p below.
%q - Query string (prepended with a '?' if it exists)
%r - First line of the request (method and request URI)
%s - HTTP status code of the response
%S - User session ID
%t - Date and time, in Common Log Format
%u - Remote user that was authenticated (if any), else '-'
%U - Requested URL path
%v - Local server name
%D - Time taken to process the request in millis. Note: In httpd %D is
microseconds. Behaviour will be aligned to httpd in Tomcat 10 onwards.
%T - Time taken to process the request, in seconds. Note: This value has
millisecond resolution whereas in httpd it has second resolution. Behaviour will
be align to httpd in Tomcat 10 onwards.
%F - Time taken to commit the response, in millis
%I - Current request thread name (can compare later with stacktraces)
%X - Connection status when response is completed:
X = Connection aborted before the response completed.
+ = Connection may be kept alive after the response is sent.
- = Connection will be closed after the response is sent.
There is also support to write information incoming or outgoing headers, cookies,
session or request attributes and special timestamp formats. It is modeled after
the Apache HTTP Server log configuration syntax. Each of them can be used
multiple times with different xxx keys:
%{xxx}i write value of incoming header with name xxx
%{xxx}o write value of outgoing header with name xxx
%{xxx}c write value of cookie with name xxx
%{xxx}r write value of ServletRequest attribute with name xxx
%{xxx}s write value of HttpSession attribute with name xxx
%{xxx}p write local (server) port (xxx==local) or remote (client) port
(xxx=remote)
%{xxx}t write timestamp at the end of the request formatted using the enhanced
SimpleDateFormat pattern xxx
范例: tomcat的访问日志格式
#查看访问日志格式
[root@centos8 ~]#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 "%r" %s %b" /> #说明: "在html中表示双引号"符号
</Host>
</Engine>
</Service>
</Server>
查看访问日志
[root@centos8 ~]#tail /usr/local/tomcat/logs/localhost_access_log.2020-07-14.txt
10.0.0.1 - - [14/Jul/2020:09:08:46 +0800] "GET / HTTP/1.1" 200 11215
10.0.0.1 - - [14/Jul/2020:09:08:46 +0800] "GET /tomcat.css HTTP/1.1" 200 5581
10.0.0.1 - - [14/Jul/2020:09:08:46 +0800] "GET /tomcat.png HTTP/1.1" 200 5103
10.0.0.1 - - [14/Jul/2020:09:08:46 +0800] "GET /bg-nav.png HTTP/1.1" 200 1401
10.0.0.1 - - [14/Jul/2020:09:08:46 +0800] "GET /bg-upper.png HTTP/1.1" 200 3103
10.0.0.1 - - [14/Jul/2020:09:08:46 +0800] "GET /asf-logo-wide.svg HTTP/1.1" 200 27235
10.0.0.1 - - [14/Jul/2020:09:08:46 +0800] "GET /bg-middle.png HTTP/1.1" 200 1918
10.0.0.1 - - [14/Jul/2020:09:08:46 +0800] "GET /bg-button.png HTTP/1.1" 200 713
10.0.0.1 - - [14/Jul/2020:09:08:46 +0800] "GET /favicon.ico HTTP/1.1" 200 21630
范例: tomcat日志实现json格式的访问日志
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
.......
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
########################添加下面一行,注意是一行,不要换行#################################
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
#####################################################################################
<!-- pattern="%h %l %u %t "%r" %s %b" /> -->
</Host>
</Engine>
</Service>
</Server>
[root@centos8 ~]#systemctl restart tomcat
[root@centos8 ~]#tail /usr/local/tomcat/logs/localhost_access_log.2020-08-18.txt
10.0.0.1 - - [18/Aug/2020:17:59:06 +0800] "GET
/examples/jsp/jsp2/simpletag/hello.html HTTP/1.1" 200 1450
10.0.0.1 - - [18/Aug/2020:17:59:08 +0800] "GET
/examples/jsp/jsp2/simpletag/hello.jsp.html HTTP/1.1" 200 1416
10.0.0.1 - - [18/Aug/2020:17:59:23 +0800] "GET
/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html HTTP/1.1" 200 1312
10.0.0.1 - - [18/Aug/2020:17:59:38 +0800] "GET
/examples/jsp/jsp2/tagfiles/hello.html HTTP/1.1" 200 1399
10.0.0.1 - - [18/Aug/2020:17:59:40 +0800] "GET
/examples/jsp/jsp2/tagfiles/hello.jsp.html HTTP/1.1" 200 1611
{"clientip":"10.0.0.100","ClientUser":"-","authenticated":"-","AccessTime":"
[18/Aug/2020:18:03:46 +0800]","method":"GET /
HTTP/1.0","status":"200","SendBytes":"11136","Query?string":"","partner":"-
","AgentVersion":"ApacheBench/2.3"}
{"clientip":"10.0.0.1","ClientUser":"-","authenticated":"-","AccessTime":"
[18/Aug/2020:18:08:43 +0800]","method":"GET
/examples/jsp/jsp2/tagfiles/hello.jsp.html
HTTP/1.1","status":"304","SendBytes":"-","Query?
string":"","partner":"http://10.0.0.28:8080/examples/jsp/jsp2/tagfiles/hello.htm
l","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.73"}
{"clientip":"10.0.0.1","ClientUser":"-","authenticated":"-","AccessTime":"
[18/Aug/2020:18:08:43 +0800]","method":"GET /favicon.ico
HTTP/1.1","status":"200","SendBytes":"21630","Query?
string":"","partner":"http://10.0.0.28:8080/examples/jsp/jsp2/tagfiles/hello.jsp
.html","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
Edg/92.0.902.73"}
{"clientip":"10.0.0.1","ClientUser":"-","authenticated":"-","AccessTime":"
[18/Aug/2020:18:08:51 +0800]","method":"GET /
HTTP/1.1","status":"200","SendBytes":"11156","Query?string":"","partner":"-
","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.73"}
{"clientip":"10.0.0.1","ClientUser":"-","authenticated":"-","AccessTime":"
[18/Aug/2020:18:08:51 +0800]","method":"GET /favicon.ico
HTTP/1.1","status":"200","SendBytes":"21630","Query?
string":"","partner":"http://10.0.0.28:8080/","AgentVersion":"Mozilla/5.0
(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.73"}
#安装json工具jq
[root@rocky8 ~]#yum -y install jq
#利用jq解析json格式
[root@rocky8 ~]#echo '{"clientip":"10.0.0.1","ClientUser":"-","authenticated":"-","AccessTime":"[11/Mar/2022:09:26:53 +0800]","method":"GET / HTTP/1.1","status":"200","SendBytes":"11165","Query?string":"","partner":"-","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36"}' |jq
{
"clientip": "10.0.0.1",
"ClientUser": "-",
"authenticated": "-",
"AccessTime": "[11/Mar/2022:09:26:53 +0800]",
"method": "GET / HTTP/1.1",
"status": "200",
"SendBytes": "11165",
"Query?string": "",
"partner": "-",
"AgentVersion": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36"
}
组件
组件分层和分类
顶级组件
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
Tomcat 内部组成
由上述组件就构成了Tomcat,如下图

| 名称 | 说明 |
|---|---|
| Server | 服务器,Tomcat 运行的进程实例,一个 Server 中可以有多个 service,但通常就一个 |
| Service | 服务,用来组织 Engine 和 Connector 的对应关系,一个 service 中只有一个 Engine |
| Connector | 连接器,负责客户端的 HTTP、HTTPS、AJP 等协议连接。一个 Connector 只属于某一个 Engine |
| Engine | 即引擎,用来响应并处理用户请求。一个 Engine 上可以绑定多个 Connector |
| Host | 即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分 |
| Context | 应用的上下文,配置特定 url 路径映射和目录的映射关系:url => directory |
每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:
顶级组件:Server
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, ...
集群类组件:listener, cluster, ...
范例: 查看类
[root@centos8 ~]#grep className /usr/local/tomcat/conf/server.xml
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.security.SecurityListener" />
<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" />
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
核心组件
- 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>
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对象返回给浏览器端