Tomcat原理

Apache和Tomcat的关系

Apache(Apache HTTP Server )与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行。Apache是Web服务器,而Tomcat是Java应用服务器。

Apache服务器 只处理 静态HTML
tomcat服务器 静态HTML 动态 JSP/Servlet 都能处理。

一般是把Apache服务器与tomcat服务器搭配在一起用
Apache服务器负责处理所有静态的页面/图片等信息。
Tomcat 只处理动态的 部分。

实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

开始学习Javaweb时用的独立的tomcat;后期当项目越来越复杂,越来越大,用Apache+Ttomcat,分别处理静态和动态页面。也可以用Nginx+Tomcat

Tomcat是Servlet容器

大家都知道Tomcat是JSP/Servlet运行环境(容器)。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。

1、独立的Servlet容器 Tomcat作为独立的Web服务器来单独运行。

2、其他Web服务器进程内的Servlet容器
这种模式下,Tomcat与Web服务器插件和Servlet容器组件两部分。Web服务器插件在其他Web服务器进程的内部地址空间启动一个Java虚拟机,Servlet容器组件在此Java虚拟机中运行。如有Servlet请求,Web服务器插件获得此请求并转发给Servlet容器(JNI通信,Java本地调用接口)。

3、 其他Web服务器进程外的Servlet容器
与上面类似,只是在Web服务器外部地址,启动一个Java虚拟机进程,转发用IPC通信机制,两个进程之间通信的一种机制。

Tomcat是用什么语言写的

上面已经介绍了Apache和tomcat的关系
Apache http server 是由c语言开发;
Tomcat则是由java开发,这也就是为什么,部署Apache Tomcat的时候需要你安装jre的原因。

Tomcat目录和配置文件

1、目录
tomcat
  |—bin:存放启动和关闭tomcat脚本(windows(startup.bat、shutdown.bat)、linux(startup.sh、shutdown.sh))
  |—conf:存放不同的配置文件(server.xml和web.xml);
  |—doc:存放Tomcat文档;
  |—lib/japser/common:存放Tomcat运行需要的库文件(JARS);
  |—logs:存放Tomcat执行时的LOG文件;
  |—webapps:Tomcat的主要Web发布目录(包括应用程序示例);
  |—work:存放jsp编译后产生的class文件;
  
2、Tomcat配置文件

我们打开con文件夹可以看到Tomcat的配置文件:

 server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;

 web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;

 tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户  指定角色等将通过编辑此文件实现;

 catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;

 catalina.properties:Tomcat内部package的定义及访问相关控制,也包括对通过类装载器装载的内容的控制;Tomcat在启动时会事先读取此文件的相关设置;

 logging.properties: Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组  件级别以及日志文件的存在位置等;

 context.xml:所有host的默认配置信息; 

Tomcat启动过程

1、开启Tomcat:可以在IDE中启动Tomcat的服务器,也可以手动在/bin/目录下找到startup.bat并双击,然后程序就会依次执行以下步骤:

(1)引导(Bootstrap)启动:调用了org.apache.catalina.startup.Bootstrap.class中的main方法,开始启动Tomcat容器;

( 2)调用Bootstrap中的init(),创建了Catalina对象(核心容器):主要进行了以下三步:
① 设置此Tomcat实例所需的环境变量
② 实例化将用于运行Tomcat实例的一般类装入器。
③初始化这个Tomcat实例

(3)调用Bootstrap中的load():实际上是通过反射调用了catalina的load方法。
解析一个Tomcat实例,主要配置server.xml文件,将每个配置元素到合适的Tomcat组件。(找到config file(server.xml);然后创建digester,解析server.xml,生成各组件对象(Server、Service、Container、Connector等)以及建立相互之间的关系。 )

