server.xml
tomcat 的主配置文件,包含 service,connectors,engine,realm,valve,hosts 等组件
Server 实例/Tomcat 容器 <Server port=”8005” shutdown=”SHUTDOWN”>
整个 Catalina 容器的入口点,通过 Serverfactory 生成 Server 实例类(即一个 JVM),它监听在 8005 端口以接收 shutdown 命令
- className: 用于实现此 Server 容器的完全限定类的名称,默认为 org.apache.catalina.core.StandardServer;
- port: 接收 shutdown 指令的端口,默认仅允许通过本机访问,默认为 8005;
- shutdown:发往此 Server 用于实现关闭 tomcat 实例的命令字符串,默认为 SHUTDOWN
服务 <Service name=”Catalina”>
这定义了一个名为 Catalina 的 Service(服务),此名字也会在产生相关的日志信息时记录在日志文件当中。N 个 Connector+1 个 Engine,处理所有 Connector 所获得的请求
连接器 <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443"/>
Connector 即连接器,一个引擎可以有一个或多个连接器,以适应多种请求方式。把从 Socket 传递过来的数据封装成 Request,传递给容器。通常有 4 种连接器:
- HTTP 连接器
- SSL 连接器
- AJP 1.3 连接器
- proxy 连接器
不同连接器有不同的属性,以下为连接器常用的属性:
- address:指定连接器监听的地址,默认为所有地址,即 0.0.0.0;
- maxThreads:支持的最大并发连接数,默认为 200;
- port:监听的端口,默认为 0;
- protocol:连接器使用的协议,默认为 HTTP/1.1,定义 AJP 协议时通常为 AJP/1.3;
- redirectPort:如果某连接器支持的协议是 HTTP,当接收客户端发来的 HTTPS 请求时,则转发至此属性定义的端口;
- connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为 60000,即 1 分钟;
- enableLookups:是否通过 request.getRemoteHost()进行 DNS 查询以获取客户端的主机名;默认为 true;
- acceptCount:设置等待队列的最大长度;通常在 tomcat 所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;
引擎 <Engine name="Catalina" defaultHost="localhost">
Engine 是 Servlet 处理器的一个实例,即 servlet 引擎,默认为定义在 server.xml 中的 Catalina,Engine 收到 Connector 传递来的请求后,它把该请求匹配到某个 Host 上,然后把该请求交给该 Host 来处理,如果没有匹配到,则用默认的 Host,此处是 localhost,Engine 常用类型有 2 种,Catalina 和 Standalone
- defaultHost:Tomcat 支持基于 FQDN 的虚拟主机,这些虚拟主机可以通过在 Engine 容器中定义多个不同的 Host 组件来实现;但如果此引擎的连接器收到一个发往非非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在 Engine 中定义的多个虚拟主机的主机名称中至少要有一个跟 defaultHost 定义的主机名称同名;
- name:Engine 组件的名称,用于日志和错误信息记录时区别不同的引擎
主机 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"></Host>
主机或虚拟主机,当 Host 获得一个请求时,将把该请求匹配到某个 Context 上,然后把该请求交给该 Context 来处理
- appBase:此 Host 的 webapps 目录,即存放非归档的 web 应用程序的目录或归档后的 WAR 文件的目录路径;可以使用基于 $CATALINA_HOME 的相对路径;
- autoDeploy:在 Tomcat 处于运行状态时放置于 appBase 目录中的应用程序文件是否自动进行 deploy;默认为 true;
- unpackWars:在启用此 webapps 时是否对 WAR 格式的归档文件先进行展开;默认为 true;
应用程序 <Context docBase="bsplatform" path="/bsplatform" reloadable="true" source="org.eclipse.jst.j2ee.server:bsplatform"/>
一个 Context 定义用于标识 tomcat 实例中的一个 Web 应用程序,一个应用程序由 N 个 Servlet 组成,Context 根据 web.xml 载入 Servlet 类
- docBase:相应的 Web 应用程序的存放位置;也可以使用相对路径,起始路径为此 Context 所属 Host 中 appBase 定义的路径;切记,docBase 的路径名不能与相应的 Host 中 appBase 中定义的路径名有包含关系,比如,如果 appBase 为 deploy,而 docBase 绝不能为 deploy-bbs 类的名字;
- path:相对于 Web 服务器根路径而言的 URI;如果为空“”,则表示为此 webapp 的根路径;如果 context 定义在一个单独的 xml 文件中,此属性不需要定义;
- reloadable:是否允许重新加载此 context 相关的 Web 应用程序的类;默认为 false;
安全上下文 <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
一个 Realm 表示一个安全上下文,它是一个授权访问某个给定 Context 的用户列表和某用户所允许切换的角色相关定义的列表,Realm 就像是一个用户和组相关的数据库。
- classname: 用于表示此 Realm 认证的用户及角色等认证信息的存放位置
5 种 realm
- JAASRealm:基于 Java Authintication and Authorization Service 实现用户认证;
- JDBCRealm:通过 JDBC 访问某关系型数据库表实现用户认证;
- JNDIRealm:基于 JNDI 使用目录服务实现认证信息的获取;
- MemoryRealm:查找 tomcat-user.xml 文件实现用户信息的获取;
- UserDatabaseRealm:基于 UserDatabase 文件(通常是 tomcat-user.xml)实现用户认证,它实现是一个完全可更新和持久有效的 MemoryRealm,因此能够跟标准的 MemoryRealm 兼容;它通过 JNDI 实现;
附带一个用 jdbc 获取用户认证信息的例子
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority"
connectionName="test" connectionPassword="test"
userTable="users" userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
过滤器 <Context path="/probe" docBase="probe"><Valve className="org.apache.catalina.valves.RemoteAddrValve"allow="127.0.0.1"/></Context>
Valve 类似于过滤器,它可以工作于 Engine 和 Host/Context 之间、Host 和 Context 之间以及 Context 和 Web 应用程序的某资源之间。一个容器内可以建立多个 Valve,而且 Valve 定义的次序也决定了它们生效的次序。
两种 value
- RemoteHostValve: 基于主机名称的访问控制,,控制本身可以通过 allow 或 deny 来进行定义
- RemoteAddrValve: 基于 IP 地址的访问控,,控制本身可以通过 allow 或 deny 来进行定义
参数定义
- className:相关的 java 实现的类名,相应于分别应该为 org.apache.catalina.valves.RemoteHostValve 或 org.apache.catalina.valves.RemoteAddrValve;
- allow:以逗号分开的允许访问的 IP 地址列表,支持正则表达式,因此,点号“.”用于 IP 地址时需要转义;仅定义 allow 项时,非明确 allow 的地址均被 deny;
- deny: 以逗号分开的禁止访问的 IP 地址列表,支持正则表达式;使用方式同 allow;
web.xml
遵循 Servlet 规范标准的配置文件,用于配置 servlet,并为所有的 Web 应用程序提供包括 MIME 映射等默认配置信息
tomcat-user.xml
Realm 认证时用到的相关角色、用户和密码等信息;Tomcat 自带的 manager 默认情况下会用到此文件;在 Tomcat 中添加/删除用户,为用户指定角色等将通过编辑此文件实现
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager-gui" />
<!-- 定义一种角色名为:manager-gui -->
<user username="cz" password="manager$!!110" roles="manager-gui" />
<!-- 定义一个用户的用户名以及密码,并赋予manager-gui的角色 -->
</tomcat-users>
catalina.policy
java 相关的安全策略配置文件,在系统资源级别上提供访问控制的能力
catalina.properties
Tomcat 内部 package 的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat 在启动时会事先读取此文件的相关设置
logging.properties
Tomcat 通过自己内部实现的 JAVA 日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组件级别以及日志文件的存在位置等
context.xml
所有 host 的默认配置信息
解析一次 HTTP 请求
假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp
- 请求被发送到本机端口 8080,被在那里侦听的 Coyote HTTP/1.1 Connector 获得
- Connector 把该请求交给它所在的 Service 的 Engine 来处理,并等待来自 Engine 的回应
- Engine 获得请求 localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机 Host
- Engine 匹配到名为 localhost 的 Host(即使匹配不到也把请求交给该 Host 处理,因为该 Host 被定义为该 Engine 的默认主机)
- localhost Host 获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有 Context
- Host 匹配到路径为/wsota 的 Context(如果匹配不到就把该请求交给路径名为""的 Context 去处理)
- path="/wsota"的 Context 获得请求/wsota_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
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于