Tomcat快速入门
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。
1.Tomcat基本介绍
1.JVM基本介绍
Java业务都是运行在Java虚拟机上的,Java虚拟机简称为JVM
所谓虚拟机是指:通过软件模拟具有完整的硬件系统的功能、运行在一个完全隔离环境中的计算机系统。
2.为什么JAVA需要JVM虚拟机?
像早起的C语言不支持跨平台,因为C语言想在Windows、Linux、mac上运行,需要进行分别编译。那么在Linux上有非常多的优秀软件,如果需要在Windows上使用则需要重新编译。移植性很差。
而JAVA则不同,JAVA是可以跨平台、只需要将源代码进行一次编译,能够在多处运行。
那JAVA是怎么做到的?
它只需要在Windows和Linux平台运行一个jvm,这样我们能将JAVA编译好的war包在Windows和Linux平台运行起来,无需我们重复编译。而jvm是jre提供。
3.JAVA环境jre和jdk的区别在哪?
Jre是JAVA的运行环境,会包含jvm
Jdk是JAVA的开发环境,会包含JAVA的运行环境jre
如果说单纯的运行JAVA代码,只需要jre足够,但如果需要提供开发环境以及运行环境则需要jdk
4.什么是tomcat?
Tomcat和nginx类似,也是一个web服务器软件。
只不过tomcat是基于JAVA开发的web服务器,主要解析JAVA代码
5.tomcat与nginx有什么区别?
Nginx仅支持静态资源解析,而tomcat支持解析JAVA开发的web应用,还支持解析静态资源(效率不高)。
Nginx适合做前端负载均衡,而tomcat适合做后端应用服务处理。
通常情况下,是nginx和tomcat结合,由nginx处理静态资源,tomcat处理动态资源。
2.Tomcat环境准备与部署
######二进制将tomcat大礼包上传至Linux
###部署jdk
[root@web01 ~]# mkdir /app
[root@web01 ~]# tar -xf jdk-8u60-linux-x64.tar.gz -C /app/
[root@web01 ~]# ln -s /app/jdk1.8.0_60/ /app/jdk
####java jdk 环境变量
[root@web01 ~]# cat >>/etc/profile<<'EOF'
> export JAVA_HOME=/app/jdk
> export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
> export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
> export TOMCAT_HOME=/app/tomcat
> EOF
[root@web01 ~]# . /etc/profile
#检查 jdk是否部署完成
[root@web01 ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
#部署 tomcat
[root@web01 ~]# tar -xf apache-tomcat-8.5.66.tar.gz -C /app/
[root@web01 ~]# ln -s /app/apache-tomcat-8.5.66/ /app/tomcat
##检查 jdk+tomcat
[root@web01 ~]# /app/tomcat/bin/version.sh
Using CATALINA_BASE: /app/tomcat
Using CATALINA_HOME: /app/tomcat
Using CATALINA_TMPDIR: /app/tomcat/temp
Using JRE_HOME: /app/jdk
Using CLASSPATH: /app/tomcat/bin/bootstrap.jar:/app/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Server version: Apache Tomcat/8.5.66
Server built: May 8 2021 22:44:01 UTC
Server number: 8.5.66.0
OS Name: Linux
OS Version: 3.10.0-1127.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_60-b27
JVM Vendor: Oracle Corporation
3.Tomcat服务管理
1.tomcat相关命令
#tomcat 管理命令
bin目录###/app/tomcat/bin/
主要命令
startup.sh 启动tomcat
shutdown.sh 关闭tomcat
version.sh 部署完成后 检查 jdk 与 tomcat
catalina.sh 卡特琳娜#tomcat核心 脚本 startup shutdown 都会调用这 个脚本 #配置 java启动参数 ,tomcat远程管 理 配置jvm参数
#启动tomcat
[root@web01 ~]# /app/tomcat/bin/startup.sh
Using CATALINA_BASE: /app/tomcat
Using CATALINA_HOME: /app/tomcat
Using CATALINA_TMPDIR: /app/tomcat/temp
Using JRE_HOME: /app/jdk
Using CLASSPATH: /app/tomcat/bin/bootstrap.jar:/app/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
#检查服务是否启动
[root@web01 ~]# ss -lntup|grep java
[root@web01 ~]# ps -ef |grep java
2.Tomcat目录结构
目录 | 含义 |
bin | startup.sh |
shutdown.sh | |
catalina.sh | |
conf/ | tomcat配置文件 |
server.xml #nginx.conf 主配置文件 | |
web.xml #补充 额外功能 | |
tomcat-user.xml #tomcat管理端配置文件 用户名 和 密 码 | |
logs | 日志 |
catalina.out #tomcat最全日志 查看 error startup 启动 的时间 catalina.out切割之后内容不变,未来需要logroate 切割 | |
catalina.2019-12-16.log #catalina.out的切割日志 , | |
localhost_access_log.2019-12-16.txt #tomcat acccess.log 访问日志 | |
webapps | tomcat站点目录 nginx html war包 |
3.Tomcat管理端

Tomcat管理端应用场景 | |
搭建与测试的时候 开启管理端 进 行调试 | 开启管理端 debug |
生产环境中 | 关闭管理端 ,清除管理端相关 文档 |
注意:tomcat 8.5 对管理端限制更严格
要配置tomcat-user.xml之外
还限制只能在本地使用127.0.0.1访问管理的
从tomcat8.5开始管理端默认只能通过本地使用 127.0.0.1访问(类似于nginx allow127.0.0.1 ; deny all;)
默认情况下,只能从与Tomcat运行在同一台计算机上的浏览器访问管理器。如果要修改此限制,则需要编辑管理器的context.xml文件
[root@web01 /app/tomcat]# find -type f -name "context.xml" |xargs grep allow
./webapps/host-manager/META-INF/context.xml: allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
./webapps/manager/META-INF/context.xml: allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
[root@web01 /app/tomcat]# grep allow ./webapps/host-manager/WEB-INF/manager.xml
allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

#重启服务
[root@web01 /app/tomcat]# bin/shutdown.sh
Using CATALINA_BASE: /app/tomcat
Using CATALINA_HOME: /app/tomcat
Using CATALINA_TMPDIR: /app/tomcat/temp
Using JRE_HOME: /app/jdk
Using CLASSPATH: /app/tomcat/bin/bootstrap.jar:/app/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
[root@web01 /app/tomcat]# bin/startup.sh
Using CATALINA_BASE: /app/tomcat
Using CATALINA_HOME: /app/tomcat
Using CATALINA_TMPDIR: /app/tomcat/temp
Using JRE_HOME: /app/jdk
Using CLASSPATH: /app/tomcat/bin/bootstrap.jar:/app/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.


4.tomcat日志与进程信息
1.进程信息
#ps命令查询 java进程信息
[root@web01 /app/tomcat]# ps -ef |grep java
# jps java ps
[root@web01 /app/tomcat]# jps -lvm |grep -v jps
# java 高级命令 Troubleshooting Tools
##jmap 取出 java进程信息 jvm内存信息 heap memory details for a process, core file
##导出 信息
[root@web01 /app/tomcat]# jmap -heap 2016
2.Tomcat日志
catalina.out | 持续增加#error 错误#startup 或 finished 启动所需的时间 |
catalina-年-月-日.log | 日志切割 |
xxxxxaccess.log | 访问日志 |
5.Tomcat配置文件
server.xml
1.端口部分
###8005 shutdown端口
tomcat shutdown端口 telnet/nc 连接到这个端口 输入暗号 tomcat将会关闭

###8080 http协议端口

###8009 ajp协议端口 与apache连接使用
#8009端口 是用来给 apache与tomcat进行连接使用
#现在 tomcat+nginx 可以把 这一行8009注释 提高tomcat性能

2.tomcat管理端 相应的配置
#管理端 实际生产环境 关闭

3.配置 tomcat 虚拟主机的内容
Nginx tomcat
Server_name Host name 域名
root appBase 站点目录
unpackWARs #自动解压war包 #autoDeploy 自动部署 把代码加载到jvm内存中

#%l (小写L) 远程用户
#%u 用户客户端 Remote user that was authenticated (if any), else '-' (escaped if required)
#%t 时间 日期和时间
#" 双引号#
#%r 请求起始行 $request
#%s $status 状态码
#%b 大小
整体配置文件
[root@web01 conf]# cat server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 关闭tomcat的端口 -->
<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" />
<!-- 全局资源限制-conf/tomcat-user.xml指定的 -->
<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 name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 引擎 -->
<Engine name="Catalina" defaultHost="localhost">
<!--调用资源限制-->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--虚拟主机-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>

6.tomcat 部署应用及方式
1. 部署应用方式
如果开发给你的是war包 则把war包放入到 tomcat webapps 自动 解压 自动部署
如果开发给你的是jar包 相当于jar包里面已经集成了tomcat java - jar xxxx.jar
2.java开源软件
zrlog java blog
3.部署应用-zrlog
#tomcat配置文件如下:
[root@web01 tomcat]# cat conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 关闭tomcat的端口 -->
<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" />
<!-- 全局资源限制-conf/tomcat-user.xml指定的 -->
<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 name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 引擎 -->
<Engine name="Catalina" defaultHost="localhost">
<!--调用资源限制-->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--虚拟主机-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="zrlog.com" appBase="webapps/zrlog"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
解压zrlog代码文件
cd /app/tomcat/webapps/zrlog/ROOT/
[root@web01 ROOT]# unzip /root/tomcat大礼包-2022/zrlog-2.1.11-99a5759-release.zip
重启tomcat
[root@web01 tomcat]# bin/shutdown.sh
Using CATALINA_BASE: /app/tomcat
Using CATALINA_HOME: /app/tomcat
Using CATALINA_TMPDIR: /app/tomcat/temp
Using JRE_HOME: /app/jdk
Using CLASSPATH: /app/tomcat/bin/bootstrap.jar:/app/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
[root@web01 tomcat]# bin/startup.sh
Using CATALINA_BASE: /app/tomcat
Using CATALINA_HOME: /app/tomcat
Using CATALINA_TMPDIR: /app/tomcat/temp
Using JRE_HOME: /app/jdk
Using CLASSPATH: /app/tomcat/bin/bootstrap.jar:/app/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
访问web页面

7.tomcat 3种工作模式: bio , nio , apr
1.io模型区别
bio | blocking io | tomcat 7及之 前, 同步模型 阻 塞 | 一个线程处理一个请求,缺 点:并发量高时,线程数较 多,浪费资源。 |
nio | new io | tomcat 8及以后 的工作模式 异步 非阻塞 | nio1(默认的) nio2 可以通过少 量的线程处理大量的请求 |
apr | Apache Portable Runtime | 应对高并发场景 | Tomcat对静态文件的处理性 能。 Tomcat apr也是在Tomcat 上运行高并发应用的首选模式 |
2.查看当前使用的io模型

3.修改io模型
修改配置文件
[root@web01 /app/tomcat/webapps]# grep -ni nio2 ../conf/server.xml
69: <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"

查看修改结果-catalina.out日志
apr
#安装apr环境
yum -y install apr apr-devel tomcat-native
#修改8080&8009端口对应的server.xml
protocol="org.apache.coyote.http11.Http11Nio2Protocol" 把Nio2 修改为Apr
8.tomcat 多实例
多实例:在同一台服务器上面运行多个tomcat
应用场景: 让服务器资源充分利用 使用多实例
注意事项: 端口不同与路径不同.
/app/tomcat 8005
/app/tomcat_8081 8006
/app/tomcat_8082 8007
#配置tomcat多实例 tomcat_8081 tomcat_8082
[root@web01 /app/tomcat/webapps]# cp -r /app/tomcat/ /app/tomcat_8081
[root@web01 /app/tomcat/webapps]# cp -r /app/tomcat/ /app/tomcat_8082
[root@web01 /app/tomcat/webapps]# sed -i 's#8080#8081#g' /app/tomcat_8081/conf/server.xml
[root@web01 /app/tomcat/webapps]# sed -i 's#8005#8006#g' /app/tomcat_8081/conf/server.xml
[root@web01 /app/tomcat/webapps]# sed -i 's#8080#8082#g' /app/tomcat_8082/conf/server.xml
[root@web01 /app/tomcat/webapps]# sed -i 's#8005#8007#g' /app/tomcat_8082/conf/server.xml
挨个启动
然后curl或浏览器访问tomcat多实例
###注意事项
/index.jsp 直接访问首页文件或展示首页文件 #这个首页文件存放在webapps/ROOT下面
:8080/code/index.jsp
9.tomcat的 systemctl管理配置
#编辑/usr/lib/systemd/system/tomcat.service
[root@web01 /app/tomcat/webapps/zrlog]# vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/app/tomcat/bin/startup.sh
ExecStop=/app/tomcat/bin/shutdown.sh
[Install]
WanteBy=multi-user.target
#将启动停止tomcat的脚本添加一个source命令
[root@web01 ~]# sed -i '2a source /etc/profile' /app/tomcat/bin/shutdown.sh /app/tomcat/bin/startup.sh
#重载配置文件
[root@web01 ~]# systemctl daemon-reload
10.故障案例1 tomcat(java) 服务器 运行占用大量swap 物理内存占用较少
java代码问题
增加swap
Linux内核参数:
/etc/sysctl.conf
vm.swappiness=0
sysctl -p
内核参数生效
vm.swappiness=0
控制系统是否优先使用物理内存 数越小 越优先使用物理内存
11.Tomcat的https
参考在CentOS系统Tomcat 8.5或9上部署SSL证书 (aliyun.com)
评论已关闭