tomcat汇总

声明:本文大多数借鉴于网络,如有雷同,望见谅!!!

1.tomcat的目录结构

1:配置文件

1:核心配置文件server.xml
server.xml的每一个元素都对应了Tomcat中的一个组件,server.xml位于$TOMCAT_HOME/conf目录下;下面是server.xml的主要配置

<--server是整个配置文件的根元素  shutdown属性表示关闭Server的指令;port属性表示Server接收shutdown指令的端口号,设为-1可以禁掉该端口-->
<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.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <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">
   <--连接器,代表了外部客户端发送请求到特定Service的接口;同时也是外部客户端从特定Service接收响应的接口-->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <--容器  -->
   <--容器的功能是处理Connector接收进来的请求,并产生相应的响应。Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。一个Engine组件可以处理Service中的所有请求,一个Host组件可以处理发向一个特定虚拟主机的所有请求,一个Context组件可以处理一个特定Web应用的所有请求  -->
  <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 &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

通过配置第1个Connector,客户端可以通过8080端口号使用http协议访问Tomcat。其中,protocol属性规定了请求的协议,port规定了请求的端口号,redirectPort表示当强制要求https而请求是http时,重定向至端口号为8443的Connector,connectionTimeout表示连接的超时时间

Tomcat监听HTTP请求,使用的是8080端口,而不是正式的80端口;实际上,在正式的生产环境中,Tomcat也常常监听8080端口,而不是80端口。这是因为在生产环境中,很少将Tomcat直接对外开放接收请求,而是在Tomcat和客户端之间加一层代理服务器(如nginx),用于请求的转发、负载均衡、处理静态文件等;通过代理服务器访问Tomcat时,是在局域网中,因此一般仍使用8080端口

客户端可以通过8009端口号使用AJP协议访问Tomcat。AJP协议负责和其他的HTTP服务器(如Apache)建立连接;在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。之所以使用Tomcat和其他服务器集成,是因为Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器;因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接

客户端访问服务器

2:Servlet标准的web.xml部署文件,web.xml文件加载页面等静态文件

(1)指定欢迎页面,也就是首页

<welcome-file-list> 
<welcome-file>index.jsp</welcome-file>
<welcome-file>login.html</welcome-file>  
</welcome-file-list> 

(2)给Servlet命名 将test包下的JspServlet类命名为jsp,JspServlet专门处理jsp

<servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>test.JspServlet</servlet-class>
    </servlet>

(3)给Servlet定制URL,通过在浏览器输入localhost:8080/hello.do就能匹配到该名为jsp的Servlet

<servlet-mapping> 
<servlet-name>jsp</servlet-name> 
<url-pattern>hello.do</url-pattern> 
</servlet-mapping>

<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

(4)配置session的有效时间,一般是30分钟

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

(5)mime-type映射,其实就是Tomcat处理的文件类型

<mime-mapping>
    <extension>zip</extension>
    <mime-type>application/zip</mime-type>
</mime-mapping>

3:tomcat三种部署方式
第一种:隐式部署
直接用eclipse打war包,解压后生成META_INF WEB_INF, 我们在tomcat的目录webapps下面新建一个文件夹ROOT,然后把这两个文件放到ROOT文件夹下面,这样访问地址不用加项目名字:localhost:8080/; 如果我们需要有项目名,我们可以在webapps下面建个文件夹,名字随便起(正常是你的项目名),比如名字是myproject,然后我们还是把那两个文件放到myproject下面,这样我们访问就是:localhost:8080/myproject/
第二种 :显示部署
我们把编译后的那两个文件(META_INF WEB_INF),随便找个文件夹放到下面,比如:我把那两个文件放到/usr/local/testbushu ;然后打开tomcat下conf/server.xml,在<Host> </Host>标签之间输入项目配置信息
<Context path="" docBase="/usr/local/testbushu" reloadable="true" />
path:浏览器访问时的路径名
docBase:web项目的WebRoot所在的路径,注意是WebRoot的路径,不是项目的路径。其实也就是编译后的项目
reloadble:设定项目有改动时,tomcat是否重新加载该项目
我访问路径是:localhost:8080/;
如果把配置改为:<Context path="/xx" docBase="/usr/local/testbushu" reloadable="true" />
访问路径是:localhost:8080/xx/;
第三种:热部署

进入到 apache-tomcat-7.0.52\conf\Catalina\localhost 目录,新建一个 项目名.xml 文件,名字是:sanmenthod.xml 内容是:<Context  docBase="/usr/local/testbushu" reloadable="true" />,访问路径是:localhost:8080/sanmenthod/

