Tomcat server top-level structure
Let's first look at the Tomcat architecture diagram
. The top container in Tomcat is Server, which represents the entire server. As can be seen from the above figure, a Server can contain at least one Service, which is used to provide specific services. Service mainly consists of two parts: Connector and Container.
Connector is used to handle link-related things, and provides Socket and Request and Response-related conversions;
Container is used to encapsulate and manage Servlets, and to specifically handle Request requests;
There is only one Server in a Tomcat, a Server can contain multiple Services, a Service has only one Container, but there can be multiple Connectors, this is because a service can have multiple connections, such as providing http and https links at the same time, it can also provide Connections to different ports of the same protocol.
Multiple Connectors and one Container form a Service. With the Service, you can provide services to the outside world, but the Service also needs a living environment. Someone must be able to give her life and control her life and death, so it must be Server. . So the whole life cycle of Tomcat is controlled by Server.
server.xml content
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--><!-- Note: A "Server" is not itself a "Container", so you may not
define subcomponents such as "Valves" at this level.
Documentation at /docs/config/server.html
--><Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>
<!-- A "Service" is a collection of one or more "Connectors" that share
a single "Container" Note: A "Service" is not itself a "Container",
so you may not define subcomponents such as "Valves" at this level.
Documentation at /docs/config/service.html
-->
<Service name="Catalina">
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
This connector uses the NIO implementation that requires the JSSE
style configuration. When using the APR/native implementation, the
OpenSSL style configuration is required as described in the APR/native
documentation -->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host).
Documentation at /docs/config/engine.html -->
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<Engine defaultHost="localhost" name="Catalina">
<!--For clustering, please take a look at documentation at:
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation) -->
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<!-- Use the LockOutRealm to prevent attempts to guess user passwords
via a brute-force attack -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<!-- 最后一次编辑的项目是BDQX-->
<Context docBase="BDQX" path="/BDQX" reloadable="true" source="org.eclipse.jst.jee.server:BDQX"/></Host>
</Engine>
</Service>
</Server>
Tomcat link method
Multiple Connectors and one Container form a Service. With the Service, you can provide services to the outside world, but the Service also needs a living environment. Someone must be able to give her life and control her life and death, so it must be Server. ! So the whole life cycle of Tomcat is controlled by Server.
Tomcat top-level architecture summary
- There is only one Server in Tomcat, a Server can have multiple Services, and a Service can have multiple Connectors and one Container;
- Server is in charge of the life and death of the entire Tomcat;
- Service is to provide services to the outside world;
- Connector is used to accept requests and encapsulate requests into Request and Response for specific processing;
- Container is used to encapsulate and manage servlets, and to process request requests specifically; from the above content, we can roughly know that after a request is sent to Tomcat, it will first pass through the Service and then be handed over to our Connector. The Connector is used to receive requests and encapsulate the received requests. The Request and Response are specifically processed. After the Request and Response are encapsulated, they are handed over to the Container for processing. After the Container processes the request, it is returned to the Connector. Finally, the Connector returns the processing result to the client through the Socket, so that the entire request is processed. It's done!
The bottom layer of Connector uses Socket to connect, Request and Response are encapsulated according to HTTP protocol, so Connector needs to implement TCP/IP protocol and HTTP protocol at the same time!
Container Architecture Analysis
The functions of the four sub-containers are:
- Engine: Engine, used to manage multiple sites, a Service can only have at most one Engine;
- Host: Represents a site, which can also be called a virtual host. You can add sites by configuring Host;
- Context: represents an application, corresponding to a set of programs usually developed, or a WEB-INF directory and the following web.xml file;
- Wrapper: Each Wrapper encapsulates a Servlet;
The difference between Context and Host is that Context represents an application. Each folder directory under webapps in the default configuration of our Tomcat is a Context, in which the ROOT directory stores the main application, other directories store sub-applications, and the entire webapps is a Host site.
When we access the application context, if it is under ROOT, it can be accessed directly by using the domain name, for example: www.ledouit.com, if it is another application under Host (webapps), you can use www.ledouit.com/docs. Access, of course, the root application (ROOT) specified by default can be set, but the default main application under the Host site is under the ROOT directory.