您的位置 首页 > 腾讯云社区

面试BAT大厂必知的Tomcat容器---程序员小强

预计阅读时间: 10分钟

一、Tomcat各组件

1、认识Tomcat

Tomcat是一个基于JAVA的WEB容器,其实现了JAVA EE中的 Servlet 与 jsp 规范,与Nginx apache 服务器不同在于一般用于动态请求处理。在架构设计上采用面向组件的方式设计。即整体功能是通过组件的方式拼装完成。另外每个组件都可以被替换以保证灵活性。

那么是哪些组件组成了Tomcat呢?

2.Tomcat 各组件及关系Server 和 ServiceConnector 连接器HTTP 1.1SSL httpsAJP( Apache JServ Protocol) apache 私有协议,用于apache 反向代理TomcatContainerEngine 引擎 catalinaHost 虚拟机 基于域名 分发请求Context 隔离各个WEB应用 每个Context的 ClassLoader都是独立ComponentManager (管理器)logger (日志管理)loader (载入器)pipeline (管道)valve (管道中的阀)3.Tomcat启动参数说明

我们平时启动Tomcat过程是怎么样的?

复制WAR包至Tomcat webapp 目录。执行starut.bat 脚本启动。启动过程中war 包会被自动解压装载。

但是我们在Eclipse 或idea 中启动WEB项目的时候 也是把War包复杂至webapps 目录解压吗?显然不是,其真正做法是在Tomcat程序文件之外创建了一个部署目录,在一般生产环境中也是这么做的 即:Tomcat 程序目录和部署目录分开 。我们只需要在启动时指定CATALINA_HOME 与 CATALINA_BASE 参数即可实现。

启动参数

描述说明

JAVA_OPTS

jvm 启动参数 , 设置内存 编码等 -Xms100m -Xmx200m -Dfile.encoding=UTF-8

JAVA_HOME

指定jdk 目录,如果未设置从java 环境变量当中去找。

CATALINA_HOME

Tomcat 程序根目录

CATALINA_BASE

应用部署目录,默认为$CATALINA_HOME

CATALINA_OUT

应用日志输出目录:默认$CATALINA_BASE/log

CATALINA_TMPDIR

应用临时目录:默认:$CATALINA_BASE/temp

可以编写一个脚本 来实现自定义配置: 演示自定义启动Tomcat

下载并解压Tomcat 创建并拷贝应用目录 创建Tomcat.sh 编写Tomcat.sh chmod +x tomcat.sh 添加执行权限 拷贝conf 、webapps 、logs至应用目录。 执行启动测试。#!/bin/bash export JAVA_OPTS="-Xms100m -Xmx200m" export JAVA_HOME=/root/svr/jdk/ export CATALINA_HOME=/usr/local/apache-tomcat-8.5.34 export CATALINA_BASE="`pwd`" case $1 in start) $CATALINA_HOME/bin/catalina.sh start echo start success!! ;; stop) $CATALINA_HOME/bin/catalina.sh stop echo stop success!! ;; restart) $CATALINA_HOME/bin/catalina.sh stop echo stop success!! sleep 2 $CATALINA_HOME/bin/catalina.sh start echo start success!! ;; version) $CATALINA_HOME/bin/catalina.sh version ;; configtest) $CATALINA_HOME/bin/catalina.sh configtest ;; esac exit 0 二、Tomcat server.xml 配置

Server 的基本基本配置:

<Server> <Listener /><!-- 监听器 --> <GlobaNamingResources> <!-- 全局资源 --> </GlobaNamingResources <Service> <!-- 服务 用于 绑定 连接器与 Engine --> <Connector 8080/> <!-- 连接器--> <Connector 8010 /> <!-- 连接器--> <Connector 8030/> <!-- 连接器--> <Engine> <!-- 执行引擎--> <Logger /> <Realm /> <host "www.tl.com" appBase=""> <!-- 虚拟主机--> <Logger /> <!-- 日志配置--> <Context "/luban" path=""/> <!-- 上下文配置--> </host> </Engine> </Service> </Server>

元素说明: **server ** root元素:server 的顶级配置 主要属性: port:执行关闭命令的端口号 shutdown:关闭命令

演示shutdown的用法#基于telent 执行SHUTDOWN 命令即可关闭 telent 127.0.0.1 8005 SHUTDOWN

service 服务:将多个connector 与一个Engine组合成一个服务,可以配置多个服务。

Connector 连接器:用于接收 指定协议下的连接 并指定给唯一的Engine 进行处理。主要属性:

protocol 监听的协议,默认是http/1.1port 指定服务器端要创建的端口号minThread 服务器启动时创建的处理请求的线程数maxThread 最大可以创建的处理请求的线程数enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理connectionTimeout 指定超时的时间数(以毫秒为单位)SSLEnabled 是否开启 sll 验证,在Https 访问时需要开启。 演示配置多个Connector <Connector port="8860" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8862" URIEncoding="UTF-8" useBodyEncodingForURI="true" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript" maxThreads="1024" minSpareThreads="200" acceptCount="800" enableLookups="false" />

Engine 引擎:用于处理连接的执行器,默认的引擎是catalina。一个service 中只能配置一个Engine。主要属性:name 引擎名称 defaultHost 默认host

Host 虚拟机:基于域名匹配至指定虚拟机。类似于nginx 当中的server,默认的虚拟机是localhost. 主要属性:

演示配置多个Host<Host name="www.luban.com" appBase="/usr/www/luban" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.luban.com.access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> </Host>

Context 应用上下文:一个host 下可以配置多个Context ,每个Context 都有其独立的classPath。相互隔离,以免造成ClassPath 冲突。主要属性:

演示配置多个Context<Context docBase="hello" path="/h" reloadable="true"/>

Valve 阀门:可以理解成request 的过滤器,具体配置要基于具体的Valve 接口的子类。以下即为一个访问日志的Valve.

End

---来自腾讯云社区的---程序员小强

关于作者: 瞎采新闻

这里可以显示个人介绍!这里可以显示个人介绍!

热门文章

留言与评论(共有 0 条评论)
   
验证码: