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服务器原理详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值