先贴出一个对象间的结构图
<Server>
<Listener></Listener>
<Listener></Listener>
......(多个Listener)
<GlobalNamingResources>
<Resource></Resource>
</GlobalNamingResources>
<Service>
<Connector protocol="HTTP/1.1"></Connector>
<Connector protocol="AJP/1.3"></Connector>
......(一般2个Connector)
<Engine>
<Realm></Realm>
<Host>
<Valve></Valve>
......(可以有多个)
</Host>
</Engine>
</Service>
</Server>
一个 server(服务器)包含一至多个 service(服务),一个 service 包含惟一一个 Engine(处理机)或者一至多个 connector(连接器),一个 Engine 包含多个 host(虚拟主机),一个 host 包含一至多个 content(web 应用)
下面对各个节点分析:
1 Server
整个 Catalina 容器的入口点,通过 Serverfactory 生成 Server 实例类
<Server port="8005" shutdown="SHUTDOWN">
2 Service
N 个 Connector+1 个 Engine,处理所有 Connector 所获得的请求
<Service name="Catalina">
3 Connector
把从 Socket 传递过来的数据封装成 Request,传递给容器,有 2 种包括 httpConnector 和 ajpConnector,
httpConnector 侦听来自浏览器的 http 请求,如 8080:
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
ajpConnector 侦听来自其它 WebServer 的请求,如 8009:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
属性解释:
className:Connector 的实现类
port:侦听的端口
minProcessors:最小线程数,初始化几个线程等待请求(5)
maxProcessors:最大线程数,线程请求超过最大线程数则不会立即创建线程,而是加入排队中(75)
acceptCount:排队数,如果排队过多了,那么就不响应请求了,返回 Connection refused 错误(100)
redirectport:如果请求是 https 时,把该请求转发到端口 8443 去
Tomcat 有 3 个容器,Engine,Host 和 Context
4 Engine
Engine 收到 Connector 传递来的请求后,它把该请求匹配到某个 Host 上,然后把该请求交给该 Host 来处理,如果没有匹配到,则用默认的 Host,此处是 localhost,Engine 常用类型有 2 种,Catalina 和 Standalone
<Engine defaultHost="localhost" name="Catalina">
5 Host
虚拟主机,每个虚拟主机有一个域名如 localhost,一个虚拟主机下可以部署一个或者多个 Web App,也就是多个 Context,当 Host 获得一个请求时,将把该请求匹配到某个 Context 上,然后把该请求交给该 Context 来处理
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
6 Context
一个 Context 对应一个 web app,一个 app 由 N 个 Servlet 组成,Context 根据 web.xml 载入 Servlet 类
1. <servlet>
2. <description>description>
3. <display-name>FileDownloadServletdisplay-name>
4. <servlet-name>FileDownloadServletservlet-name>
5. <servlet-class>com.itiptop.portal.servlet.FileDownloadServletservlet-class>
6. servlet>
7. <servlet-mapping>
8. <servlet-name>FileDownloadServletservlet-name>
9. <url-pattern>/FileDownloadServleturl-pattern>
10. servlet-mapping>
7.小结
现在假设客户端有个请求:http://localhost:8080(Host)/webbei(Context)/index.jsp(Servlet)
- 请求被发送到本机端口 8080,被在那里侦听的 HTTP Connector 获得
- Connector 把该请求交给它所在的 Service 的 Engine 来处理,并等待来自 Engine 的回应
- Engine 获得请求 localhost:8080/webbei/index.jsp,匹配名为 localhost 的虚拟主机(Host)
- localhost Host 获得请求/webbei/index.jsp,匹配名为/webbei 的 Context(web app)
- path="/webbei"的 Context 获得请求/index.jsp,在它的 mapping table 中寻找对应的 servlet
- Context 匹配到 URL PATTERN 为*.jsp 的 servlet,对应于 JspServlet 类
- 构造 HttpServletRequest 对象和 HttpServletResponse 对象,作为参数调用 JspServlet 的 doGet 或 doPost 方法
- Context 把执行完了之后的 HttpServletResponse 对象返回给 Host
- Host 把 HttpServletResponse 对象返回给 Engine
- Engine 把 HttpServletResponse 对象返回给 Connector
- Connector 把 HttpServletResponse 对象返回给客户端 browser
附加:tomcat-users
<?xml version="1.0" encoding="UTF-8"?>
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="admin" password="admin" roles="admin,manager"/>
</tomcat-users>
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于