ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

  • 虚拟化服务

  • 数据库服务

  • 监控服务

  • Web服务

    • Nginx笔记

    • Tomcat笔记

      • Tomcat介绍与部署使用
        • Tomcat相关介绍
          • Tomcat
          • Servlet
          • Servlet容器
          • JSP容器
          • 运行JavaWeb应用的方式
        • JAVA环境介绍
          • JVM
          • JRE
          • JDK
        • Tomcat部署
          • 部署JDK环境
          • 部署Tomcat
        • Tomcat目录结构
          • tomcat/
        • Tomcat配置
          • Tomcat默认端口
          • 主配置文件
          • 虚拟主机配置
          • 日志格式配置
          • 管理端配置文件
        • Tomcat使用
          • Tomcat配置systemd管理
          • Tomcat运行Java程序
          • Tomcat的URL资源查找方式
          • Tomcat请求处理流程
          • WEBAPP应用目录结构
          • TOMCAT多实例
      • Tomcat监控与排错思路
      • Tomcat优化
  • 数据处理

  • Ops
  • Web服务
  • Tomcat笔记
Hoshinozora
2023-03-09
目录

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

# 部署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

# Tomcat目录结构

# tomcat/

  • bin/ - 管理脚本目录
    • startup.sh - 启动脚本,注意:启动后进程名并非tomcat而是java
    • shutdown.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 &quot;%r&quot; %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

# 虚拟主机配置

  • 定义在配置的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 &quot;%r&quot; %s %b" />
    
    </Host>
    
    1
    2
    3
    4
    5
  • <Host> - 定义一个虚拟主机

    • name="www.test.com" - 指定虚拟主机名,同等于Nginx的server_name
    • appBase="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 &quot;%r&quot; %s %b" - 访问日志格式

# 日志格式配置

  • 默认格式是pattern="%h %l %u %t &quot;%r&quot; %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

# Tomcat运行Java程序

  1. # 将war包放到站点目录./tomcat/webapps/下
    • 站点目录是由conf/server.xml中的虚拟主机配置决定的。
  2. # 运行Tomcat
    • 运行后,如果webapps下没有和war包同名的目录,Tomcat就会自动解压并部署webapps下的war包。且在Tomcat运行期间添加war包到webapps目录下,也会执行自动部署。
      • 比如:
      • webapps目录下有hello.war,但没有hello目录,则会自动解压。
      • webapps目录下同时有hello.war和hello目录,则不会解压。
  3. # 访问站点
    • 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请求处理流程

  1. 用户发出请求。
  2. 用户请求通过Connector连接器暴露的指定端口到达连接器中,由连接器来处理HTTP请求。
  3. 然后连接器会将请求交给Engine中配置的Host虚拟主机进行处理。
  4. 处理完后返回响应给客户。

# WEBAPP应用目录结构

  • META-INF - 元数据
  • WEB-INF - 站点数据
    • db.properties - 数据库连接配置
    • classes/ - 存放Java类文件的目录
    • lib/ - 存放所需要的jar包的目录

# TOMCAT多实例

  • 同一机器运行多个Tomcat实例,使得更充分的使用硬件资源。
  • 配置方式
    1. 首先JDK环境是共用的,无需额外部署。
    2. 然后我们复制Tomcat整个目录文件,目录名可以跟上要监听的端口。
      • 例如:tomcat_8080、tomcat_8081之类的。
    3. 然后我们需要修改Tomcat配置,监听的端口配置(8080、8005、8443)、虚拟主机配置。
      • 虚拟主机的appBase目录建议就设定在默认的webapps中,可以在其指定子目录。例如:webapps/www.test.com
#Web#Java#Tomcat
Nginx优化
Tomcat监控与排错思路

← Nginx优化 Tomcat监控与排错思路→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式