轻松驾驭Tomcat

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。

img_e321f847a01cef037692e1f70ec620d9.png

  • Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
  • 诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0。

一、Tomcat体系架构

img_8355e045172bf08c6bc57726b7900b61.png

核心组件

server:相当于一个tomcat实例。接收并解析请求信息;完成相关动作后把响应结果返回给计算机。
service:每个server包含多个service,相互独立,仅共享JVM以及类库。用于把连接器(connector)与引擎(engine)关连起来,且一个service只能有一个engine,但是可以有多个connector。因为engine无法直接接受连接器发来的数据。
connector:负责开启socket并监听客户端请求、返回响应数据。多个connector监听多个端口
engine:负责具体的处理请求,connector仅仅负责监听,收到数据后交给engine运行。
host:在ngine中可以包含多个host,每个host定义了虚拟主机
context:每个context可以部署一个web应用。一个host可以存在多个context。如果部署多个应用需要分别对每个应用装载所依赖的库,这个步骤可以自动可以手动。

二、Tomcat的安装

tomcat其实就是一个JAVA程序,所以要运行在JAVA虚拟机中。要运行虚拟机就要先安装JDK。

1.JDK的安装

1.通过YUM安装
yum install java-1.8.0-openjdk-devel
2.配置环境变量
vim /etc/profile.d/java.sh
 export JAVA_HOME=/usr/java/latest                  # 首先定义JAVA_HOME的环境变量
 export PATH=$JAVA_HOME/bin:$PATH                   # 然后向后追加即可

###2.Tomcat的安装
首先要从Tomcat的官网下载Tomcat,然后上传至服务器解压。 https://tomcat.apache.org

1.将下载的软件包解压
tar xf apache-tomcat-VERSION.tar.gz  -C /usr/local/
cd /usr/local

2.创建软连接,或者将解压的tomcat直接改名为tomcat也能达到同样的效果
ln -sv apache-tomcat-VERSION  tomcat

3.添加环境变量
vim /etc/profile.d/tomcat.sh 
    export CATALINA_BASE=/usr/local/tomcat
    export PATH=$CATALINA_BASE/bin:$PATH    

4.创建tomcat需要的用户
useradd tomcat

5.将安装包的路径下的所有属组都改为tomcat
chown -R root.tomcat /usr/local/tomcat                      # 设定所有者为root,所属组为tomcat
chown -R tomcat /usr/local/tomcat/{logs,temp,work,webapps}  # 仅将需要有写权限文件所有者改为tomcat
chmod g+r /usr/local/tomcat/conf                            # 默认没有权限,会导致启动失败

5.切换到tomcat用户最后启动服务即可
su - tomcat 
catalina.sh start                                   # 启动tomcat。catalina.sh命令需要先添加环境变量

三、Tomcat服务的配置文件结构

bin:   脚本、以及Tomcat自身所携带的工具包
conf:  Tomcat服务的配置文件目录;
lib:   库文件,Java类库,jar;
logs:  日志文件目录;
temp:  临时文件目录;
webapps:webapp的默认目录;相当于页面的根目录。部署的应用都应该在IC目录下
work:  工作目录,存放编译后的字节码文件;

四、部署测试页面

创建一个测试页面,将下面的步骤全部做完后,通过浏览器访问http://IP:8080/test 即可访问到测试的页面

1.创建文件夹,classes、lib、WEB-INF为一个标准应用应该有的目录,这里创建仅仅为了与标准看齐
mkidr  -pv  /usr/share/tomcat/webapps/test/{classes,lib,WEB-INF}    

2.创建一个测试页面用于检验Tomcat服务是否能正常提供服务
vim /usr/local/tomcat/webapps/test/index.jsp                        # 创建jsp测试页面
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
    <head>
        <title>Test Page</title>
    /head>
<body>
    <% out.println("hello world");
    %>
</body>
</html

3.重启服务
systemctl restart tomcat                        

4.部署完成后在webapp目录自动生成一些目录
cd  /usr/share/tomcat/work/Catalina             # 部署完成后自动生成的test目录下的文件
[root@localhost Catalina]# tree .
.
└── localhost                                   # 默认主机站点
    ├── _
    ├── docs
    ├── examples
    ├── host-manager
    ├── manager
    ├── sample
    └── test                                    # webpp应用名称。自动生成以下目录
        └── org
            └── apache
                └── jsp
                    ├── index_jsp.class
                    └── index_jsp.java

五、Tomcat的至 配置文件

1.service组件

前面讲到connecotr负责接收用户请求,而engine负责接处理用户请求。但是connecotr并不能与engine直接通信。所以service就是负责将connector与engine连接起来的组件

<Service name="Catalina">

2.connector组件

connector负责接收客户端发来的请求,常见的连接有三种:http、https、ajp
进入tomcat的请求可分为两类:

(1) standalone : 请求来自于客户端浏览器;

(2) 由其它的web server反代:来自前端的反代服务器,通过反带服务器发来的又有以下几种;

  • nginx --> http connector --> tomcat
  • httpd(proxy_http_module) --> http connector --> tomcat
  • httpd(proxy_ajp_module) --> ajp connector --> tomcat
  • httpd(mod_jk) --> ajp connector --> tomcat
    示例

    <Connector port="8080"              # 默认有两个connector一个监听http一个监听ajp
    protocol="HTTP/1.1"             # 如果是http可以无需指明协议。AJP的话Protocol="AJP/1.3"
    connectionTimeout="20000"       # 超时时长,毫秒即20s
    redirectPort="8443"             # 如果请求的为SSL请求就将请求转发至8443端口
    address:                       # 监听的IP地址;默认为本机所有可用地址;不写就监听本地所有IP
    maxThreads:                    # 最大并发连接数,默认为200;
    enableLookups:                 # 是否启用DNS查询功能;将IP地址解析为域名。关闭提升性能
    acceptCount:                   # 等待队列的最大长度;
    secure:                        # =true的表示使用SSL通信
    sslProtocol:                   # 设定使用哪个SSL协议,通常在tomcat上不建议使用SSL,速度太慢
    />

