在座各位老铁程序开发多年,想必Tomcat一直是都是大家的必用猫吧,在项目中配一下Tomcat,copy一份server.xml覆盖进来,就能够轻松愉快的把项目跑起来了。javascript
可是.....php
大家有没有想过Tomcat是怎么运行大家充满bug的程序的呢?server.xml里的这些垃圾配置又是什么用的呢?css
下面,我附上一份花费多日呕心沥血制做而成的server.xml配置详解,费你们脑袋和钛合金眼睛仔细看看:html
<?xml version='1.0' encoding='utf-8'?>
<!--Server:最顶层,表明整个Tomcat容器 , port:指定负责监听的关闭端口 主要用于tomcat服务关闭时回调给应用程序的监听 -->
<Server port="8005" shutdown="SHUTDOWN">
<!-- Listener:监听器 能够在特定事件发生时执行特定的操做;被监听的事件一般是Tomcat的启动和中止-->
<!-- VersionLoggerListener:当Tomcat启动时,该监听器记录Tomcat、Java和操做系统的信息。该监听器必须是配置的第一个监听器 -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!-- JasperListener:在Web应用启动以前初始化Jasper,Jasper是JSP引擎,把JVM不认识的JSP文件解析成java文件, 而后编译成class文件供JVM使用。 -->
<Listener className="org.apache.catalina.core.JasperListener" />
<!-- JreMemoryLeakPreventionListener:类加载器致使的内存泄露有关 -->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<!-- GlobalResourcesLifecycleListener:初始化< GlobalNamingResources>标签中定义的全局JNDI资源; 若是没有该监听器,任何全局资源都不能使用 -->
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<!-- ThreadLocalLeakPreventionListener:当Web应用因thread-local致使的内存泄露而要中止时,该监听器会触发线程池中线程的更新。当线程执行完任务被收回线程池时, 活跃线程会一个一个的更新。只有当Web应用(即Context元素)的renewThreadsWhenStoppingContext属性设置为true时,该监听器才有效。 -->
<Listener className="org.apache.catalina.core.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="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!-- service:服务组件,对外提供服务,一个service表明一个服务 -->
<Service name="Catalina">
<!--Connector: 接收链接请求,建立Request和Response对象用于和请求端交换数据; 而后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。 能够配置多个Connector, 经过建立不一样的Connector指定不一样的port和协议访问Tomcat服务 常见的属性有: protocol:协议,有HTTP、AJP等各类协议等 connectionTimeout:连接超时时间 redirectPort:指定服务器正在处理http请求时,收到了一个SSL传输请求后,重定向的端口号 -->
<Connector keepAliveTimeout="10000" namePrefix="catalina-exec-" maxThreads="1024" minSpareThreads="4" maxIdleTime="6000" connectionTimeout="1000" compression="on" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" enableLookups="false" maxKeepAliveRequests="1" maxConnections="1024" acceptCount="2000" port="8008" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8444" />
<!--Engine:请求处理组件,在service组件中有且只有一个,Service组件中的请求处理组件。 Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端 他有如下属性: name:Engine的逻辑名称,在日志和错误消息中会用到 defaultHost:指定默认主机,若是没有分配哪一个Host来执行用户请求,由这个值所指定的主机来处理, 这个值必须和<Host>元素中的其中一个的name值相同 -->
<Engine name="Catalina" defaultHost="localhost">
<!-- Host:能够有一或多个Host组件,每一个Host组件表明Engine中的一个虚拟主机。 Host的做用是能够运行多个Web应用(一个Context表明一个Web应用),并负责安装、展开、启动和结束每一个Web应用, 它的属性有: name:指定虚拟主机的主机名,通常状况下,主机名须要是在DNS服务器中注册的网络名,可是Engine指定的defaultHost不须要 unpackWARs:是否将表明Web应用的WAR文件解压;若是为true,经过解压后的文件结构运行该Web应用,若是为false,直接使用WAR文件运行Web应用 appBase:应用程序基本目录,即存放应用程序的目录,能够是计算机中的绝对目录,也能够是相对CATALINA_HOME的相对目录,不填则默认为tomcat下webapps目录 alias:指定主机别名 autoDeploy:是否自动发布;用于检测appBase下的文件,若是有新增或者修改,为true则会自动从新启动项目 -->
<Host name="localhost" appBase="" unpackWARs="true" autoDeploy="false">
<!-- Context:指当前Host上运行的一个Web应用 ,每一个Host中能够定义任意多的Context元素。 它有如下属性: path:访问该Web应用的上下文路径 docBase:指定了该Web应用使用的WAR包路径,或应用目录。 reloadable:tomcat是否在运行时监控在WEB-INF/classes和WEB-INF/lib目录下class文件的改动 -->
<Context path="" docBase="/Users/jaybril-pro/Documents/workspace/neno/BlackEye-SCAN/web" reloadable="true" />
</Host>
</Engine>
</Service>
</Server>
复制代码
经过研究上面的配置和注释,想必你们已经对这个配置的讲解理解的一塌糊涂了吧?由于密密麻麻花里胡哨的代码和汉字混杂在一块儿,看起来就像脑袋撞墙冒星星同样难受。java
好吧,咱们根据真实场景分析一下从用户在浏览器输入网址发请求到最终返回结果展现到网站这一个过程在客户端浏览器、提供web程序的服务器、Tomcat、web程序分别在哪一个步骤作了什么骚操做:web
至此,一个完整的http请求完成。结合这个流程再看上面的server.xml配置,应该是一点即通了吧。apache
以为本文对你有帮助?请分享给更多人编程
关注「编程无界」,提高装逼技能浏览器