tomcat初步认识

一.背景

最近找工作,被别人问到了tomcat的最大连接数是多少,没有回答上来,作为一个java开发者,天天都会用到tomcat,却对tomcat所知甚少,这个就很不应该了,这篇博客其实没有多少自己的理解都是照着其他博客搬运过来的,只是记录一下自己的学习过程,也是自己学习tomcat的一个总结。

二.tomcat根目录介绍

    

【bin】目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。

很多环境变量的设置都在此处,例如可以设置JDK路径、TOMCAT路径

startup 用来启动tomcat

shutdown 用来关闭tomcat

修改catalina可以设置tomcat的内存


【conf】目录主要是用来存放tomcat的一些配置文件。

  • server.xml可以设置端口号、设置域名或IP、默认加载的项目、请求编码
  • web.xml可以设置tomcat支持的文件类型
  • context.xml可以用来配置数据源之类的
  • tomcat-users.xml用来配置管理tomcat的用户与权限
  • 在Catalina目录下可以设置默认加载的项目

【lib】目录主要用来存放tomcat运行需要加载的jar包。

例如,像连接数据库的jdbc的包我们可以加入到lib目录中来。


【logs】目录用来存放tomcat在运行过程中产生的日志文件,非常重要的是在控制台输出的日志。(清空不会对tomcat运行带来影响)

在windows环境中,控制台的输出日志在catalina.xxxx-xx-xx.log文件中

在linux环境中,控制台的输出日志在catalina.out文件中


【temp】目录用户存放tomcat在运行过程中产生的临时文件。(清空不会对tomcat运行带来影响) 


【webapps】目录用来存放应用程序

当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用。

当然,你也可以把应用程序放置在磁盘的任意位置,在配置文件中映射好就行。


【work】目录用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件。

清空work目录,然后重启tomcat,可以达到清除缓存的作用。

三.请求在tomcat中的处理流程

上图的具体流程如下

1.用户在浏览器上输入地址,发送http请求,被端口号为8080,协议是http的Connector捕获。
2.Connector将请求传递给自己所属service的容器,就是tomcat中Engine(引擎)
3.Engine再将请求根据配置的虚拟主机的name来确定对应的虚拟主机,如果没有匹配的虚拟主机,则使用默认的虚拟主机
4.Host容器然后再根据context中配置的path来确定具体web应用
5.Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet,Context匹配到URL 为*.jsp的Servlet,对应JspServlet类。
6.将HttpServletRequest,HttpServletResponse作为参数来调用doGet()或者doPost()方法,执行业务逻辑,或者数据存取
7.将程序调用结果放在HttpServletResponse对象中,将HttpServletResponse传递给context所属于的虚拟主机
8.Host虚拟主机将HttpServletResponse对象传递给Engine
9.Engine把HttpServletResponse对象返回Connector。
10.Connector把HttpServletResponse对象返回给客户Browser。

四.各常见组件:

1、服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。

2、服务(service):一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。

连接器类组件:

3、连接器(connectors):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。

容器类组件:

4、引擎(Engine):引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。

5、主机(Host):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。

6、上下文(Context):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。

五.server.xml配置文件详解

<Server port="8005" shutdown="SHUTDOWN">
<!-- 属性说明
	port:指定一个端口,这个端口负责监听关闭Tomcat的请求
	shutdown:向以上端口发送的关闭服务器的命令字符串
-->
 
  <Listener className="org.apache.catalina.core.AprLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
 
  <GlobalNamingResources>
 
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
 
    <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元素只能有一个Engine元素.元素处理在同一个<Service>中所有<Connector>元素接收到的客户请求
-->
  <Service name="Catalina">
<!-- 属性说明
	name:Service的名称