( 4)启动我们最外层的顶层元素服务器实例。(最后start(),同样是在Bootstrap中通过反射调用catalina对象的start方法。接着启动server.start()方法:((Lifecycle) getServer()).start(); 接着调用service.start()方法。接下来是一系列的container的start,后续在分析(会部署所有的项目)

(5)设置关闭钩子
关闭挂钩是一个标准的线程封装的清理行动,应该是java运行时退出之前。当JVM关闭时,运行时调用所有关闭钩子。
因此,我们进行最后一个任务是安装一个关闭钩子,实现由catalinashutdownhook。这个钩子是注册的java运行时通过调用其addshutdownhook()方法:
Runtime.getRuntime().addShutdownHook(),
catalinashutdownhook是Catalina内部类等访问所有数据成员的时候。其run()方法很简单。它只是确保调用Catalina实例的stop()。此方法调用stop()在standardserver实例,从而进行级联调用stop()它所有的子组件。每个孩子对其孩子都做同样的事情,直到整个服务器被完全停止为止。

Tomcat Server的组成部分

Tomcat Server的结构图
这里写图片描述

端口

1、8005端口

<Server port="8005" shutdown="SHUTDOWN">

接受服务器关闭指令的端口号,我们叫关闭指令端口.

2、8080端口

<Connector port="8080" protocol="HTTP/1.1"

              connectionTimeout="20000"

              redirectPort="8443" />

http请求处理端口,我们在网页上输入的普通url地址包含的端口就是他 .这个端口叫http端口.

3、8009端口

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

接收AJP协议的处理端口.这个端口叫ajp端口.

Tomcat Server的组成部分

Server
服务器元素代表整个catalina servlet容器。(Singleton)

Service
服务元素表示共享一个引擎(Engine)的一个或多个连接器组件(Connector)的组合。
Service是这样一个集合:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求

Connector
一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户

tomcat有两个典型的Connector,一个直接侦听来自browser(浏览器)的http请求,一个侦听来自其它WebServer的请求
Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求
Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求

Engine
Engine表示与特定服务相关联的整个请求处理机制。
它接收并处理来自一个或多个连接器(Connector)的所有请求。
并将完成的响应返回给最终传输到客户机的连接器。

Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名
当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理
Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理

Host
代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配
每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path
当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理
匹配的方法是“最长匹配”,所以一个path==””的Context将成为该Host的默认Context
所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配

Context
一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成
Context在创建的时候将根据配置文CATALINA_HOME/conf/web.xml和WEBAPP_HOME/WEB-INF/web.xml载入Servlet类
当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类
如果找到,则执行该类,获得请求的回应,并返回

【Tomcat的启动过程】Tomcat 先根据/conf/server.xml 下的配置启动Server,再加载Service,对于与Engine相匹配的Host,每个Host 下面都有一个或多个Context。

注意:Context 既可配置在server.xml 下,也可配置成一单独的文件,放在conf\Catalina\localhost下,简称应用配置文件。

  Web Application 对应一个Context,每个Web Application 由一个或多个Servlet 组成。当一个Web Application 被初始化的时候,它将用自己的ClassLoader 对象载入部署配置文件web.xml 中定义的每个Servlet 类:它首先载入在$CATALINA_HOME/conf/web.xml中部署的Servlet 类,然后载入在自己的Web Application 根目录下WEB-INF/web.xml 中部署的Servlet 类。

web.xml 文件有两部分:Servlet 类定义和Servlet 映射定义。

  每个被载入的Servlet 类都有一个名字,且被填入该Context 的映射表(mapping table)中,和某种URL 路径对应。当该Context 获得请求时,将查询mapping table,找到被请求的Servlet,并执行以获得请求响应。

  所以,对于Tomcat 来说,主要就是以下这几个文件:conf 下的server.xml、web.xml,以及项目下的web.xml,加载就是读取这些配置文件。

Tomcat处理一个http请求的过程

假设来自客户的请求为:http://localhost:8080/wsota/wsota_index.jsp

1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
Connector的主要任务是负责接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理这个请求的线程

2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应

3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host

4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)

5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context

6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为””的Context去处理)

7) path=”/wsota”的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet

8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类

9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法

10)Context把执行完了之后的HttpServletResponse对象返回给Host

11)Host把HttpServletResponse对象返回给Engine

12)Engine把HttpServletResponse对象返回给Connector

13)Connector把HttpServletResponse对象返回给客户browser

web.xml

1、默认(欢迎)文件的设置  
<welcome-file-list> 
<welcome-file>index.html</welcome-file> 
<welcome-file>index.htm</welcome-file> 
<welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 

2、报错文件的设置 
<error-page> 
<error-code>404</error-code> 
<location>/notFileFound.jsp</location> 
</error-page> 
<error-page> 
<exception-type>java.lang.NullPointerException</exception-type> 
<location>/null.jsp</location> 
</error-page> 
如果某文件资源没有找到,服务器要报404错误,按上述配置则会调用\webapps\ROOT\notFileFound.jsp。 
如果执行的某个JSP文件产生NullPointException ,则会调用\webapps\ROOT\null.jsp 

