- Tomcat启动分析
- 1 - Tomcat Server的组成部分
- 1.1 - Server
- A Server element represents the entire Catalina servlet container. (Singleton)
- 1.2 - Service
- A Service element represents the combination of one or more Connector components that share a single Engine
- Service是这样一个集合:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求
- 1.3 - 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代理请求
- 1.4 - Engine
- The Engine element represents the entire request processing machinery associated with a particular Service
- It receives and processes all requests from one or more Connectors
- and returns the completed response to the Connector for ultimate transmission back to the client
- Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名
- 当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理
- Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理
- 1.5 - Host
- 代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配
- 每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path
- 当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理
- 匹配的方法是“最长匹配”,所以一个path==""的Context将成为该Host的默认Context
- 所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配
- 1.6 - Context
- 一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成
- Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类
- 当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类
- 如果找到,则执行该类,获得请求的回应,并返回
- 2 - Tomcat Server的结构图
- 3 - 配置文件$CATALINA_HOME/conf/server.xml的说明
- 该文件描述了如何启动Tomcat Server
- <!-- 启动Server
- 在端口8005处等待关闭命令
- 如果接受到"SHUTDOWN"字符串则关闭服务器
- -->
- <Server port="8005" shutdown="SHUTDOWN" debug="0">
- <!-- Listener ???
- 目前没有看到这里
- -->
- <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/>
- <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/>
- <!-- Global JNDI resources ???
- 目前没有看到这里,先略去
- -->
- <GlobalNamingResources>
- ... ... ... ...
- </GlobalNamingResources>
- <!-- Tomcat的Standalone Service
- Service是一组Connector的集合
- 它们共用一个Engine来处理所有Connector收到的请求
- -->
- <Service name="Tomcat-Standalone">
- <!-- Coyote HTTP/1.1 Connector
- className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector
- port : 在端口号8080处侦听来自客户browser的HTTP1.1请求
- minProcessors : 该Connector先创建5个线程等待客户请求,每个请求由一个线程负责
- maxProcessors : 当现有的线程不够服务客户请求时,若线程总数不足75个,则创建新线程来处理请求
- acceptCount : 当现有线程已经达到最大数75时,为客户请求排队
- 当队列中请求数超过100时,后来的请求返回Connection refused错误
- redirectport : 当客户请求是https时,把该请求转发到端口8443去
- 其它属性略
- -->
- <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
- port="8080"
- minProcessors="5" maxProcessors="75" acceptCount="100"
- enableLookups="true"
- redirectPort="8443"
- debug="0"
- connectionTimeout="20000"
- useURIValidationHack="false"
- disableUploadTimeout="true" />
- <!-- Engine用来处理Connector收到的Http请求
- 它将匹配请求和自己的虚拟主机,并把请求转交给对应的Host来处理
- 默认虚拟主机是localhost
- -->
- <Engine name="Standalone" defaultHost="localhost" debug="0">
- <!-- 日志类,目前没有看到,略去先 -->
- <Logger className="org.apache.catalina.logger.FileLogger" .../>
- <!-- Realm,目前没有看到,略去先 -->
- <Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../>
- <!-- 虚拟主机localhost
- appBase : 该虚拟主机的根目录是webapps/
- 它将匹配请求和自己的Context的路径,并把请求转交给对应的Context来处理
- -->
- <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">
- <!-- 日志类,目前没有看到,略去先 -->
- <Logger className="org.apache.catalina.logger.FileLogger" .../>
- <!-- Context,对应于一个Web App
- path : 该Context的路径名是"",故该Context是该Host的默认Context
- docBase : 该Context的根目录是webapps/mycontext/
- -->
- <Context path="" docBase="mycontext" debug="0"/>
- <!-- 另外一个Context,路径名是/wsota -->
- <Context path="/wsota" docBase="wsotaProject" debug="0"/>
- </Host>
- </Engine>
- </Service>
- </Server>
- <!----------------------------------------------------------------------------------------------->
- 4 - Context的部署配置文件web.xml的说明
- 一个Context对应于一个Web App,每个Web App是由一个或者多个servlet组成的
- 当一个Web App被初始化的时候,它将用自己的ClassLoader对象载入“部署配置文件web.xml”中定义的每个servlet类
- 它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类
- 然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类
- web.xml文件有两部分:servlet类定义和servlet映射定义
- 每个被载入的servlet类都有一个名字,且被填入该Context的映射表(mapping table)中,和某种URL PATTERN对应
- 当该Context获得请求时,将查询mapping table,找到被请求的servlet,并执行以获得请求回应
- 分析一下所有的Context共享的web.xml文件,在其中定义的servlet被所有的Web App载入
- <!----------------------------------------------------------------------------------------------->
- <web-app>
- <!-- 概述:
- 该文件是所有的WEB APP共用的部署配置文件,
- 每当一个WEB APP被DEPLOY,该文件都将先被处理,然后才是WEB APP自己的/WEB-INF/web.xml
- -->
- <!-- +-------------------------+ -->
- <!-- | servlet类定义部分 | -->
- <!-- +-------------------------+ -->
- <!-- DefaultServlet
- 当用户的HTTP请求无法匹配任何一个servlet的时候,该servlet被执行
- URL PATTERN MAPPING : /
- -->
- <servlet>
- <servlet-name>default</servlet-name>
- <servlet-class>
- org.apache.catalina.servlets.DefaultServlet
- </servlet-class>
- <init-param>
- <param-name>debug</param-name>
- <param-value>0</param-value>
- </init-param>
- <init-param>
- <param-name>listings</param-name>
- <param-value>true</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <!-- InvokerServlet
- 处理一个WEB APP中的匿名servlet
- 当一个servlet被编写并编译放入/WEB-INF/classes/中,却没有在/WEB-INF/web.xml中定义的时候
- 该servlet被调用,把匿名servlet映射成/servlet/ClassName的形式
- URL PATTERN MAPPING : /servlet/*
- -->
- <servlet>
- <servlet-name>invoker</servlet-name>
- <servlet-class>
- org.apache.catalina.servlets.InvokerServlet
- </servlet-class>
- <init-param>
- <param-name>debug</param-name>
- <param-value>0</param-value>
- </init-param>
- <load-on-startup>2</load-on-startup>
- </servlet>
- <!-- JspServlet
- 当请求的是一个JSP页面的时候(*.jsp)该servlet被调用
- 它是一个JSP编译器,将请求的JSP页面编译成为servlet再执行
- URL PATTERN MAPPING : *.jsp
- -->
- <servlet>
- <servlet-name>jsp</servlet-name>
- <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
- <init-param>
- <param-name>logVerbosityLevel</param-name>
- <param-value>WARNING</param-value>
- </init-param>
- <load-on-startup>3</load-on-startup>
- </servlet>
- <!-- +---------------------------+ -->
- <!-- | servlet映射定义部分 | -->
- <!-- +---------------------------+ -->
- <servlet-mapping>
- <servlet-name>default</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>invoker</servlet-name>
- <url-pattern>/servlet/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>jsp</servlet-name>
- <url-pattern>*.jsp</url-pattern>
- </servlet-mapping>
- <!-- +------------------------+ -->
- <!-- | 其它部分,略去先 | -->
- <!-- +------------------------+ -->
- ... ... ... ...
- </web-app>
- <!----------------------------------------------------------------------------------------------->
- 5 - Tomcat Server处理一个http请求的过程
- 假设来自客户的请求为:
- http://localhost:8080/wsota/wsota_index.jsp
- 1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
- 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
- 一、Tomcat背景
- 自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet, 这样Tomcat就诞生了。Tomcat是jakarta项目中的一个重要的子项目,其被JavaWorld杂志的编辑选为2001年度最具创新的java产品,同时它又是sun公司官方推荐的servlet和jsp容器,因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。其次,Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载。Tomcat与Apache的组合相当完美。
- 二、Tomcat目录
- tomcat
- |---bin Tomcat:存放启动和关闭tomcat脚本;
- |---conf Tomcat:存放不同的配置文件(server.xml和web.xml);
- |---doc:存放Tomcat文档;
- |---lib/japser/common:存放Tomcat运行需要的库文件(JARS);
- |---logs:存放Tomcat执行时的LOG文件;
- |---src:存放Tomcat的源代码;
- |---webapps:Tomcat的主要Web发布目录(包括应用程序示例);
- |---work:存放jsp编译后产生的class文件;
- 三、Tomcat类加载
- Bootstrap($JAVA_HOME/jre/lib/ext/*.jar)
- System($CLASSPATH/*.class和指定的jar)
- Common($CATALINA_HOME/common 下的classes,lib,endores三个子目录)
- Catalina ($CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见)
- &Shared($CATALINA_HOME/shared/下的classes和lib目录以及$CATALINA_HOME/lib目录)仅对Web应用程序可见,对Tomcat不可见WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见classes/*.class lib/*.jar)
- 加载类和资源的顺序为:
- 1、/Web-INF/classes
- 2、/Web-INF/lib/*.jar
- 3、Bootstrap
- 4、System
- 5、$CATALINA_HOME/common/classes
- 6、$CATALINA_HOME/common/endores/*.jar
- 7、$CATALINA_HOME/common/lib/*.jar
- 8、$CATALINA_HOME/shared/classes
- 9、$CATALINA_HOME/shared/lib/*.jar
- 四、server.xml配置简介:
- 下面讲述这个文件中的基本配置信息,更具体的配置信息请参考tomcat的文档:
- server:
- 1、port 指定一个端口,这个端口负责监听关闭tomcat的请求
- 2、shutdown 指定向端口发送的命令字符串
- service:
- 1、name 指定service的名字
- Connector (表示客户端和service之间的连接):
- 1、port 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求
- 2、minProcessors 服务器启动时创建的处理请求的线程数
- 3、maxProcessors 最大可以创建的处理请求的线程数
- 4、enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查
- 询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip
- 地址
- 5、redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的
- 端口号
- 6、acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理
- 队列中的请求数,超过这个数的请求将不予处理
- 7、connectionTimeout 指定超时的时间数(以毫秒为单位)
- Engine (表示指定service中的请求处理机,接收和处理来自Connector的请求):
- 1、defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name
- 属性值是一样的
- Context (表示一个web应用程序):
- 1、docBase 应用程序的路径或者是WAR文件存放的路径
- 2、path 表示此web应用程序的url的前缀,这样请求的url为
- http://localhost:8080/path/****
- 3、reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的
- /WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可
- 以在不重起tomcat的情况下改变应用程序
- host (表示一个虚拟主机):
- 1、name 指定主机名
- 2、appBase 应用程序基本目录,即存放应用程序的目录
- 3、unpackWARs 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接
- 从WAR文件中运行应用程序
- Logger (表示日志,调试和错误信息):
- 1、className 指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口
- 2、prefix 指定log文件的前缀
- 3、suffix 指定log文件的后缀
- 4、timestamp 如果为true,则log文件名中要加入时间,如下
- 例:localhost_log.2001-10-04.txt
- Realm (表示存放用户名,密码及role的数据库):
- 1、className 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口
- Valve (功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样):
- 1、className 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve
- 类可以记录应用程序的访问信息
- directory(指定log文件存放的位置):
- 1、pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行
- 请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记
- 录的值更多
- 五、web.xml配置简介:
- 1、默认(欢迎)文件的设置
- 在tomcat4\conf\web.xml中,<welcome-file-list>与IIS中的默认文件意思相同。
- <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>
- 过滤:
- 1) 身份验证的过滤Authentication Filters
- 2) 日志和审核的过滤Logging and Auditing Filters
- 3) 图片转化的过滤Image conversion Filters
- 4) 数据压缩的过滤Data compression Filters
- 5) 加密过滤Encryption Filters
- 6) Tokenizing Filters
- 7) 资源访问事件触发的过滤Filters that trigger resource access events XSL/T 过滤XSL/T filters
- 9) 内容类型的过滤Mime-type chain Filter 注意监听器的顺序,如:先安全过滤,然后资源,
- 然后内容类型等,这个顺序可以自己定。
- 六、管理
- 1、用户配置
- 在进行具体Tomcat管理之前,先给tomcat添加一个用户,使这个用户有权限来进行管理。
- 打开conf目录下的tomcat-users.xml文件,在相应的位置添加下面一行:
- <user name="user" password="user" roles="standard,manager"/>
- 然后重起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应用程序。
- 转载于点击打开链接
tomcat解析
最新推荐文章于 2024-08-04 22:27:04 发布