Tomcat介绍与部署使用
# Tomcat相关介绍
# Tomcat
- tomcat是一个免费开源的Web应用服务器,是一款比较流行的web应用服务器。
- Tomcat是web应用服务器,也是一个Servlet/JSP容器。Tomcat作为Servlet容器,负责处理客户请求,把请求传送给servlet,并将servlet的响应传送回给客户。
# Servlet
- Servlet是一个基于Java技术的Web组件,他是一个Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。
# Servlet容器
- Tomcat中的Servlet容器叫做Catalina,Servlet容器就是Servlet程序的运行环境。
- Java本身并不支持Servlet规范,要想运行Servlet代码,需要一种支持Servlet规范,实现了Servlet接口和一些基础类的部件,这种部件就是Servlet容器。
# JSP容器
- JSP容器用于将JSP动态网页翻译成Servlet代码。
- JSP 全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML,网页中插入Java代码。标签通常以
<%
开头,以%>
结束。
# 运行JavaWeb应用的方式
- 方式一:使用Tomcat运行war包
- 方式二:通过Java命令运行jar包
- 实际上SpringBoot是使用内置的Tomcat运行jar包,也就是说还是基于tomcat运行的。
# JAVA环境介绍
# JVM
- JVM是Java虚拟机 (Java Vitual Machine)。
- 通过Java虚拟机可以实现Java程序的跨平台性,只要当前环境有Java虚拟机即可。
# JRE
- JRE是Java运行环境 (Java Runtime Enviroment)。
- 就是JVM和相关库文件 (依赖)。
# JDK
- JDK是Java开发环境 (Java Development Kit)。
- JRE+相关命令与工具=JDK,他在JRE的基础上,多了一些相关命令和工具。
- 一般会直接安装JDK环境,主要是为了命令。
# Tomcat部署
# 部署JDK环境
- Tomcat依赖于Java环境运行,所以需要先安装Java环境。
- 注意:部署的JDK版本应当和开发环境的版本保持一致
# 下载JDK二进制包并上传到服务器
https://www.oracle.com/java/technologies/downloads/archive/
# 解压到指定目录
mkdir -p /data/lib/jdk
tar -xvf ./jdk-*.tar.gz -C /data/lib/jdk
# 创建软链接 (方便更新版本)
ln -s /data/lib/jdk/jdk* /data/lib/jdk/jdk
# 配置JAVA环境变量
cat >>/etc/profile<<'EOF'
export JAVA_HOME=/data/lib/jdk/jdk
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
EOF
source /etc/profile
# 验证是否生效
java -version
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 部署Tomcat
# 下载Tomcat并上传到服务器
https://tomcat.apache.org/
# 解压到指定目录
mkdir -p /data/apps/tomcat
tar -xvf ./apache-tomcat-*.tar.gz -C /data/apps/tomcat
# 创建软链接 (方便更新版本)
ln -s /data/apps/tomcat/apache-tomcat* /data/apps/tomcat/tomcat
# 配置TOMCAT环境变量
echo "export TOMCAT_HOME=/data/apps/tomcat/tomcat" >> /etc/profile
source /etc/profile
# 验证是否生效
/data/apps/tomcat/tomcat/bin/version.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Tomcat目录结构
# tomcat/
bin/
- 管理脚本目录startup.sh
- 启动脚本,注意:启动后进程名并非tomcat而是javashutdown.sh
- 关闭脚本catalina.sh
- 管理脚本,核心脚本,启动和关闭脚本实际都是调用它
conf/
- 配置文件目录server.xml
- 主配置文件web.xml
- 配置tomcat内置功能tomcat-users.xml
- 管理端配置文件,线上环境中一般关闭
logs/
- 日志文件目录catalina.out
- Tomcat运行日志access_log.*
- Web访问日志
webapps/
- 站点文件目录lib/
- 依赖文件目录
# Tomcat配置
# Tomcat默认端口
8080
- 站点端口8005
- Shutdown端口8443
- HTTPS端口
# 主配置文件
./tomcat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Tomcat服务端配置
port="8005" # Tomcat关闭端口 (用于通过端口关闭Tomcat, 关闭脚本会请求它进行关闭)
shutdown="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>
<!-- 导入Tomcat管理端配置(正式环境应当注释关闭) -->
<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" />
<!--
引擎配置
defaultHost="默认虚拟主机名" (不同于Nginx默认按载入顺序,Tomcat需要指定)
-->
<Engine name="Catalina" defaultHost="localhost">
<!-- Realm和管理端有关(正式环境可去掉) -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--
虚拟主机配置
name="localhost" # 指定虚拟主机名
appBase="webapps" # 指定站点目录
unpackWARs="true" # 是否自动解压war包
autoDeploy="true" # 是否自动部署, 加载到JVM中
-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!--
阀门配置 - 用于请求到该虚拟主机时调用各种功能
className # 访问日志功能类
directory # 日志存放目录
prefix # 日志文件名前缀
suffix # 日志文件名后缀
pattern # 访问日志格式
-->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="access_log" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 虚拟主机配置
定义在配置的Engine标签中,一个Engine中可定义多个Host。
<Host name="www.test.com" appBase="webapps/www.test.com" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www_access_log" suffix=".log" pattern="%h %l %u %t "%r" %s %b" /> </Host>
1
2
3
4
5<Host>
- 定义一个虚拟主机name="www.test.com"
- 指定虚拟主机名,同等于Nginx的server_nameappBase="webapps/www.test.com"
- 指定站点目录unpackWARs="true"
- 是否自动解压站点目录下的war包autoDeploy="true"
- 是否自动部署,加载到JVM中
<Valve>
- 阀门配置,用于请求到该虚拟主机时调用各种功能className="org.apache.catalina.valves.AccessLogValve"
- 指定访问日志功能类directory="logs"
- 日志存放目录prefix="www_access_log"
- 日志文件名前缀suffix=".txt"
- 日志文件名后缀pattern="%h %l %u %t "%r" %s %b"
- 访问日志格式
# 日志格式配置
- 默认格式是
pattern="%h %l %u %t "%r" %s %b"
- 格式参数:
%h
- 客户端IP地址,对应Nginx的$remote_addr%l
- 逻辑用户名%u
- 认证用户名%t
- 日期和时间,对应Nginx的$local_time%r
- 用户HTTP请求报文的起始行 (请求方法和URL),对应Nginx的$request%s
- 返回的状态码,对应Nginx的$status%b
- 响应报文的大小,对应Nginx的$body_bytes_sent%{xxx}i
- 获取请求报文的指定请求头- 例如:
%{Referer}i
- 对应Nginx的$http_referer%{User-Agent}i
- 对应Nginx的$http_user_agent%{X-Forwarded-For}i
- 对应Nginx的$x_forwarded_for
# 管理端配置文件
Tomcat管理端正式环境应当关闭,因为不太安全
配置Tomcat管理端配置文件,该配置文件需要在主配置文件导入才能生效
vim ./tomcat/conf/tomcat-users.xml
<?xml version="1.0" encoding="UTF-8"?> <tomcat-users xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd" version="1.0"> <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="qwe123123" roles="manager-gui,admin-gui"/> </tomcat-users>
1
2
3
4
5
6
7
8
9修改白名单限制
- 默认只允许本地访问,所以如果需要远程或局域网访问则需要修改白名单。
sed -i 's#127#\\d+#g' ./tomcat/webapps/host-manager/META-INF/context.xml ./tomcat/webapps/manager/META-INF/context.xml
# Tomcat使用
# Tomcat配置systemd管理
# 配置文件存放位置
/usr/lib/systemd/system/xxx.service
- systemctl通过读取该路径下的配置文件,实现管理服务的功能 (yum安装的服务一般自带配置)
- 配置好后使用
systemctl daemon-reload
命令重新加载配置
# 配置例子
# [Unit] - 用于书写注释、服务作用、声明该服务所依赖的服务等
# [Service] - 核心配置,指定服务开启、关闭、重启分别使用的命令、环境变量配置文件等
# [Install] - 指定运行级别
[Unit]
# 服务描述 (可有可无)
Description=OpenSSH server daemon
# main帮助 (可有可无)
Documentation=man:sshd(8) man:sshd_config(5)
# 核心依赖服务,该服务需要在这些服务运行后才能运行
After=network.target sshd-keygen.service
# 依赖服务
Wants=sshd-keygen.service
[Service]
# 服务的类型,一般用notify或forking即可
forking - fork一个子进程,等待命令完成后退出,多用于后台进程
notify - 当前服务启动完毕,会通知Systemd,再继续往下执行
Type=notify
# 指定环境变量文件 (一般放到/etc/sysconfig/目录下)
EnvironmentFile=/etc/sysconfig/sshd
# 执行启动命令前执行的命令,该参数可有多个
ExecStartPre=xxxx
# 服务启动命令
ExecStart=/usr/sbin/sshd -D $OPTIONS
# 服务重启命令
ExecReload=/bin/kill -HUP $MAINPID
# ExecStop和KillMode二选一即可,建议使用ExecStop
# 服务关闭命令
ExecStop=xxx
# 服务关闭方式
KillMode=process
# 自动重启策略
# on-failure表示服务启动失败时自动重启
Restart=on-failure
# 自动重启间隔
RestartSec=42s
[Install]
# 运行级别,一般都是multi-user.target
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Tomcat运行Java程序
# 将war包放到站点目录./tomcat/webapps/下
- 站点目录是由
conf/server.xml
中的虚拟主机配置决定的。
- 站点目录是由
# 运行Tomcat
- 运行后,如果webapps下没有和war包同名的目录,Tomcat就会自动解压并部署webapps下的war包。且在Tomcat运行期间添加war包到webapps目录下,也会执行自动部署。
- 比如:
- webapps目录下有hello.war,但没有hello目录,则会自动解压。
- webapps目录下同时有hello.war和hello目录,则不会解压。
- 运行后,如果webapps下没有和war包同名的目录,Tomcat就会自动解压并部署webapps下的war包。且在Tomcat运行期间添加war包到webapps目录下,也会执行自动部署。
# 访问站点
192.168.10.11:8080/资源路径
# Tomcat的URL资源查找方式
- 如果用户访问的URL是站点根目录下的资源,例如:
www.test.com/index.jsp
,则Tomcat不会直接在站点目录./下查找index.jsp,而是在站点目录下的./ROOT/中查找index.jsp。- 所以如果需要通过根目录访问,则需要将war包重命名为ROOT.war,使其解压后目录名为ROOT。
- 如果用户访问的URL不是根目录的资源,例如:
www.test.com/hello/index.jsp
,则Tomcat会在站点目录下的./hello/下查找index.jsp
# Tomcat请求处理流程
- 用户发出请求。
- 用户请求通过Connector连接器暴露的指定端口到达连接器中,由连接器来处理HTTP请求。
- 然后连接器会将请求交给Engine中配置的Host虚拟主机进行处理。
- 处理完后返回响应给客户。
# WEBAPP应用目录结构
META-INF
- 元数据WEB-INF
- 站点数据db.properties
- 数据库连接配置classes/
- 存放Java类文件的目录lib/
- 存放所需要的jar包的目录
# TOMCAT多实例
- 同一机器运行多个Tomcat实例,使得更充分的使用硬件资源。
- 配置方式
- 首先JDK环境是共用的,无需额外部署。
- 然后我们复制Tomcat整个目录文件,目录名可以跟上要监听的端口。
- 例如:tomcat_8080、tomcat_8081之类的。
- 然后我们需要修改Tomcat配置,监听的端口配置(8080、8005、8443)、虚拟主机配置。
- 虚拟主机的appBase目录建议就设定在默认的webapps中,可以在其指定子目录。例如:
webapps/www.test.com
- 虚拟主机的appBase目录建议就设定在默认的webapps中,可以在其指定子目录。例如: