tomcat_server.xml&http调用关系
<?xml version='1.0' encoding='utf-8'?>
//监听关闭tomcat的端口号
<Server port="9031" shutdown="SHUTDOWN">
//prLifecycleListener:Tomcat启动时,检查APR库,如果存在则加载。APR,即Apache Portable Runtime,是Apache可移植运行库,可以实现高可扩展性、高性能,以及与本地服务器技术更好的集成。
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
//GlobalNamingResources元素定义了全局资源,通过配置可以看出,该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的
<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>元素则代表一个Engine元素以及一组与之相连的Connector元素
<Service name="Catalina">
//Executor元素代表Tomcat中的线程池,可以由其他组件共享使用;要使用该线程池,组件需要通过executor属性指定该线程池。
//maxThreads, 最大线程数,tomcat能创建来处理请求的最大线程数,线程池中最大活跃线程数
//minSpareTHreads,最小空闲线程数,无论如何都会存活的最小线程数
//namePrefix:线程名字的前缀,线程池中线程名字为:namePrefix+线程编号
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="1000" minSpareThreads="10"/>
//Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。
//enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
//redirectPort指定服务器正在处理http请求时收到一个SSL传输请求后重定向的端口号
<Connector port="8088" protocol="HTTP/1.1"
executor="tomcatThreadPool"
connectionTimeout="30000"
enableLookups="false"
URIEncoding="UTF-8"
redirectPort="8443"
//minProcessors服务器启动时创建的处理请求的线程数
minProcessors="100"
//maxProcessors最大可以创建的处理请求的线程数
maxProcessors="1000"
//maxThreads, 最大线程数,tomcat能创建来处理请求的最大线程数,线程池中最大活跃线程数
maxThreads="400"
//minSpareTHreads,最小空闲线程数,无论如何都会存活的最小线程数-------maxSpareThreads最多空闲连接数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程
minSpareThreads="100"
//acceptCount, 最大等待队列数 ,请求并发大于tomcat线程池的处理能力,则被放入等待队列等待被处理。
acceptCount="1000"
// 最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间)
maxKeepAliveRequests="1"
//如果开启gzip服务,则为on,默认关闭
compression="on"
//compressionMinSize="4096":对小于该配置大小的文件不进行压缩(单位:B,也就是4K)
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>
//Engine包含Host,Host包含Context。一个Engine组件可以处理Service中的所有请求,一个Host组件可以处理发向一个特定虚拟主机的所有请求,一个Context组件可以处理一个特定Web应用的所有请求。
//name属性用于日志和错误信息,在整个Server中应该唯一。defaultHost属性指定了默认的host名称,当发往本机的请求指定的host名称不存在时,一律使用defaultHost指定的host进行处理;因此,defaultHost的值,必须与Engine中的一个Host组件的name属性值匹配。
<Engine name="Catalina" defaultHost="api.mism.bj58.com">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
//name属性指定虚拟主机的主机名
//unpackWARs指定了是否将代表Web应用的WAR文件解压;如果为true,通过解压后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用。
//Host的autoDeploy和appBase属性,与Host内Web应用的自动部署有关.
<Host name="api.mism.bj58.com" appBase="webapps" unpackWARs="true" xmlValidation="false" xmlNamespaceAware="false" deployXML="false" deployOnStartup="false" autoDeploy="false">
//Context元素代表在特定虚拟主机上运行的一个Web应用
<Context path="" docBase="/opt/web/bp_fang_learning/webapps/" crossContext="true" allowLinking="true" reloadable="false" maxPostSize="2048">
<JarScanner scanAllDirectories="true" />
</Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="infotop.58.com_access_log." sufFix=".txt" pattern="%a %u %t '%m %v%U%q' %T %s %B '%{Referer}i' '%{User-Agent}i' '%{X-Forwarded-For}i'" resolveHosts="false"/>
</Host>
</Engine>
</Service>
</Server>
==============================================================================================================
1.用户在浏览器中输入网址localhost:8080/test/index.jsp,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得;
2.Connector把该请求交给它所在的Service的Engine(Container)来处理,并等待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。
---------------------------------------------------------------------------------------------