ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Tomcat从入门到生产实践:配置、部署与避坑全解析

Tomcat从入门到生产实践:配置、部署与避坑全解析 做Java服务端开发的人几乎没有一个绕得过Tomcat。不管是大学里的Servlet作业还是生产环境里的Spring Boot内嵌容器Tomcat这个名字你绝对不陌生。但很多人对它的理解停留在“双击startup.bat浏览器打开8080看到一个猫”的阶段稍微遇到404、端口占用、JSP编译失败、HTTPS双向认证这类问题就无从下手了。这篇内容我打算从零完整过一遍Tomcat的核心知识点和实验过程覆盖安装配置、IDE集成、war包部署、JSP编译机制、server.xml关键配置、双向TLS认证以及生产环境里的替换方案和避坑经历。无论你是刚入门的学生还是被项目逼着摸了一遍Tomcat的后端萌新都能从中拿到能直接落地的东西。我会尽量用实际踩坑的口吻来讲不写教科书式的废话。1. 先搞懂Tomcat是什么以及它到底解决了什么问题1.1 没有Tomcat的时候你的Web项目是怎么跑的很多初学者第一次接触Tomcat只知道它是一个“服务器”但完全不清楚它凭什么能把一个Java Web项目跑起来。要理解Tomcat得先回到Servlet规范这件事上。浏览器发来的请求是HTTP协议而Java里写业务逻辑用的是类和方法。想让一个Java类处理HTTP请求就必须有人做协议解析、请求封装、响应渲染这些脏活。Tomcat干的事情就是这样它实现了Servlet容器规范把HTTP请求解析成一个HttpServletRequest对象交给你的Servlet类处理再把HttpServletResponse对象转换回HTTP响应发回给浏览器。换句话说Tomcat本身不写业务代码它只是一个“中间人”——你写Servlet它负责让Servlet跑起来并和浏览器对话。1.2 下载Tomcat之后目录里每一层都是干嘛的安装Tomcat其实没有“安装”这个词因为是解压即用的绿色软件。下载zip包后解压出来你会看到bin、conf、lib、logs、temp、webapps、work这些目录。新手最容易忽略的是conf和work但恰恰这两个目录最能救命。bin存放启动和关闭脚本。startup.bat、shutdown.bat、catalina.bat都在这里。Linux下对应的是.sh脚本。confTomcat所有配置文件的所在地。server.xml是最核心的配置文件端口、连接器、虚拟主机、部署路径全在这。libTomcat运行时依赖的jar包。注意所有部署到这里的Web应用都能共享这些jar包但反过来应用自己WEB-INF/lib下的jar包不会互相干扰。logs日志目录。catalina.out、localhost.log这些日志文件是排查问题的第一手资料。webapps默认部署目录。把war包丢进去Tomcat启动时会自动解压部署也有很多人直接把整个Web项目目录放在这里。workJSP编译产物目录。JSP第一次被访问时会翻译成Java文件再编译成class文件结果就存在这里。后面我要专门讲怎么用这个目录查看JSP编译后的代码。temp临时文件目录不用太关心。1.3 版本选择是第一个大坑javax还是jakarta这点必须单独拎出来说因为踩坑的人实在太多了。Tomcat 9及以前遵循的是javax.servlet规范Tomcat 10开始把包名改成了jakarta.servlet。这意味着什么如果你有一个老项目代码里写的是import javax.servlet.http.HttpServlet抛给Tomcat 10跑启动时你会看到一堆ClassNotFoundException或者NoClassDefFoundError。反过来也一样用Tomcat 10规范写的新代码跑到Tomcat 9上也会炸。所以选版本之前先看清楚你的项目依赖。低版本老项目老老实实用Tomcat 8.5或者9新项目可以用Tomcat 10/11。另外顺嘴说一句Tomcat没有32位和64位的区分它是纯Java程序真正有位数要求的是你装的那个JDK。2. 安装、环境变量与启动失败的排查实验2.1 从JDK版本匹配到环境变量配置既然是Java程序安装Tomcat的前提是机器上已经装好了JDK。Tomcat自身对JDK版本有硬性要求比如Tomcat 9需要JDK 8及以上Tomcat 10.1需要JDK 11及以上。用过低版本JDK跑高版本Tomcat报错信息会非常隐晦经常是Tomcat启动日志里出现UnsupportedClassVersionError。环境变量配置这一块核心就是JAVA_HOME。很多教程会让你再去配CATALINA_HOME其实Tomcat启动时最重要的是能找到JAVA_HOME它通过这个变量去定位java可执行文件。CATALINA_HOME更多的是给IDE或者脚本识别用配上也更好省得后面IDEA里还要手动填路径。Windows上的配置方式右键“此电脑”-“属性”-“高级系统设置”-“环境变量”新建JAVA_HOME指向JDK安装目录并把%JAVA_HOME%\bin追加到Path变量里。配置完了在cmd里敲java -version验证一下如果显示版本号说明JDK没问题。2.2 启动一闪就没的通用排查套路“双击startup.bat窗口一闪就没了”这可能是Tomcat新手遇到的最常见问题。这个现象背后通常就三招环境变量错了、端口被占用了、启动日志报错了但你没看到。正确做法是不要在桌面双击startup.bat而是打开cmd手动切换到Tomcat的bin目录执行startup.bat。如果环境变量有问题cmd窗口会直接打出JAVA_HOME相关的错误提示如果没报错但Tomcat没起来再执行一次catalina.bat run这个命令会在前台运行并输出完整启动日志所有异常堆栈都会直接打在屏幕上。端口被占用也是高频原因。Tomcat默认使用8080端口如果本机已经有程序占了8080启动会报Port 8080 was already in use。Windows下查占用端口的方法netstat -ano | findstr 8080看到占用端口的PID后打开任务管理器在详细信息里找到对应PID把它结束掉或者改Tomcat端口。Linux下用lsof -i:8080或者ss -lntp | grep 8080来查。注意改端口要改两处逻辑相关的地方。server.xml里的HTTP Connector端口是第一处如果还开了HTTPS或AJP连接器它们的端口也要确认是否被占用。很多奇怪的启动失败其实都是多个连接器端口里有一个被占了。2.3 能打开首页但路径不对检查URL和webapps目录启动成功之后浏览器访问http://localhost:8080/会看到Tomcat默认首页那一只猫的标志性的页面。如果打不开先确认Tomcat进程是否活着。Linux下排查进程常用ps -ef | grep tomcat把这个命令作为服务端排查的第一反应能确认Tomcat到底有没有在运行以及是用哪个用户、哪条命令启动的。我见过很多次Tomcat明明启动了但浏览器就是访问不了最后排查下来是访问路径问题。Tomcat默认首页映射在根路径/如果你部署的应用上下文路径是/myapp访问入口就是http://localhost:8080/myapp/直接访问根路径当然看不到你的项目。3. 在IDEA和Eclipse里把Tomcat跑起来3.1 新版IDEA中配置Tomcat的完整流程IDEA配置Tomcat这个问题网上教程五花八门版本之间差异也挺大。热词里提到的“IDEA 2025.2.6.1”我虽然没到那个版本但配置思路是一致的入口位置可能稍有变化。以IDEA Ultimate旗舰版为例大体流程是打开File - Settings在Build, Execution, Deployment - Application Servers中点击加号选择Tomcat Server然后指定Tomcat的安装目录。这一步的意义是告诉IDEA你的机子上有一个Tomcat在哪个位置。配置完Application Server之后还需要给具体项目配置运行方式。点击顶部工具栏的下拉框选择Edit Configurations点击左上角加号往下拉找到Tomcat Server - Local。在Server页签里选择刚才配好的Tomcat在Deployment页签里点加号把你的Web项目以Artifact或者war exploded的方式添加进去。Application context这一栏填的就是访问路径比如填/myapp那启动后访问URL就是http://localhost:8080/myapp/。这里多说一句如果版本较新但你在Edit Configurations里找不到Tomcat Server选项不要慌装上Smart Tomcat插件就能解决。这个插件社区版IDEA也能用配置更简化只需要填Tomcat目录然后给每个项目指定部署上下文就行。3.2 社区版IDEA与Eclipse的配置差异IDEA社区版不内置Tomcat集成功能这是很多学生党刚上手时最容易卡住的地方。社区版解决方案有两条路装Smart Tomcat插件或者放弃IDE的Tomcat集成直接用Maven的cargo插件来启停Tomcat。就我个人经验社区版插件方案最省心。装好插件后在Run Configuration里选择Smart Tomcat配置三个关键点Tomcat Server路径、上下文路径、要部署的模块。相比旗舰版的繁琐配置这个方案反而更简单。Eclipse的配置逻辑和IDEA完全不同它是通过Servers视图来管理Tomcat的。在Window - Preferences - Server - Runtime Environments里添加Tomcat运行环境然后在Servers视图里右键新建一个Server。特别注意Eclipse默认会把项目部署到工作空间临时目录里而不是Tomcat安装目录的webapps下。想让它部署到真目录双击Server实例勾选Use Tomcat installation再把Deploy Path改成webapps。3.3 实验查看JSP编译后的Java类JSP本质上就是一个Servlet只不过它以.jsp后缀保存。当浏览器第一次访问某个JSP页面时Tomcat内部的Jasper引擎会把JSP翻译成一个Java源文件再编译成class文件。翻译出来的Java代码其实就是一个继承HttpServlet的类你写在JSP里的%%脚本会被原样塞进_jspService方法里。那么问题来了这个编译产物在哪答案在Tomcat的work目录。默认路径是work/Catalina/localhost/应用上下文/org/apache/jsp/文件名格式和JSP路径对应比如index.jsp就会生成index_jsp.java和index_jsp.class。如果你用的是IDEA/Eclipse启动Tomcatwork目录的位置可能不在Tomcat安装目录下。比如Eclipse会把它藏在当前工作空间的.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work目录下IDEA则可能存放在项目根目录下的out或者target临时目录里。找不到的时候最笨但有效的方法是在项目里全局搜索类似*_jsp.java的文件。打开编译后的Java文件你能清晰看到JSP里静态的HTML内容都变成了out.write()方法动态的Java片段原样保留这就是JSP和Servlet在底层上的关系。想调试JSP里某个变量值又不想在页面打印可以直接在这个Java文件对应的行号打断点。4. 部署Web项目war包、目录映射和404排查4.1 三种部署方式对比各有什么坑Tomcat部署Web项目可以分成三种方式每种都有自己的适用场景。第一种是直接把项目目录或war包丢进webapps目录。这是最朴素的方式适合测试环境。war包会被Tomcat自动解压成同名目录然后以/war包名作为访问路径。坑在于改动后需要重启Tomcat才能生效对于频繁迭代的开发阶段非常不友好。第二种是通过Tomcat Manager来热部署。启动Tomcat后访问http://localhost:8080/manager/html输入配置好的管理员账号密码在页面上传war包或者指定路径部署。这种方式适合在不重启Tomcat的前提下快速更新应用但默认情况下Manager需要额外配置conf/tomcat-users.xml里的用户角色不配置你连不上。第三种是IDE集成的部署方式。IDEA和Eclipse在启动调试时会自动部署项目并且支持热更新。开发阶段强烈建议用这种方式改完Java代码重新编译就可以增量更新效率高很多。4.2 war包手工部署的完整过程从IDEA里构建war包很简单前提是项目里配置好war或者war exploded类型的artifact。Build - Build Artifacts - All Artifacts - Build构建完成后在out/artifacts目录下就能看到war包。如果你的项目是Maven工程更标准的做法是执行mvn clean packagewar包生成在target目录下。拿到war包之后Linux服务器上的部署流程一般是这样的# 停掉Tomcat避免文件锁导致解压失败 sh /opt/tomcat/bin/shutdown.sh # 备份旧包养成好习惯 cp /opt/tomcat/webapps/myapp.war /backup/myapp.war.$(date %Y%m%d%H%M%S) # 删除旧的应用目录和war包 rm -rf /opt/tomcat/webapps/myapp /opt/tomcat/webapps/myapp.war # 上传新war包到webapps目录 # 假设你已经用scp/rz把war包传到了/opt/tomcat/webapps/下 # 启动Tomcat sh /opt/tomcat/bin/startup.sh # 查看启动日志 tail -f /opt/tomcat/logs/catalina.out部署之后访问不了不要急着怀疑代码先看catalina.out日志。日志一旦打出Deployment of web application archive [myapp.war] has finished说明部署成功访问路径就是http://服务器IP:8080/myapp/。4.3 启动后访问404的排查清单展开谈谈“Tomcat启动后访问404”这个高频问题。404不是Tomcat没起来而是请求路径无法匹配到对应的应用和资源。我总结了一份排查顺序每次遇到404都按这个顺序来先确认访问端口对不对。从浏览器地址栏到server.xml里的Connector端口是否一致。确认应用上下文路径。部署后的应用路径是/myapp还是/访问根路径和访问具体应用路径不是一回事。确认war包解压是否成功。看webapps目录下有没有生成对应的应用目录。查看logs/localhost.日期.log这个日志专门记录Tomcat启动过程中加载Web应用的情况里面会写Deployment of web application archive has failed之类的错误原因。确认应用里WEB-INF/web.xml配置的servlet-mapping是否匹配访问地址以及是否有Spring MVC这类框架的前置控制器接管了所有路径。查看应用自己日志中是否报错导致启动失败。很多404是因为项目依赖的jar包缺失导致Servlet没有注册成功。提示IDEA里部署项目后访问404八成是Application context填写不对。IDEA的Tomcat配置里Deployment页签下每个artifact都有一个Application context它决定访问前缀填成/就是根路径访问填成/demo就得到http://localhost:8080/demo/去访问。5. 绕不过去的server.xml端口、HTTPS与双向认证5.1 从一份默认配置说起server.xml是Tomcat配置文件的灵魂。打开它默认的骨架结构大概是这样的最外层是Server节点指定了端口8005和关闭指令里面有一个Service节点名为Catalina再往里是Connector和Engine、Host、Context这些组件。很多新手看不懂这一堆嵌套的XML我打个比方Server是一个完整的Tomcat实例Service是这个实例对外提供的服务Connector是服务接电话的接线员Engine是处理电话的总机Host是按域名区分租户的租房合同Context是租户房间里具体住的应用。Server port8005 shutdownSHUTDOWN Service nameCatalina Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 / Engine nameCatalina defaultHostlocalhost Host namelocalhost appBasewebapps Context path/myapp docBase/data/myapp reloadabletrue/ /Host /Engine /Service /Server5.2 端口8005和redirectPort是什么意思这里专门解释一下热词里提到的Server port8005 shutdownSHUTDOWN。8005端口是Tomcat专门用来接收关闭指令的端口shutdown属性的值SHUTDOWN就是关闭密码。当你在命令行执行shutdown.sh时脚本会向这个端口发送字符串SHUTDOWNTomcat收到后执行关闭流程。这个端口是安全隐患高发区。如果服务器上有防火墙没封掉8005别人可以发送一个SHUTDOWN指令直接把你的Tomcat干掉。生产环境强烈建议改成不容易猜的随机字符串或者直接把port改成-1来禁用这个端口改为用进程管理工具比如systemd来控制启停。redirectPort是另一个高频疑惑点。当请求使用HTTP访问某个资源而这个资源被配置为需要HTTPS安全连接时Tomcat无法用当前HTTP连接器继续处理就会把请求重定向到redirectPort指定的端口。所以redirectPort8443是在告诉Tomcat当遇到HTTP请求需要转HTTPS时请把它转到8443端口HTTPS Connector所在端口。没有配置HTTPS Connector的情况下即使设了redirectPort重定向过去也是白搭连接不上。5.3 实验Tomcat作为客户端实现MTLS双向认证双向TLS认证简单说就是客户端验证服务器的证书同时服务器也验证客户端的证书双方都持有对方的信任凭证任何一方不信任通信就建立不了。这在金融、政务等对安全等级要求高的系统里非常常见。热词里提到“Tomcat作为客户端请求服务端实现MTLS双向认证”说明大家不仅关心服务端怎么配更关心调用方怎么配。先交代证书生成的思路。用JDK自带的keytool命令就能完成。假设已经有一台CA服务器签发好了服务端证书和客户端证书核心步骤是把服务端证书加入客户端的信任库把客户端证书密钥放入客户端的密钥库。Tomcat作为客户端本质就是发起HTTPS请求的Java程序需要用javax.net.ssl.keyStore和javax.net.ssl.trustStore这两个系统属性来指定客户端密钥库和信任库。代码层面最简单的方式是在启动JVM时加参数-Djavax.net.ssl.keyStore/path/to/client.p12 -Djavax.net.ssl.keyStorePasswordchangeit -Djavax.net.ssl.keyStoreTypePKCS12 -Djavax.net.ssl.trustStore/path/to/truststore.jks -Djavax.net.ssl.trustStorePasswordchangeit如果走的Spring Boot项目可以用RestTemplate加自定义SSLContextKeyStore keyStore KeyStore.getInstance(PKCS12); try (InputStream in new FileInputStream(/path/to/client.p12)) { keyStore.load(in, changeit.toCharArray()); } KeyStore trustStore KeyStore.getInstance(JKS); try (InputStream in new FileInputStream(/path/to/truststore.jks)) { trustStore.load(in, changeit.toCharArray()); } KeyManagerFactory kmf KeyManagerFactory.getInstance(SunX509); kmf.init(keyStore, changeit.toCharArray()); TrustManagerFactory tmf TrustManagerFactory.getInstance(SunX509); tmf.init(trustStore); SSLContext sslContext SSLContext.getInstance(TLS); sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom()); CloseableHttpClient httpClient HttpClients.custom() .setSSLContext(sslContext) .build(); HttpGet get new HttpGet(https://server.example.com/api); try (CloseableHttpResponse response httpClient.execute(get)) { // 处理响应 }如果只是想用命令行验证服务端的双向TLS是否配置成功用curl最方便curl --cert /path/to/client-cert.pem --key /path/to/client-key.pem \ --cacert /path/to/ca-cert.pem \ https://server.example.com/api注意双向TLS调试时最闹心的就是证书信任链不完整。客户端信任库只放服务端证书还不够如果服务端证书是由中间CA签发的那么中间CA证书也得放进信任链。反过来服务端信任客户端证书时也一样。这类问题报错通常是PKIX path building failed说明证书链没配完整。服务端让Tomcat启用双向TLS核心是改server.xml里HTTPS Connector的配置Connector port8443 protocolorg.apache.coyote.http11.Http11NioProtocol SSLEnabledtrue maxThreads200 schemehttps securetrue clientAuthtrue keystoreFile/path/to/server.p12 keystorePasschangeit keystoreTypePKCS12 truststoreFile/path/to/truststore.jks truststorePasschangeit truststoreTypeJKS /clientAuthtrue表示强制要求客户端提供证书这是双向认证和普通HTTPS最核心的区别。5.4 Tomcat生产环境的核心调优参数server.xml里Connector节点上有几个关键参数直接影响生产环境的表现。maxThreads控制最大工作线程数默认200高并发场景一般调到400到800具体要看机器核数和业务耗时。acceptCount是等待队列长度当线程满时会排在队列里默认100可以适当调大。connectionTimeout表示建立连接的超时时间默认20000毫秒。JVM调优则是启动脚本catalina.sh里JAVA_OPTS的事。生产机内存别交给默认值至少显式指定堆大小JAVA_OPTS-Xms2g -Xmx2g -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m从实用角度说堆大小最大值和最小值设成一致避免运行期动态扩容带来性能抖动。这些参数没有标准答案需要结合压测结果不断调整。6. 替换与混淆Spring Boot内嵌Tomcat、宝兰德BES和Allatori的坑6.1 Spring Boot应用的“内置Tomcat”还能换掉吗Spring Boot项目在spring-boot-starter-web里默认内嵌了Tomcat所以你可以用java -jar直接跑Web服务不用单独部署外部Tomcat。但这不等于你的代码耦合死了Tomcat它默认可以换容器。pom.xml里排除Tomcat然后引入其他的Servlet容器依赖即可dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency排除之后如果你的应用还需要Servlet容器可以引入Jetty或者Undertow。这里有个常见误区如果只是把内嵌Tomcat排除掉但不提供替换容器应用将无法处理HTTP请求嵌入的WebServer启动时会直接失败。如果要用外部Tomcat部署Spring Boot项目做法是打包方式改成war并在启动类里继承SpringBootServletInitializer并重写configure方法SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(DemoApplication.class); } }这样打包出来的war包丢到Tomcat的webapps下Tomcat会自动启动Spring Boot应用。6.2 宝兰德BES替换Tomcat时需要注意什么宝兰德BES是一个国产企业级中间件很多政企项目出于信创要求需要把Tomcat换成BES。这个话题在业内讨论度很高。从技术角度讲BES Web Server遵循Java EE规范支持Servlet规范所以理论上大部分war包换过去能直接运行。替换过程核心是三件事第一把项目的war包通过BES管理控制台部署而不是扔进Tomcat的webapps目录。第二BES的端口配置和Tomcat不同BES Web Server默认端口不是8080具体以安装后conf目录下域配置里实际端口为准。第三Spring Boot项目要换成BES跑需要排除内嵌Tomcat依赖并打包成war和前面说的外部Tomcat部署套路一致关键是在pom.xml里把容器依赖设置为provided这样war包里不会带着Tomcat相关的jar包避免和BES自身的Servlet实现冲突。经验之谈从Tomcat迁移到BES之后最容易炸的是cookie加密策略、Session机制、文件上传大小限制、字符集编码这些和容器行为强相关的配置。部署完成后第一件事不是测业务功能而是先把登录、文件下载、跨域请求这些基础能力过一遍能快点暴露容器兼容性问题。6.3 Allatori混淆传统Tomcat Web工程三个必踩的坑热词里出现“Allatori 混淆 传统 Tomcat web 工程”说明不少同学正在处理代码混淆。Allatori是一个Java混淆器它能把class文件里的类名、方法名、字段名替换成无意义的名字加大逆向阅读的难度。但传统Tomcat Web工程做混淆坑是真不少。第一个坑是混淆Servlet类导致映射失效。web.xml里写的是servlet-classcom.example.LoginServlet/servlet-class如果你把com.example.LoginServlet这个类改了名字容器的映射建立不起来请求直接404。解决思路是在Allatori配置里保留要对外暴露的类名一般通过keep节点设置包名或类名白名单。第二个坑是混淆掉依赖jar里的方法。如果你的工程用了Spring这类重量级框架混淆器容易把框架里依赖的反射调用搞乱运行时抛NoSuchMethodError或ClassNotFoundException。这种问题排查很痛苦因为日志里的类名已经被改了。稳妥的办法是只混淆自己的业务代码框架代码保持原样。第三个坑是JSP和静态资源无法混淆。JSP页面里的% page importcom.example.DemoBean%是字符串引用混淆器不会自动去改JSP里的文字。如果DemoBean被改了名JSP里引用就会找不到类。所以混淆前后必须做一遍全量回归尤其是页面请求和带Java代码的JSP页面。6.4 一套遇到问题就能用的排查命令最后分享几个日常排查Tomcat问题时的高频命令都是实测下来用的最多的。放在一个清单里遇到问题按顺序来。# 1. 看进程还在不在 ps -ef | grep tomcat # 2. 看端口在不在监听 # Linux ss -lntp | grep 8080 lsof -i:8080 # Windows netstat -ano | findstr 8080 # 3. 看启动日志 tail -100f /opt/tomcat/logs/catalina.out # 4. 看应用部署日志 tail -100f /opt/tomcat/logs/localhost.$(date %Y-%m-%d).log # 5. 发起请求测试观察响应码 curl -v http://localhost:8080/myapp/ # 6. 抓线程快照排查线程卡死 jstack $(pgrep -f bootstrap.jar | head -1) /tmp/jstack.log # 7. 抓内存快照排查OOM jmap -dump:formatb,file/tmp/app.hprof $(pgrep -f bootstrap.jar | head -1)这里额外提醒一句jstack和jmap对线上环境影响较大尤其是jmap会导致JVM停顿高并发业务高峰期慎用。真要排查问题也建议先和团队确认别闷头就执行。写在最后的个人经验Tomcat这个玩意说简单也简单下载解压就能跑说复杂也复杂生产环境里各种连接器配置、类加载器冲突、证书信任链问题每个都能把人折磨到怀疑人生。我自己的体会是遇到Tomcat问题不要急着瞎试先看日志、再查端口、最后看配置按这个顺序来90%的问题能快速定位。还有一点要养成习惯每次部署前备份好旧的war包和配置文件改server.xml前先复制一份这个习惯救过我无数次。Tomcat的运行机制搞明白了后面接触任何Servlet容器比如Jetty、Undertow、宝兰德都是触类旁通的事。希望这篇内容对你有用有问题欢迎在实际操作后回来对照排查清单再走一遍。
返回列表