3.Engine组件

Engine组件负责处理发来的请求。
Engine是Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定义默认的虚拟主机。
示例

<Engine name="Catalina" defaultHost="localhost">
name=Catalina                   # 引擎的名称
defaultHost="localhost"         # 默认的响应主机站点。如果找不到合适,或者域名不匹配选择默认host
jvmRoute=                       # Tomcat做集群时的调度标志,类似于HAproxy的会话标识。
                                # 在基于cookie绑定时会用到
...
<Engine>

4.Host组件

Host组件位于engine内部用于接收请求并进行相应处理的主机或虚拟主机

 <Host    name="localhost"          # 设定为主机名即可
          appBase="webapps"         # webapps的默认存放路径(相对路径,可以用绝对路径)。相当站点根
          unpackWARs="true"         # true为自动展开WAR文件
          autoDeploy="true">        # 是否开启自动部署功能。
                                    #unpackWARS、autoDeploy定义了WebAPP为WAR格式且在根下时自动部署
</Host>

5.Context组件

包含在Host标签里。
如果在一个主机上部署多个app的话,Context就可以用来定义不同app对应的路径。

<Context path="/PATH"                   # 网页的RUL
docBase="/PATH/TO/SOMEDIR"              # 真实路径。
reloadable=""/>                         # 如果为true说明可以重新装载

6.valve组件

Valve存在多种类型:
定义访问日志:org.apache.catalina.valves.AccessLogValve
定义访问控制:org.apache.catalina.valves.RemoteAddrValve

<Valve className="org.apache.catalina.valves.AccessLogValve"       # 定义记录日志要访问的类
                    directory="logs"                               # 日志文件的目录路径,默认在/var/log/tomcat下
                    prefix="node1_test_access_"                    # 日志文件的前缀
                    suffix=".log"                                  # 日志文件的后缀
                    pattern="%h %l %u %t &quot;%r&quot; %s %b" />  # 记录日志的格式
                pattern="%h %l %u %t &quot;%r&quot; %s %b" />
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
应用服务中间件
tomcat系统架构笔记
tomcat系统架构笔记
80 0
tomcat系统架构笔记
|
Java 应用服务中间件 程序员
【Tomcat】贰-Tomcat集成到Idea:解放双手,让Tomcat的操作没有那么难用
【Tomcat】贰-Tomcat集成到Idea:解放双手,让Tomcat的操作没有那么难用
【Tomcat】贰-Tomcat集成到Idea:解放双手,让Tomcat的操作没有那么难用
|
XML Java 应用服务中间件
【Tomcat】壹 - Tomcat的快速入门:你也许会用Tomcat,但你真的了解它吗?本文章收录了Tomcat的简介、Tomcat各文件夹的作用、Tomcat的安装卸载使用,手动部署Tomcat
【Tomcat】壹 - Tomcat的快速入门:你也许会用Tomcat,但你真的了解它吗?本文章收录了Tomcat的简介、Tomcat各文件夹的作用、Tomcat的安装卸载使用,手动部署Tomcat
【Tomcat】壹 - Tomcat的快速入门:你也许会用Tomcat,但你真的了解它吗?本文章收录了Tomcat的简介、Tomcat各文件夹的作用、Tomcat的安装卸载使用,手动部署Tomcat
|
网络协议 Java 关系型数据库
99%的人看了它都会说这是一篇很全的tomcat服务❤️❤️[⭐建议收藏⭐]
99%的人看了它都会说这是一篇很全的tomcat服务❤️❤️[⭐建议收藏⭐]
224 0
99%的人看了它都会说这是一篇很全的tomcat服务❤️❤️[⭐建议收藏⭐]
|
设计模式 算法 应用服务中间件
Tomcat原理系列之五:Tomcat有哪些优秀设计
读Tomcat也有一段时间了.读源码目的不仅仅是在了解其运行的原理,还有就是借鉴其优秀设计,并应用到日常的编码中去
Tomcat原理系列之五:Tomcat有哪些优秀设计
|
设计模式 网络协议 Java
聊聊Tomcat的架构设计
Tomcat 里面藏着很多值得我们每个 Java WEB 开发者学习的知识,可以这么说,当你弄懂了 Tomcat 的设计原理,Java WEB 开发对你来说已经没有什么秘密可言了。本篇文章主要是跟大家聊聊 Tomcat 的内部架构体系,让大家对 Tomcat 有个整体的认知。
176 0
聊聊Tomcat的架构设计
|
存储 Java 应用服务中间件
Tomcat源码学习系列之一:Tomcat架构分析
本篇为Tomcat源码学习的开篇,主要通过阅读Tomcat的源码来了解其真正的运行流程以及原理,同时学习其中的架构设计等等。本文主要说明Tomcat的架构。 Tomcat架构 一次HTTP请求在tomcat中的流程 总结
Tomcat源码学习系列之一:Tomcat架构分析
|
运维 Java 应用服务中间件
用了 10 多年的 Tomcat 居然有bug !
为了解决分布式链路追踪的问题,我们引入了实现OpenTracing的Jaeger来实现。然后我们为SpringBoot框架写了一个starter以让用户实现近零改造接入全链路。
174 0
用了 10 多年的 Tomcat 居然有bug !