Tomcat
Tomcat 是一个开源的 Java 应用服务器,它由多个关键组件组成。这些组件共同协作,实现了 Servlet 容器的功能。以下是 Tomcat 的核心组件说明及其逻辑架构的示意图。
1. Tomcat 核心组件说明
(1) Server
- 描述:Tomcat 的顶级组件,是整个服务器实例的代表。
- 配置文件 :
server.xml
。 - 功能 :
-
包含多个 Service 组件。
-
管理整个 Tomcat 实例的生命周期。
<Server port="8005" shutdown="SHUTDOWN"> ... </Server>
-
(2) Service
- 描述 :代表一个逻辑服务,关联一个
Connector
和一个Engine
。 - 功能 :
-
管理一组组件(连接器和处理引擎)。
-
一个 Server 可以有多个 Service。
<Service name="Catalina"> ... </Service>
-
(3) Connector
- 描述 :负责接收客户端请求并将其转发到
Engine
处理。 - 功能 :
- 支持多种协议(如 HTTP、AJP)。
- 将外部请求转换为内部
ServletRequest
和ServletResponse
。
- 常见配置 :
-
HTTP Connector:处理 HTTP 请求。
-
AJP Connector:与其他 Web 服务器(如 Apache HTTPD)通信。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
-
(4) Engine
- 描述:Service 的核心组件,用于处理请求。
- 功能 :
-
接收 Connector 转发的请求。
-
将请求分发到适当的 Host。
<Engine name="Catalina" defaultHost="localhost"> ... </Engine>
-
(5) Host
- 描述:表示一个虚拟主机。
- 功能 :
-
允许在同一个 Tomcat 实例中运行多个 Web 应用,每个 Host 绑定一个域名。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> ... </Host>
-
(6) Context
- 描述:表示一个具体的 Web 应用程序。
- 功能 :
-
提供 Web 应用的运行环境。
-
每个 Web 应用对应一个 Context。
<Context path="/myapp" docBase="myapp" reloadable="true" />
-
(8) Valve
- 描述:一种特殊的组件,用于拦截和处理请求。
- 功能 :
-
可用于日志记录、访问控制等。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
-
(9) Loader
- 描述:负责加载 Web 应用的类。
- 功能 :
- 每个 Web 应用都有独立的类加载器。
(10) Manager
- 描述:管理 Web 应用的会话。
- 功能 :
- 支持会话的持久化和恢复。
Tomcat 的组件关系逻辑
以下是组件之间的关系描述:
- Server 是顶层组件,包含多个 Service。
- 每个 Service 包括一个 Engine 和一个或多个 Connector。
- Engine 负责处理请求,将其分发到多个 Host。
- 每个 Host 可以包含多个 Context(Web 应用)。
- Realm 提供 Host 或 Context 级别的用户身份验证。
2. Tomcat 组件示意图
+-------------------------------+
| Server |
| (e.g., port:8005) |
+-------------------------------+
|
v
+-------------------------------+
| Service |
| (e.g., name:Catalina) |
+-------------------------------+
|
+----------+-----------+
| |
v v
+-----------+ +-----------------+
| Connector | | Engine |
| (e.g., | | (name:Catalina)|
| HTTP/8080)| | defaultHost: |
+-----------+ | localhost |
+-----------------+
|
+----------------+----------------+
| |
v v
+---------------+ +---------------+
| Host | | Host |
| (localhost) | | (otherhost) |
+---------------+ +---------------+
|
+-------+-------+
| |
v v
+-----------+ +-----------+
| Context | | Context |
| (/myapp) | | (/admin) |
+-----------+ +-----------+
3. 重点理解
- 层次结构 :Tomcat 的架构是一个典型的树状结构,
Server > Service > Engine > Host > Context
。 - 可扩展性:各组件可以独立配置和扩展。例如,可以添加多个 Service 或虚拟主机。
- 安全性 :通过
Realm
提供安全验证机制。
这种架构设计使 Tomcat 灵活且可扩展,同时也便于管理多个 Web 应用和虚拟主机。
Nginx
正向代理与反向代理
- 正向代理:客户端通过代理服务器访问目标服务器,代理服务器代表客户端发起请求,通常用于隐藏客户端身份或突破访问限制。
- 反向代理:代理服务器接收客户端请求并将其转发到后端服务器,代理服务器代表后端服务器响应客户端,通常用于隐藏后端服务器、负载均衡和增强安全性。
特性 | 正向代理 | 反向代理 |
---|---|---|
服务对象 | 客户端 | 服务器 |
用途 | 客户端访问外部资源 | 客户端访问后端资源 |
隐藏身份 | 隐藏客户端的身份 | 隐藏服务器的身份 |
典型应用 | 翻墙、访问限制资源、缓存客户端请求 | 负载均衡、隐藏后端、缓存后端响应 |
反向代理简介
Nginx 作为反向代理服务器时,客户端并不直接访问后端服务器,而是通过 Nginx 转发请求。
Nginx 在客户端和后端服务器之间充当中间层,隐藏后端服务器的 IP 和端口,提高安全性和灵活性。
反向代理流程
- 客户端发起请求
- 客户端访问 Nginx,Nginx 监听特定端口(如 80 或 443)。
- Nginx 转发请求
- 根据
proxy_pass
配置,Nginx 将请求转发到后端服务器(如 127.0.0.1:8080)。
- 根据
- 后端处理请求
- 后端服务器处理请求并生成响应。
- Nginx 返回响应
- Nginx 将后端的响应返回给客户端。
Nginx负载均衡
Nginx 可以将请求分发到多个后端服务器(上游服务器),实现负载均衡,提升系统的并发能力和可靠性。
负载均衡算法
Nginx 提供多种负载均衡算法:
- 轮询(默认)
- 请求依次分发到每个后端服务器。
- 权重(Weighted Round Robin)
- 根据服务器性能设置权重,权重高的服务器分配更多请求。
- IP Hash
- 同一客户端 IP 的请求固定转发到某台服务器,常用于状态保持场景。
Nginx 处理请求和响应
请求处理流程
-
客户端请求
- 客户端通过浏览器或其他工具发送 HTTP/HTTPS 请求到 Nginx。
-
Nginx 接收请求
- Nginx 的
worker process
根据配置文件处理请求,包括路由到静态资源、反向代理到后端服务器等。
- Nginx 的
-
匹配 Location
- 根据
server
和location
块的配置,Nginx 确定如何处理请求。 - 可能的操作:
- 提供静态资源(如 HTML、CSS、JS)。
- 转发到上游服务器(反向代理)。
- 拒绝或重定向请求。
- 根据
-
生成或获取响应
- Nginx 将响应直接返回给客户端,或从后端服务器获取响应再转发。
响应处理流程
-
静态资源响应
- 如果请求的资源是静态文件(如图片、HTML 文件),Nginx 直接从文件系统读取并返回。
-
动态内容响应
- 对于动态请求,Nginx 转发到后端(如 Tomcat、Flask)处理,并将后端生成的响应返回给客户端。
-
缓存和压缩
-
Nginx 支持缓存后端响应(如 CDN 缓存)。
-
支持 Gzip 压缩,提高传输效率。
+-------------------------+ | 客户端 (Browser) | +-------------------------+ | v +-------------------------+ | Nginx | | | | - 静态资源处理 | | - 请求路由 | | - 反向代理和负载均衡 | +-------------------------+ | +----------------+----------------+ | | v v
+--------------+ +--------------+
| 后端服务器1 | | 后端服务器2 |
| (Tomcat/Flask)| | (Django) |
+--------------+ +--------------+ -
优势总结
Nginx 处理请求和响应
- 高效处理静态资源,支持缓存和压缩。
- 异步事件驱动模型,处理高并发时性能优越。
Nginx 负载均衡
- 提高系统的扩展性和稳定性。
- 灵活的算法(轮询、权重、最少连接等)适配不同场景。
Nginx 反向代理
- 隐藏后端服务器,增强安全性。
- 支持 HTTPS 和请求头重写。