-->
 
    <!--
		Connector元素:
			由Connector接口定义.<Connector>元素代表与客户程序实际交互的组件,它负责接收客户请求,以及向客户返回响应结果.
    -->
    <Connector port="80" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
    <!-- 属性说明
		port:服务器连接器的端口号,该连接器将在指定端口侦听来自客户端的请求。
		enableLookups:如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名;
					若为false则不进行DNS查询,而是返回其ip地址。
		redirectPort:表示当强制要求https而请求是http时,重定向至端口号为8443的Connecto
		acceptCount:当所有可以使用的处理请求的线程都被用光时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,而返回Connection refused错误。
		connectionTimeout:等待超时的时间数(以毫秒为单位)。
		maxThreads:设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200。
		protocol:必须设定为AJP/1.3协议。
		address:如果服务器有两个以上IP地址,该属性可以设定端口监听的IP地址,默认情况下,端口会监听服务器上所有IP地址。
		minProcessors:服务器启动时创建的处理请求的线程数,每个请求由一个线程负责。
		maxProcessors:最多可以创建的处理请求的线程数。
		minSpareThreads:最小备用线程 。
		maxSpareThreads:最大备用线程。
		debug:日志等级。
		disableUploadTimeout:禁用上传超时,主要用于大数据上传时。
    -->
 
 
    <Connector port="8009" 
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
    <!-- 负责和其他HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时就需要用到这个连接器。 -->
	
    <Engine name="Catalina" defaultHost="localhost">
    <!-- 属性说明
		name:对应$CATALINA_HOME/config/Catalina中的Catalina 
        defaultHost:对应Host元素中的name属性,也就是和$CATALINA_HOME/config/Catalina/localhost中的localhost
		    缺省的处理请求的虚拟主机名,它至少与其中的一个Host元素的name属性值是一样的
        debug:日志等级
    -->
 
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
    <!--
		由Host接口定义.一个Engine元素可以包含多个<Host>元素.
			每个<Host>的元素定义了一个虚拟主机.它包含了一个或多个Web应用.
    -->
    <Host name="localhost" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
	
    <!-- 属性说明
		name:在此例中一直被强调为$CATALINA_HOME/config/Catalina/localhost中的localhost虚拟主机名
		debug:是日志的调试等级 
		appBase:默认的应用路径,也就是把应用放在一个目录下,并在autoDeploy为true的情况下,可自动部署应用此路径相对于$CATALINA_HOME/ (web applications的基本目录)
		unpackWARs:设置为true,在Web应用为*.war是,解压此WAR文件. 
				   如果为true,则tomcat会自动将WAR文件解压;否则不解压,直接从WAR文件中运行应用程序.
		autoDeploy:默认为true,表示如果有新的WEB应用放入appBase 并且Tomcat在运行的情况下,自动载入应用 
    -->
 
	<Context path="/demm" docBase="E:\\projects\\demm\\WebRoot" debug="0" reloadable="true" > 
        </Context>
    <!-- 属性说明
		path:访问的URI,如:http://localhost/是我的应用的根目录,访问此应用将用:http://localhost/demm进行操作,此元素必须,
			表示此web application的URL的前缀,用来匹配一个Context。请求的URL形式为http://localhost:8080/path/*
        docBase:WEB应用的目录,此目录必须符合Java WEB应用的规范,web application的文件存放路径或者是WAR文件存放路径。
        debug:日志等级 
        reloadable:是否在程序有改动时重新载入,设置成true会影响性能,但可自动载入修改后的文件,
			如果为true,则Tomcat将支持热部署,会自动检测web application的/WEB-INF/lib和/WEB-INF/classes目录的变化,
			自动装载新的JSP和Servlet,我们可以在不重起Tomcat的情况下改变web application
    -->
      </Host>
    </Engine>
  </Service>
</Server>

tomcat最大的连接数是maxConnections+acceptCount之和,当工作线程达到maxThreads后,后面的请求过来先到acceptCount这个队列中,然后再被转移到maxConnections这个队列中,当maxConnections这个队列满了后,acceptCount这个队列可以继续接受请求,当acceptCount队列达到最大值的时候,就拒绝请求了。其中maxConnections默认的值是10000,acceptCount默认值是100,maxThreads默认值是200。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  <!-- DispatcherServlet初始化的上下文加载的Bean是只对Spring Web MVC有效的Bean,如Controller、HandlerMapping、HandlerAdapter等等,该初始化上下文应该只加载Web相关组件。 -->
              <servlet-name>springMVC</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                      <param-name>contextConfigLocation</param-name>
                      <param-value>classpath*:springController.xml</param-value>
              </init-param>
  </servlet>
  
  <servlet-mapping>
                <servlet-name>springMVC</servlet-name>
                <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!-- 
  ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;
 <context-param>
                 <param-name>contextConfigLocation</param-name>
                 <param-value>classpath*:springController.xml</param-value>
  </context-param> 
  <listener>
                 <listener-class>
                       org.springframework.web.context.ContextLoaderListener
                 </listener-class>
  </listener>
 -->
<filter>
	        <filter-name>encodingFilter</filter-name>
	        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	        <init-param>
	                <param-name>encoding</param-name>
	                <param-value>utf-8</param-value>
	        </init-param>
</filter>
<filter-mapping>
	        <filter-name>encodingFilter</filter-name>
	        <url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

上面是一个web工程的web.xml配置文件,当请求进入到context里面的时候,context会找到doBase下面的web工程的web.xml配置文件,然后去寻找servlet-mapping中的url-pattern相匹配,如果匹配上了,就会寻找相应的servlet执行请求,上面的servlet就是DispatcherServlet。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章