tomcatlocalhost不到_【拉勾教育】学习笔记:程序猿必须知道的关于
tomcatlocalhost不到_【拉勾教育】学习笔记:程序猿必须
知道的关于Tomca。。。
⾝为 Java 程序员,Tomcat 应该算是我们接触的最多的 web 容器了。同时,作为企业⽣产⼯具的 “⼋阿哥” 们,平常只顾着埋头写 BUG,哪有什么时间整理⽤过的知识点。今天,我将和⼤家⼀起梳理⼀下关于 Tomcat 的相关内容,由浅⼊深,从⼊门到放弃。奥利给~!
⼀、HTTP 请求处理流程
如上图所⽰:
1. ⽤户通过浏览器发起请求。
2. 浏览器向⽬标服务器发起 TCP 连接请求。
3. 经过三次握⼿后客户端浏览器与⽬标服务器成功建⽴ TCP 连接。(基于 Socket 实现)
4. 浏览器⽣成 HTTP 格式的数据包。
5. 浏览器发送 TCP 请求数据包。(这个数据包的请求头为 TCP 格式的请求头,上⼀步封装的HTTP 格式的数据包被作为 TCP 请求体
传送⾄服务器)
6. 服务器解析 TCP 请求体中的 HTTP 数据包。
7. 服务器处理请求,完成相关业务逻辑。
8. 服务器⽣成 HTTP 格式的响应数据包。
9. 服务器将响应数据包发送⾄客户端浏览器。
10. 浏览器解析 HTTP 格式的响应数据包。(解析出的数据为静态数据如:HTML、CSS、JS、图⽚等)
11. 浏览器渲染响应结果,呈现静态数据给⽤户。
⼆、Tomcat 总体架构说明
Tomcat 作为 Servlet 容器从软件运⾏⾓度看,主要可以分为两⼤模块,⼀个是 Http 请求接收、响应模块(Coyote),另⼀个是请求处理模块,即从 Servlet 容器中获取与请求对应的处理⽅法并执⾏(Catalina)。
Coyote 连接器包含以下两个模块:
1. ProtocolHandler 协议处理接⼝。这个接⼝通过 Endpoint 和 Processor ,实现针对具体协议的处 理能⼒。Tomcat 按照协议和 I/O 提
供了6个实现类 : AjpNioProtocol ,AjpAprProtocol,AjpNio2Protocol , Http11NioProtocol ,Http11Nio2Protocol
,Http11AprProtocol
EndPoint 是⽤来实现 TCP/IP 协议的,是 Coyote 通信的端点,即通信监听的接⼝。是具体 Socket 接收和发送处理器。EndPoint 是对传输层的抽象。
Processor ⽤来实现 HTTP 协议,可将来⾃ EndPoint 的 Socket,读取字节流解析成 Tomcat ⾃⼰定义的 Request 和 Response 对象。Processor 是对应⽤层协议的抽象(注意:这⾥的 Tomcat Request 和 Response 对象,还不是我们在 Servlet 中所⽤到的ServletRequest 和 ServletResponse
对象。)
2. Adapter 由于请求协议的不同,客户端发送⾄后台的请求信息也不尽相同。为了能够转换成统⼀的 ServletRequest 和 ServletResponse 对象⽅便 Servlet 容器处理业务,则需要该接⼝的实现类,对发送⾄ Tomcat 的请求进⾏统⼀的适配处理。进⽽使调⽤ Servlet 容器中的⽅法变的简单。
Servlet 容器⼜名 Catalina。⼀个 Catalina 实例只能拥有⼀个 Server 实例,⼀个 Server 实例可以包含多个 Service 实例。⽽每⼀个Service 实例⼜可以包含多个 Connector 和⼀个 Container。⼀个 Container 只能有⼀个 Engine,⼀个 Engine 可以有多个 Host ,每个Host 可以包含多个 Context (⽹站),每个 Context 中可以有多个 Wrapper(Servlet)。
1. Catalina 实例可以被看成就是⼀个 Tomcat 实例。该实例⽤以解析 l 配置⽂件, 以此来创建服务器Server组件并进⾏管理。
2. Server 表⽰整个 Catalina Servlet 容器以及其它组件,负责组装并启动 Servlaet 引擎,Tomcat 连接器。
3. Service 是 Server 内部的组件,⼀个 Server 包含多个 Service。它将若⼲个 Connector 组件绑定到⼀个 Container。(通常情况下只
⽤⼀个 Service 就够了)
如何填报平行志愿4. Container 负责处理⽤户的 servlet 请求,并将处理结果返回给⽤户。
Engine 是整个 Catalina 的 Servlet 引擎,⽤来管理多个虚拟站点,⼀个 Service 最多只能有⼀个 Engine,但是⼀个 Engine 可包含多个 Host。
Host 代表⼀个虚拟主机,或者说⼀个站点,可以给 Tomcat 配置多个虚拟主机地址。⽽⼀个虚拟主机下可包含多个 Context。
Context 表⽰⼀个 Web 应⽤程序, ⼀个 Web 应⽤可包含多个 Wrapper。
Wrapper 表⽰⼀个 Servlet。Wrapper 作为容器中的最底层,不能包含⼦容器。
Tips:
Tips
上述组件的配置其实就体现在 Tomcat 软件中的 l ⾥。
三、Tomcat 核⼼配置⽂件 l
问个实在的问题:当你第⼀次甚⾄说上⼀次看 Tomcat 的配置⽂件 l 时,你的第⼀感受是啥?反正我最真切的感受就是:“我靠,英⽂真多~!”。不过静下⼼来再看,更多的都是说明性⽂字。删除注释后再看,就跟被拔光⽑的鸡⼀样,也就那样。不信你看
<?xml version="1.0" encoding="UTF-8"?>
<!-- port:关闭服务器的监听端⼝  shutdown:关闭服务器的指令字符串 -->
<Server port="8005" shutdown="SHUTDOWN">
<!-- 以⽇志形式输出服务器、操作系统、JVM的版本信息 -->
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- 加载(服务器启动)和销毁(服务器停⽌)APR。如果不到 APR 库,则会输出⽇志,但并不影响 Tomcat 启动 -->
<Listener className="org.AprLifecycleListener" SSLEngine="on" />
<!-- 避免JRE内存泄漏问题 -->
<Listener className="org.JreMemoryLeakPreventionListener" />
耳机有杂音
<!-- 加载(服务器启动)和销毁(服务器停⽌)全局命名服务 -->
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<!-- 在Context停⽌时重建 Executor 池中的线程,以避免 ThreadLocal 相关的内存泄漏 -->
<Listener className="org.ThreadLocalLeakPreventionListener" />
<!-- 全局命名服务,定义服务器的全局 JNDI 资源 -->
<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="l" />
</GlobalNamingResources>
<Service name="Catalina">
<!-- 处理 HTTP/1.1 协议的请求 -->
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
<!-- 处理 AJP/1.3 协议的请求⽤不到的话可以注释掉 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.alm.LockOutRealm">
<Realm className="org.alm.UserDatabaseRealm"
resourceName="UserDatabase" />
</Realm>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"cf登陆超时
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
这么⼀整理是不是瞬间清爽了很多。需要注意的是,通常情况下,上⾯配置⽂件⾥添加了注释的部分,除了 Connector 标签中的参数,其他标签的内容⼀般不需要修改,保持默认即可。
拉勾教育作为拉勾旗下的专为互联⽹⼈打造的职场专业能⼒提升平台,邀请到了国内外知名互联⽹公司的资深员⼯,提纲挈领的为各位同学分享宝贵实战经验。并按照专业技术能⼒全盘图谱、⾯试难点、实战案例分析等维度,为学员提供更全、更深、更实⽤的技能进阶⽅法。同时每个班级,更有由班主任、导师组成的“双师辅导”队伍,为学员提供 7 * 12+ ⼩时的在线服务,让你从此摆脱懒惰,摆脱⽆⼈解惑。紧握拉勾教育,实现更多⼈⽣可能。
四、核⼼配置⽂件进阶
端午节发朋友圈的精美句子4-1 <Service> 标签
<Service name="Catalina">
...含有荷花的诗句
</Service>
该标签⽤于创建 Service 实例,默认使⽤ org.StandardService 对象。默认情况下,Tomcat 仅指定了 Service 的名称, 值为 "Catalina"。 Service ⼦标签有 : Listener、Executor、Connector、Engine。其中:
Listener ⽤于为 Service 添加⽣命周期(⽤的⽐较少,故下⽂不做说明)
Executor ⽤于配置 Service 共享线程池
Connector ⽤于配置 Service 包含的链接器
Engine ⽤于配置 Service 中链接器对应的 Servlet 容器引擎
4-2 <Executor> 标签
该标签⽤于为 Service 添加线程池。默认情况下,在 l ⽂件中,该标签是被注释掉的,即未开启线程池的。如果想开启,则打开注释,并配置相关属性即可。
<Executor name="commonThreadPool"
namePrefix="thread-exec-"
maxThreads="200"
minSpareThreads="100"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="false"
threadPriority="5"
className="org.StandardThreadExecutor"/>
<Executor> 标签属性含义:
<Executor> 标签属性含义
dnf刺客
name:线程池名称。通过该属性的值,可在 <Connector> 标签中指定对应线程池。
namePrefix:所创建的每个线程的名称前缀,⼀个单独的线程名称为:namePrefix + threadNumber。
maxThreads:线程池中最⼤线程数。
minSpareThreads:最⼩空闲线程数,即活跃线程数,也就是核⼼池线程数。这些线程不会被销毁,会⼀直存在。
maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为 6000(1分钟),单位
毫秒。
maxQueueSize:在被执⾏前最⼤线程排队数⽬,默认为 Int 的最⼤值,也就是⼴义的⽆限。除⾮特殊情况,否则这个值不需要更改,不然会有请求不会被处理的情况发⽣。
prestartminSpareThreads:启动线程池时是否启动 minSpareThreads 部分线程。默认值为 false,即不启动。
threadPriority:线程池中线程优先级,默认值为 5,值从 1 到 10。
className:线程池实现类,未指定情况下,默认实现类为org.StandardThreadExecutor。如果想使⽤⾃定义线程池⾸先需要实现org.apache.catalina.Executor 接⼝。
4-3 <Connector> 标签
该⽤于创建链接器实例默认情况下,l 配置了两个链接器,⼀个⽀持 HTTP 协议,⼀个⽀持 AJP 协议⼤多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进⾏优化。
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
executor="commonThreadPool"
URIEncoding="UTF-8"
minSpareThreads="100"
maxThreads="1000"
acceptCount="1000"
maxConnections="1000"
compression="on"
compressionMinSize="2048"
disableUploadTimeout="true"
/>
<Connector> 标签属性含义:
<Connector> 标签属性含义
port:端⼝号,Connector ⽤于创建服务端 Socket 并进⾏监听, 以等待客户端请求链接。如果该属性设置为 0,Tomcat 将会随机选择⼀个可⽤的端⼝号给当前 Connector 使⽤。
protocol:当前 Connector ⽀持的访问协议。 默认为 HTTP/1.1,并采⽤⾃动切换机制选择⼀个基于JAVA NIO 的链接器或者基于本地APR 的链接器。(若想使⽤ APR 提⾼ Tomcat 的并发性能,则需要安装相关运⾏库后,再进⾏配置修改)
connectionTimeOut:Connector 接收链接后的等待超时时间, 单位为 毫秒。 -1 表⽰不超时。
redirectPort:当前 Connector 不⽀持 SSL 请求。如果接收到了⼀个请求, 且同时符合 security-constraint 约束,需要 SSL 传输,Catalina 则会⾃动将请求重定向到指定的端⼝。
executor:指定要使⽤的共享线程池的名称。
URIEncoding:⽤于指定编码 URI 的字符编码,Tomcat8.x 版本默认的编码为 UTF-8, Tomcat7.x版本默认为 ISO-8859-1。
当我们不使⽤共享线程池(即不添加 executor 属性),选择让每⼀个 Connector 单独维护⾃⼰的线程池时可通过
maxThreads、minSpareThreads、acceptCount、maxConnections 进⾏ Connector 线程池的配置。需要注意的是
maxThreads、acceptCount、maxConnections 这三个属性的值通常保持⼀致。
compression:是否开启数据请求等的 gzip 格式压缩。
compressionMinSize:最⼩压缩⼤⼩,即当数据请求超过指定值后才会进⾏压缩。
disableUploadTimeout:允许 Servlet 容器,使⽤较长的连接超时值,以使 Servlet 有较长的时间来完成它的执⾏,默认值为 false。4-4 <Engine> 标签
<Engine name="Catalina" defaultHost="localhost">
...
</Engine>
该标签表⽰ Servlet 引擎。其属性 name ⽤于指定 Engine 的名称, 默认为Catalina。defaultHost 属性⽤于指定默认使⽤的虚拟主机名称,当客户端请求指向的主机⽆效时,将交由默认的虚拟主机处理,默认为值 localhost。
4-5 <Host> 标签
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
...
</Host>
该标签⽤于配置⼀个虚拟主机。
name:指定虚拟主机的名称。
appBase:指定引⽤基础⽬录。
unpackWARs:是否⾃动解压 war 包。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。