如果我们把文件名字改为ROOT.xml 内容还是那个, 访问路径是:localhost:8080/
原文链接:https://blog.csdn.net/qice675563721/article/details/79774296

4:tomcat架构


tomcat架构示意图.png

两大核心组件
Connector组件:连接器,主要负责Tomcat与客户端的通讯
Container组件:Servlet容器
httpConnector:链接器
httpProcessor:具体的处理类


tomcat流程图.png

5:Tomcat Server处理一个HTTP请求的过程
Tomcat Server处理一个HTTP请求的过程.png

(1)、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得
(2)、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
(3)、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。
(4)、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)
(5)、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。
(6)构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序
(7)Context把执行完之后的HttpServletResponse对象返回给Host
(8)Host把HttpServletResponse对象返回给Engine
(9)Engine把HttpServletResponse对象返回Connector
(10)Connector把HttpServletResponse对象返回给客户Browser
6:Tomcat顶层结构


Tomcat顶层结构.png

Server:服务器的意思,代表整个tomcat服务器,一个tomcat只有一个Server;

Service:Server中的一个逻辑功能层, 一个Server可以包含多个Service;

Connector:称作连接器,是Service的核心组件之一,一个Service可以有多个Connector,主要是连接客户端请求;一个Service可以有多个Connector,但只能有一个Container

Container:Service的另一个核心组件,按照层级有Engine,Host,Context,Wrapper四种,一个Service只有一个Engine,其主要作用是执行业务逻辑;

Jasper:JSP引擎;

Session:会话管理;


Connector解析.png

Connector使用ProtocolHandler来处理请求的
ProtocolHandler由包含了三个部件:
Endpoint用来处理底层Socket的网络连接。Processor用于将Endpoint接收到的Socket封装成Request。
Adapter充当适配器,用于将Request转换为ServletRequest交给Container进行具体的处理


Container解析.png

Engine:引擎、只有一个定义了一个名为Catalina的Engine
Host:站点、虚拟主机一个Engine包含多个Host的设计,使得一个服务器实例可以承担多个域名的服务,是很灵活的设计

Context:一个应用默认配置下webapps下的每个目录都是一个应用
Wrapper:一个Servlet
7:嵌入式Tomcat
非传统的部署方式,将Tomcat嵌入到主程序中进行运行。Springboot默认集成的是Tomcat容器,嵌入式启动就是调用了Tomcat的API来实现的,因为Tomcat本身提供了外部可以调用的API
Maven集成Tomcat插件
Tomcat 7 Maven插件:tomcat7-maven-plugin

<dependency>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
</dependency>

Tomcat类是外部调用Tomcat的接口,spring boot启动就是调用这个类。tomcat-embed-core这个jar包下有tomcat类
1.位置:org.apache.catalina.startup.Tomcat
2.该类是public的。
3.该类有Server、Service、Engine、Connector、Host等属性。
4.该类有init()、start()、stop()、destroy()等方法。
8:tomcat调优
原文链接:https://blog.csdn.net/qq_28109171/article/details/84256783
(1)修改内存等 JVM相关配置

JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m
windows下修改TOMCAT_HOME/bin/catalina.bat
set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m
//参数介绍
//-server:启用 JDK的 server 版本;
//-Xms:Java虚拟机初始化时堆的最小内存,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能;
//-Xmx:Java虚拟机可使用堆的最大内存;
//-XX:PermSize:Java虚拟机永久代大小;
//-XX:MaxPermSize:Java虚拟机永久代大小最大值;

(2)Connector 优化
Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以 Connector的优化是重要部分。默认情况下 Tomcat只支持200线程访问,超过这个数量的连接将被等待甚至超时放弃,所以我们需要提高这方面的处理能力。


connector相关设置.png

(3)缓存优化


缓存相关设置.png

(4)web.xml优化
应用程序运行时最终会加载conf/web.xml和应用的web.xml的合集
servlet优化,当前应用是REST应用(微服务):

1.去掉不必要的资源:JspServlet
2.seesion也可以移除
valve优化:
移除掉AccessLogValve
valve实现都需要消耗java应用的计算时间,一般我们可以使用nginx来记录日志
(5)SpringBoot中Tomcat优化
Maven中Springboot引入Tomcat

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

设置线程池
server.tomcat.max-threads=1000

关闭Accesslog日志
server.tomcat.accesslog=false

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容