82.md 11.4 KB
Newer Older
W
wizardforcel 已提交
1
# Tomcat – 架构和`server.xml`配置
W
wizardforcel 已提交
2 3 4

> 原文: [https://howtodoinjava.com/tomcat/tomcats-architecture-and-server-xml-configuration-tutorial/](https://howtodoinjava.com/tomcat/tomcats-architecture-and-server-xml-configuration-tutorial/)

W
wizardforcel 已提交
5
我们已经学习了,[**当您在服务器上部署 Web 应用并通过浏览器进行访问时,Web 服务器通常是如何工作的**](//howtodoinjava.com/for-fun-only/a-birds-eye-view-on-how-web-servers-work/ "A birds-eye view on “how web servers work?”")。 现在,让我们学习一下服务器内部可能无法在日常工作中使用的东西,但是当您初次配置应用时,它们肯定会为您提供帮助。 我长期以来一直在使用 **tomcat 服务器**,因此我将其用作教程。 将来,只要时间允许,我将尝试在其他服务器上分享我的经验。
W
wizardforcel 已提交
6

W
wizardforcel 已提交
7
[**Apache Tomcat**](https://tomcat.apache.org/ "tomcat") 是由 Apache 软件基金会(ASF)开发的开源 Web 服务器和 Servlet 容器。 Tomcat 实现了几种 Java EE 规范,包括 Java Servlet,JavaServer Pages(JSP),Java EL 和 WebSocket,并提供了运行 Java 代码的“纯 Java” HTTP Web 服务器环境([Wiki](https://en.wikipedia.org/wiki/Apache_Tomcat "wiki tomcat"))。
W
wizardforcel 已提交
8 9 10

## Tomcat 的架构

W
wizardforcel 已提交
11
**Tomcat 的架构**由一系列功能组件组成,可以根据明确定义的规则进行组合。
W
wizardforcel 已提交
12 13 14

![Tomcat Architecture](img/3c43c5e87ebcfa1b2ff3850bcd827fc6.png)

W
wizardforcel 已提交
15
Tomcat 架构
W
wizardforcel 已提交
16 17 18 19 20



每个服务器安装的结构(通过这些功能组件)在文件`server.xml`中定义,该文件位于 **Tomcat 的安装文件夹**`/conf`子目录中。 让我们详细讨论这些组件。

W
wizardforcel 已提交
21
## `server.xml`组件
W
wizardforcel 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

默认情况下,`server.xml`文件随附此配置,我们将详细研究其元素。

```java
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
   <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
   <Listener className="org.apache.catalina.core.JasperListener" />
   <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
   <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
   <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
   <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 name="Catalina">
     <Connector port="8080" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="8443" />
     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
     <Engine name="Catalina" defaultHost="localhost">
       <Realm className="org.apache.catalina.realm.LockOutRealm">
         <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                resourceName="UserDatabase"/>
       </Realm>
       <Host name="localhost"  appBase="webapps"
             unpackWARs="true" autoDeploy="true">
         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                prefix="localhost_access_log." suffix=".txt"
                pattern="%h %l %u %t &quot;%r&quot; %s %b" />
       </Host>
     </Engine>
   </Service>
</Server>

```

让我们从内到外讨论 **tomcat 配置文件**的功能组件,以更好地关联事物。

W
wizardforcel 已提交
64
#### 上下文
W
wizardforcel 已提交
65

W
wizardforcel 已提交
66
上下文是一组称为容器的 Tomcat 组件的最里面的元素,它**代表单个 Web 应用**。 Tomcat 在加载应用时自动实例化并配置标准上下文。 作为配置的一部分,Tomcat 还处理应用文件夹的`\WEB-INF\web.xml`文件中定义的属性,并使这些属性可用于应用。
W
wizardforcel 已提交
67

W
wizardforcel 已提交
68
#### 连接器(16-19 行)
W
wizardforcel 已提交
69 70 71

**连接器处理与客户端的通信。** Tomcat 提供了多个连接器,例如 HTTP 连接器用于大多数 HTTP 通信,AJP 连接器实现将 Tomcat 连接到另一个 Web 服务器(例如 Apache HTTPD 服务器)时使用的 AJP 协议。

W
wizardforcel 已提交
72
Tomcat 的默认配置包括一个用于处理 HTTP 通信的连接器。 默认情况下,此连接器等待通过端口 **8080** 发出的请求。 这就是我们示例的 URL 始终以`http://localhost:8080/`开头的原因。 请注意,对所有应用的请求都通过此连接器的单个实例。 每个新请求都会导致实例化一个新线程,该新线程在请求​​期间将保持活动状态。 互联网上有关 Tomcat 的文章通常将此连接器称为“**`Coyote`**”。
W
wizardforcel 已提交
73

W
wizardforcel 已提交
74
`connectionTimeout`属性设置为 20,000 表示会话在闲置 5 小时,33 分钟和 20 秒后终止,而`redirectPort="8443"`表示需要安全套接字层(SSL)传输的传入请求将重定向到端口 8443。
W
wizardforcel 已提交
75 76 77

AJP 连接器使 Tomcat 只处理动态网页,而让纯 HTML 服务器(例如 Apache Web 服务器)处理对静态页面的请求。 这样可以最大程度地处理请求。 您可能可以注释掉此连接器,因为 tomcat 本身今天已经非常快,或者只是如果您不打算将 Web 服务器与 Tomcat 一起使用,则可以将其注释掉。

W
wizardforcel 已提交
78
#### 主机(第 25-30 行)
W
wizardforcel 已提交
79

W
wizardforcel 已提交
80
**主机是网络名称的关联,例如`www.yourdomain.com`,访问 Tomcat 服务器。** 主机可以包含任意数量的上下文(即应用)。 您可以在同一服务器上定义多个主机。 例如,如果您已注册域`yourdomain.com`,则可以定义主机名,例如`w1.yourdomain.com``w2.yourdomain.com`。 请记住,只有当域名服务器将其名称映射到计算机的 IP 地址时,才可以从互联网访问它。
W
wizardforcel 已提交
81

W
wizardforcel 已提交
82
Tomcat 的默认配置包括名为 **localhost** 的主机。 可以通过在文件`C:\Windows\System32\drivers\etc\hosts`中写入一个项目来完成 **localhost** 与您的计算机之间的关联。
W
wizardforcel 已提交
83

W
wizardforcel 已提交
84
主机属性“`appBase`”定义了 Tomcat 安装文件夹中的应用目录。 然后,每个应用通过该目录中的路径进行标识。 唯一的例外是根路径,该路径已映射到空字符串。 本地主机的应用基本目录是`webapps`。 这意味着目录“`C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ROOT\`”中的应用由空字符串标识。 因此,其 URL 为“`http://localhost:8080/`”。 对于驻留在根以外的目录中的其他应用,如“`C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\myapp\`”,URL 类似于“`http://localhost:8080/myapp/`”。
W
wizardforcel 已提交
85

W
wizardforcel 已提交
86
属性`unpackWARs="true"`表示,如果将 WAR 文件拖放到`appBase`目录中,Tomcat 将自动将其扩展到普通文件夹中。 如果将此属性设置为`false`,则应用将直接从 WAR 文件运行。 这显然意味着应用的执行速度较慢,因为 Tomcat 需要在执行时解压缩 WAR 文件。
W
wizardforcel 已提交
87

W
wizardforcel 已提交
88
属性`autoDeploy="true"`表示,如果在 Tomcat 运行时将应用放置在`appBase`目录中,它将被自动部署。
W
wizardforcel 已提交
89

W
wizardforcel 已提交
90
#### 引擎(第 20 行)
W
wizardforcel 已提交
91 92 93 94 95

**引擎代表特定服务的请求处理管道。** 由于服务可能具有多个连接器,因此引擎从这些连接器接收并处理所有请求,将响应传递回适当的连接器以传输到客户端。

引擎必须包含一个或多个主机,其中之一被指定为默认主机。 Tomcat 的默认配置包括引擎 Catalina,该引擎包含主机 localhost(显然是默认主机,因为它是唯一的主机)。 Catalina 引擎处理通过 HTTP 连接器收到的所有传入请求,并发回相应的响应。 它根据请求头中包含的信息将每个请求转发到正确的主机和上下文。

W
wizardforcel 已提交
96
#### 服务(第 15 行)
W
wizardforcel 已提交
97 98 99

**服务是驻留在服务器内部的一个中间组件,并且将一个或多个连接器与一个引擎完全绑定在一起。** Tomcat 的默认配置包括服务 Catalina,该服务将 HTTP 和 AJP 连接器关联到 Catalina 引擎。 因此,连接器和引擎是 Service 元素的子元素。

W
wizardforcel 已提交
100
用户很少自定义 Service 元素,因为默认实现很简单并且足够。
W
wizardforcel 已提交
101

W
wizardforcel 已提交
102
#### 服务器(第 2 行)
W
wizardforcel 已提交
103 104 105 106 107

**服务器是最重要的组件,代表 Tomcat 的一个实例。** 它可以包含一个或多个服务,每个服务都有自己的引擎和连接器。

现在,让我们讨论以上`server.xml`中使用的其他一些概念。

W
wizardforcel 已提交
108
#### 监听器(3-7 行)
W
wizardforcel 已提交
109

W
wizardforcel 已提交
110
监听器是一个 Java 对象,通过实现`org.apache.catalina.LifecycleListener`接口,它可以响应特定的事件。
W
wizardforcel 已提交
111

W
wizardforcel 已提交
112 113 114 115 116
*   **`AprLifecycleListener`**:启用 Apache 可移植运行时(APR)库。 该库为 tomcat 提供了操作系统级别的支持。
*   **`JasperListener`**:启用 Jasper,它是 JSP 引擎。 该监听器使重新编译已更新的 JSP 文档成为可能。
*   **`JreMemoryLeakPreventionListener`**:处理可能导致内存泄漏的各种已知情况。
*   **`GlobalResourcesLifecycleListener`**:负责实例化与全局 Java 命名和目录接口(JNDI)相关联的托管 Bean。
*   **`ThreadLocalLeakPreventionListener`**:还处理可能导致内存泄漏的各种已知情况。
W
wizardforcel 已提交
117

W
wizardforcel 已提交
118
#### 全局命名资源
W
wizardforcel 已提交
119 120 121

`GlobalNamingResources`元素只能在服务器组件内部定义。 **它定义了整个服务器都可以访问的 JNDI 资源。** 默认`server.xml`中定义的唯一资源是通过文件`conf/tomcat-users.xml`定义的基于用户和密码存储的数据库。

W
wizardforcel 已提交
122
#### 领域(21-24 行)
W
wizardforcel 已提交
123

W
wizardforcel 已提交
124
领域组件可以出现在任何容器组件(引擎,主机和上下门)内。 **它代表用户,密码和用户角色的数据库。 其目的是支持基于容器的认证。**
W
wizardforcel 已提交
125 126 127

除了`UserDatabaseRealm`之外,还提供以下领域类:`JDBCRealm`(用于通过其 JDBC 驱动程序连接到关系数据库),`DataSourceRealm`(用于连接到通过 JNDI 命名的 JDBC 数据源),`JNDIRealm`(用于连接 到轻型目录访问协议目录)和`MemoryRealm`(将 XML 文件加载到内存中)。

W
wizardforcel 已提交
128
#### 阀门(行 27-29)
W
wizardforcel 已提交
129

W
wizardforcel 已提交
130
阀门是类似于拦截器的元素,当插入到容器(上下文,主机或引擎)中时,**会在所有传入的 HTTP 请求到达应用**之前拦截它们。 这使您能够预处理针对特定应用的请求。 虚拟主机中运行的应用或引擎中运行的所有应用。
W
wizardforcel 已提交
131

W
wizardforcel 已提交
132
阀门可以有多种用途,例如:
W
wizardforcel 已提交
133

W
wizardforcel 已提交
134
通过`RemoteAddrValve`阀,您可以根据源 IP 地址有选择地允许或阻止请求。 它支持两个属性 – `allow``block`
W
wizardforcel 已提交
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151

```java
<Valve className="org.apache.catalina.valves.RemoteAddrValve" block="192\.168.*"/>
```

`RemoteHostValve`阀的操作类似于远程地址过滤器,但在客户端主机名而不是客户端 IP 地址上。

```java
<Valve className="org.apache.catalina.valves.RemoteHostValve" deny=".*badweb\.com"/>
```

`RequestDumperValve`记录传入请求的详细信息,因此对于调试目的很有用。

```java
<Valve className="org.apache.catalina.valves.RequestDumperValve"/>
```

W
wizardforcel 已提交
152
`single sign on valve`包含在主机容器中时,其作用是仅对该主机的所有应用进行一次认证。 如果没有此阀,则用户必须在使用每个单独的应用之前输入其 ID 和密码。
W
wizardforcel 已提交
153 154 155 156 157 158 159 160 161 162

```java
<Valve className="org.apache.catalina.valves.SingleSignOn"/>
```

仅限于`server.xml`内部元素的介绍。 将来我将介绍与 tomcat 服务器有关的更多任务/概念。

**祝您学习愉快!**

**参考:** [http://tomcat.apache.org/tomcat-7.0-doc/architecture/overview.html](https://tomcat.apache.org/tomcat-7.0-doc/architecture/overview.html "overview")