3、会话超时的设置 
设置session 的过期时间,单位是分钟; 
<session-config> 
<session-timeout>30</session-timeout> 
</session-config> 

4、过滤器的设置 
<filter> 
<filter-name>FilterSource</filter-name> 
<filter-class>project4. FilterSource </filter-class> 
</filter> 
<filter-mapping> 
<filter-name>FilterSource</filter-name> 
<url-pattern>/WwwServlet</url-pattern> 
(<url-pattern>/haha/*</url-pattern>) 
</filter-mapping>

启动一个web项目的时候,web容器去读取它的配置文件web.xml,读取web.xml文件的时候和他们配置的位置没有关系。读取节点的顺序是:listener>filter>servlet。上述配置中还存在一个标签,这个标签用来提供应用程序上下文信息,可以写在任意位置上,此时加载web.xml标签的顺序为:context-param>listener>filter>servlet。

上面说的是不用标签的加载顺序,对于同类标签而言,在配置filter的时候,web.xml中可以定义多个filter,与filter相关的节点有filter-name、filter-class,filter-mapping必须出现在filter-name标签后,启动容器初始化每个filter的时候,初始化顺序是依照filter-mapping配置节点出现的顺序来调用的doFilter()方法的。servlet的加载顺序和filter一样。由此可知,web.xml系统会如何加载各个项。

tomcat管理

1、用户配置
在进行具体Tomcat管理之前,先给tomcat添加一个用户,使这个用户有权限来进行管理。
打开conf目录下的tomcat-users.xml文件,在相应的位置添加下面一行:

然后重起tomcat,在浏览器中输入http://localhost:8080/manager/,会弹出对话框,输入上面的用户
名和密码即可。

2、应用程序列表
在浏览器中输入http://localhost:8080/manager/list,浏览器将会显示如下的信息:
OK - Listed applications for virtual host localhost
/ex:running:1
/examples:running:1
/webdav:running:0
/tomcat-docs:running:0
/manager:running:0
/:running:0
上面显示的信息分别为:应用程序的路径、当前状态、连接这个程序的session数

3、重新装载应用程序
在浏览器中输入 http://localhost:8080/manager/reload?path=/examples,浏览器显示如下:
OK - Reloaded application at context path /examples
这表示example应用程序装载成功,如果我们将server.xml的Context元素的reloadable属性设为true,则没必要利用这种方式重新装载应用程序,因为tomcat会自动装载。

4、显示session信息
在浏览器中输入http://localhost:8080/manager/sessions?path=/examples,浏览器显示如下:
OK - Session information for application at context path /examples Default maximum session inactive
interval 30 minutes

5、启动和关闭应用程序
在浏览器中输入http://localhost:8080/manager/start?path=/examples
http://localhost:8080/manager/stop?path=/examples分别启动和关闭examples应用程序。

摘自:

Apache服务器和tomcat服务器有什么区别?
Tomcat是用什么语言开发的
Tomcat服务器原理详解

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tomcat是一个开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范。在Tomcat中,通过一系列处理流程和映射器功能来处理请求并找到对应的虚拟站点和Servlet。 首先,Tomcat会读取并解析server.xml文件,该文件位于tomcat/conf目录下。在server.xml中,可以配置多个虚拟主机(Host)和对应的上下文(Context)。 接下来,Tomcat会解析Host的默认配置,即EngineName/HostName/context.xml.default文件。在这个文件中,可以配置某个虚拟主机的默认上下文配置。 然后,Tomcat会解析应用的META-INF/context.xml文件。这个文件是每个Web应用程序的上下文配置文件,其中可以配置应用程序特定的参数和资源。 通过上述解析过程,Tomcat能够找到对应的虚拟站点和Servlet。根据请求的路径,Tomcat会使用映射器功能来判断请求应该由哪个虚拟站点处理。而在虚拟站点中,Tomcat会根据请求路径再次使用映射器功能来找到对应的Servlet。 总结起来,Tomcat通过解析配置文件和使用映射器功能来实现请求的路由和Servlet的匹配。这样,Tomcat就能够根据请求路径找到对应的虚拟站点,并通过映射器找到对应的Servlet来处理请求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [tomcat的工作原理](https://blog.csdn.net/dongcheng_2015/article/details/117091790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Tomcat 原理分析](https://blog.csdn.net/alongbigbig/article/details/120117178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值