2.2 server.xml解剖:三大配置文件地图


文档摘要

2.2 server.xml 解剖:配置文件地图 本节摘要:server.xml 是 Tomcat 管道的设计图,本节按 Server、Service、Connector、Engine、Host、Context 的嵌套层级自外向内拆解它,并用一张分层地图划清 conf 目录里六份配置文件各自的管辖范围。学完你面对任何配置需求——改端口、调线程池、加虚拟主机、设 JVM 内存、配数据源——都能立刻说出该动哪个文件的哪一层。 装备已经装好(2.1),现在拆图纸。这一节产出的"配置落点地图"会服务全册:第 3 章调连接器、第 4 章配部署、第 5 章设认证、第 7 章做调优,每一次改动前都先回到这张地图确认落点。

2.2 server.xml 解剖:配置文件地图

本节摘要:server.xml 是 Tomcat 管道的设计图,本节按 Server、Service、Connector、Engine、Host、Context 的嵌套层级自外向内拆解它,并用一张分层地图划清 conf 目录里六份配置文件各自的管辖范围。学完你面对任何配置需求——改端口、调线程池、加虚拟主机、设 JVM 内存、配数据源——都能立刻说出该动哪个文件的哪一层。

装备已经装好(2.1),现在拆图纸。这一节产出的"配置落点地图"会服务全册:第 3 章调连接器、第 4 章配部署、第 5 章设认证、第 7 章做调优,每一次改动前都先回到这张地图确认落点。

把 conf 目录摊在桌上

conf 目录里躺着七八个文件,看起来吓人,其实按"管什么"分成三层:管整条管道的、管某个部件的、管某个应用的。先上地图。

图 2-2:配置文件分层地图——每个需求都有唯一落点

图 2-2:配置文件分层地图——每个需求都有唯一落点

三层之下还有一条隐形规则:低层覆盖高层。应用级 context.xml 里的设置会覆盖全局 context.xml 的同名设置,全局 web.xml 给所有应用垫了默认 Servlet 映射,应用的 web.xml 可以增删。想明白覆盖方向,一半的"改了没生效"问题就有了答案——你改的是被覆盖的那层。

自外向内拆 server.xml

server.xml 的结构是俄罗斯套娃:最外层 Server,里面是 Service,Service 把 Connector 与 Engine 拴在一起。先看去掉血肉后的骨架。

<!-- server.xml 骨架:五层嵌套一览 --> <Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"/> </Engine> </Service> </Server>

每一层的角色,用管道语言再说一遍。Server 是整个 JVM 进程的代表,持有那个著名的关闭端口 8005——向它发送 SHUTDOWN 字符串就能优雅停机,所以生产上必须改掉默认值或用防火墙封住,第 7 章安全加固会回来处理它。Service 是"一组连接器配一个引擎"的组合单位:Connector 负责把外面的协议翻译进来,Engine 负责消化,同一个 Service 里的多个 Connector 共享一个 Engine。Engine 与 Host 属于第 4 章的指路系统。Context 在 server.xml 里默认不可见——它由 webapps 目录自动部署产生,这正是"约定优于配置"在 Tomcat 里的体现。

骨架之外,两个高频部件值得当场认脸。线程池(Executor)定义在 Service 层,供连接器引用,把"线程从哪来"从连接器配置里独立出来。

<!-- 定义共享线程池 供多个 Connector 引用 --> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="200" minSpareThreads="10"/> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"/>

全局阀门(Valve)挂在 Engine 或 Host 层,对所有经过的请求生效,比如把访问日志统一搬到 AccessLogValve 的自定义格式——第 5 章细讲阀门,此处先记住它的挂点。

<!-- Host 层的全局访问日志阀门 --> <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>

catalina.properties 与脚本级配置

catalina.properties 常被忽略,但两件事使它不可替代。第一,server.xml 里的端口写法支持占位符,占位值就定义在 catalina.properties,运维可以只改属性文件不动 XML。第二,它定义了common、server、shared三个类加载层级的加载路径,应用之间共享驱动包时靠它登记。

# catalina.properties 节选:端口占位与共享包 http.port=8080 ajp.port=8009 # # 把数据库驱动放进共享层(分号为 Windows 路径分隔符) common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"

还有一类配置不在 conf 目录而在 bin——JVM 内存、垃圾回收器这些进程级参数,规范落点是 bin 目录下自建的 setenv 脚本(Linux 与 Windows 各一份),启动脚本会自动 source 它。把 JAVA_OPTS 写进 catalina 脚本本身是坏习惯:升级 Tomcat 换了目录,参数就丢了。

# bin 目录下新建 setenv.sh 内容示例 JAVA_OPTS="-Xms1g -Xmx2g -XX:+UseG1GC -Dfile.encoding=UTF-8"

💡 关键直觉:配置放错层,等于把家里的事写到城市规划图上。JVM 参数进 setenv、端口进 server.xml、应用数据源进应用 context.xml——各归各位,升级与排障时才不会互相踩脚。

快速定位练习

拿四个真实需求练一遍"先问层级再找文件":改 HTTPS 端口——实例级,server.xml 的 Connector;调大堆内存——进程级,setenv 脚本;给某个应用配数据库连接池——应用级,应用的 context.xml 或 META-INF 下的片段;给 manager 应用加账号——实例级,tomcat-users.xml 配角色,再确认应用的 web.xml 用了对应的认证方式。四个需求四个落点,没有一个需要碰全局 web.xml——除非你要改所有应用的默认会话超时。

收束:一张地图走全册

  • 三层管辖:实例级管整条管道,部件级管默认值,应用级只管自己,低层覆盖高层。
  • server.xml 五层套娃:Server 包 Service,Service 拴 Connector 与 Engine,Engine 下挂 Host,Context 由部署产生。
  • 线程池与阀门有挂点:Executor 在 Service 层共享,Valve 挂 Engine 或 Host 对全局生效。
  • 进程参数走 setenv:JVM 内存与编码不进任何 XML,升级不丢配置。
  • 占位符解耦运维:端口变量定义在 catalina.properties,XML 只引用。

图纸在手,漫游正式开始。第 3 章走到城门口——看 Connector 如何接住第一个字节。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U