ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Tomcat安装配置全解析:从JDK版本选择到部署调优避坑指南

Tomcat安装配置全解析:从JDK版本选择到部署调优避坑指南 我见过太多第一次接触Tomcat的人从官网下载压缩包解压双击bin/startup.bat窗口闪了一下就没了。然后对着黑屏一脸懵再去浏览器访问localhost:8080连接被拒绝。这个场景我这几年前后看了不下百次甚至包括不少已经能写后端接口却被服务器配置卡住的同学。这篇东西不打算写成官方文档的复述而是把Tomcat安装及配置这条主线上的关键节点串起来说清楚每一步为什么要这么做以及那些官方文档里不会写的坑。我默认读者分两种一种是刚学Java Web需要本地跑一个Servlet项目交作业另一种是已经用Spring Boot写了一阵子想搞清楚底层这个内嵌容器到底是什么。两种需求侧重点不同但前半程的安装配置是共通的你只需要按自己的阶段跳着读就行。1. 装之前先搞清版本JDK与Tomcat的版本对应关系1.1 为什么启动Tomcat一定要先装JDKTomcat本身是一个用Java写成的Web服务器程序它要运行起来底层必须依赖Java虚拟机去加载class文件。很多人忽略这一点直接从网上下个Tomcat压缩包想跑起来结果双击启动脚本后窗口一闪而过连个报错信息都看不到然后就开始怀疑人生。你可以把Tomcat理解成一台需要发动机才能跑的车这台车的发动机就是JDK。Tomcat官方文档里有一行很不起眼的“Runtime Requirements”里面明确写了每个Tomcat版本最低需要哪个版本的JDK但绝大多数人根本不看等到启动失败才开始排查。有个更细的点容易踩Tomcat需要的是JDK不是JRE。JRE只包含运行时环境而Tomcat的启动脚本、JSP编译这些环节需要调用javac和相关的开发工具库。如果你的机器上只装了JRE启动脚本虽然能找到Java命令但在编译JSP的时候就会报出一堆莫名其妙的ClassNotFoundException到时候更麻烦。所以装Tomcat之前老老实实装一个完整的JDK。1.2 版本对应表与选型建议不同版本的Tomcat对Java版本的要求差异很大选错就是启动失败或功能异常。我整理了当前主流版本的对应关系Tomcat版本最低JDK版本Servlet规范包名变化适合场景Tomcat 8.5JDK 7Servlet 3.1javax.*很老的项目维护Tomcat 9.xJDK 8Servlet 4.0javax.*传统SSM项目JDK8主力Tomcat 10.0.xJDK 8Servlet 5.0jakarta.*过渡版本不建议新项目用Tomcat 10.1.xJDK 11Servlet 6.0jakarta.*当前主流推荐Tomcat 11.xJDK 17Servlet 6.1jakarta.*追求新版本时使用默认情况下Java EE 8及之前的Servlet API包名都是javax.servlet开头的但从Tomcat 10开始Oracle把Java EE移交给了Eclipse基金会整个规范改名成Jakarta EE包名也相应变成了jakarta.servlet。这个改动影响非常大你以前用Tomcat 9写的老项目包名引用全是javax.*直接扔到Tomcat 10里跑启动就会报NoClassDefFoundError因为容器里根本没有javax.servlet这个包。反过来也一样Tomcat 9里也找不到jakarta.servlet。所以选版本之前先问自己一个问题我的代码是javax还是jakartaSpring Boot 2.x时代默认用的Tomcat 9依赖全是javaxSpring Boot 3.x默认用Tomcat 10.1依赖全换成了jakarta。如果你只是本地练习直接上JDK 17配上Tomcat 10.1如果是跟着老教程做SSM框架项目用JDK 8加Tomcat 9最省事。1.3 配置JAVA_HOME环境变量的实际操作JDK安装好之后需要把JAVA_HOME配到系统环境变量里Tomcat的启动脚本会主动去读这个变量。Windows的配置路径是“此电脑 → 属性 → 高级系统设置 → 环境变量”在系统变量里新建变量名JAVA_HOME变量值JDK的安装根目录比如 C:\Program Files\Java\jdk-17配置完JAVA_HOME之后在系统变量的Path里面新增一条%JAVA_HOME%\bin这样命令行里才能直接执行java、javac这些命令。有个细节提醒一下变量值要填JDK的根目录不要填到bin那一层。因为Tomcat的启动脚本内部会自己拼JAVA_HOME\bin\java这个完整路径如果你配成了bin目录最终会变成JAVA_HOME\bin\bin\java直接找不到命令。配置完成后一定要新开一个命令行窗口验证旧窗口不会刷新环境变量。在命令行输入java -version能看到版本号就说明Java环境没问题。我在实际中遇到过一种情况输入java -version显示正常但Tomcat仍然启动不了检查后发现环境变量Path里同时存在多个Java版本路径系统优先命中了旧版本。处理办法是把JAVA_HOME相关的路径挪到Path前面或者在启动Tomcat前用echo %JAVA_HOME%确认一下当前指向的到底是哪个JDK。2. 下载与目录结构为什么解压就能用但总有人用错2.1 官网下载的发行版选择Tomcat的官网地址是tomcat.apache.org进去之后页面左侧有个Download栏目下面列了Tomcat 9、10、11等各个大版本。这里有一个容易混淆的地方每个版本下又有好几个子选项比如Core、Full documentation、Deployer、Extras等等初学者看到这些往往会懵。我们需要下载的就是Core分类下的那个压缩包它才是Tomcat服务器本体。Full documentation只是文档Deployer是独立部署工具Embedded是给程序员做嵌入式开发用的依赖包这些暂时跟我们没关系。具体点的文件命名长这样apache-tomcat-10.1.x-windows-x64.zip。在Windows上优先选.zip不要选.exe安装版。解释一下原因Tomcat解压版属于绿色软件不写入注册表不注册系统服务完全受控。如果哪天版本不合适直接删掉目录就行不会有残留垃圾。安装版虽然会帮你注册Windows服务但多了一层系统级配置出问题时排查起来反而麻烦。下载完之后解压这里有个强烈建议解压路径绝对不要包含中文也不要包含空格。官方虽然没有强制规定但Tomcat脚本对中文路径的支持时好时坏不少人在后来的部署环节遇到上传文件失败、找不到路径之类的诡异问题追根溯源都是路径里有中文引起的。2.2 核心目录结构解读解压之后你会看到一个非常标准的目录结构。很多人第一次看到这一堆文件夹觉得头大其实每个目录的定位非常清晰目录作用我的重点注释bin存放启动和关闭脚本startup.bat是Windows启动入口shutdown.bat是关闭入口conf核心配置目录最核心的是server.xml端口和连接器都在这lib公共类库Tomcat自带jar包应用间共享logs运行日志启动失败必看catalina.日期.logtemp临时文件目录不用管自动清理webappsWeb应用部署目录把war包扔进来就能自动发布workJSP编译后的class文件缓存JSP第一次访问时生成我重点说两个目录。第一个是webapps很多初学者以为要自己建一个项目文件夹放进来的其实Tomcat默认自带一个ROOT目录这个就是它的默认站点访问localhost:8080显示的那个欢迎页面就是从ROOT目录加载的。你要部署自己的Web项目最简单的办法就是把war包直接扔进webapps目录Tomcat解压后自动发布访问路径就是项目名。第二个是conf目录。conf里面有个server.xml这是整个Tomcat的命脉文件端口配置、连接器参数、Host配置全部都在里面。后面讲到的端口占用、改端口、配HTTPS这些操作几乎都要动这个文件。操作之前养成备份习惯改花眼的时候至少能一键还原。2.3 绿色解压版为什么可以直接运行解压完不需要执行任何安装程序因为Tomcat的启动脚本在设计时只依赖两样东西JAVA_HOME环境变量和相对路径。脚本内部会自动推导出Catalina_HomeTomcat的根目录然后加载lib下的jar包读取conf下的server.xml最终以java进程的方式启动。这种设计既简单又灵活同一份Tomcat压缩包你可以解压多份修改不同的端口号就能在一台机器上跑多个独立实例。这也是为什么我强烈推荐解压版——你在本机学习时一天之内可能需要切换好几个不同版本的Tomcat解压版之间互不干扰用完即删。有一个进阶概念值得提前了解CATALINA_HOME和CATALINA_BASE是两个不同的配置项。默认情况下它们都指向Tomcat根目录Tomcat会先读取CATALINA_HOME下的公共类和配置再用CATALINA_BASE覆盖配置。多实例部署时你会让多个CATALINA_BASE共享同一个CATALINA_HOME的代码各自维护不同的conf、logs、webapps这样可以节省内存并方便批量管理。初学阶段用不到但理解了这个设计后面看Tomcat启动脚本时才不会一头雾水。3. 启动验证从双击startup.bat到看到首页3.1 启动脚本执行的原理双击startup.bat之后Tomcat内部到底做了什么我把执行链拆开讲。startup.bat只负责做一件事找到并调用另一个脚本catalina.bat并传给它一个start参数。catalina.bat才是真正干活的脚本它会按顺序做这些事检查JAVA_HOME环境变量是否存在不存在就报错退出检查CATALINA_HOME是否已设置没设置就自动取当前目录的上一级设置类路径把lib目录下的jar包全部加入classpath组装一个完整的java启动命令后面跟一堆JVM参数通过Java启动org.apache.catalina.startup.Bootstrap这个类也就是Tomcat的入口明白这条链路之后你就知道为什么启动失败时第一反应应该是去查JAVA_HOME而不是瞎猜。链路里任何一个环节出问题窗口要么闪退要么报错。3.2 启动后的完整验证流程正确启动Tomcat的姿势分三步。第一步在bin目录下找到startup.bat双击运行或者更建议的方式是在命令行里执行这样窗口不会闪退能直接看到输出日志。第二步观察窗口最终是否出现一行关键信息Server startup in [xxx] milliseconds看到这行说明Tomcat已经成功启动了。第三步打开浏览器访问http://localhost:8080看到默认Apache Tomcat欢迎页整个流程就算通关了。有一个被很多人忽略的细节第一次启动时Windows系统防火墙会弹出提示询问是否允许Java访问网络。这里一定要勾选“专用网络”并点击“允许访问”否则Tomcat虽然起来了但你用局域网里的其他电脑访问这台机器的8080端口是完全不通的。命令行启动时的输出会被直接打印到控制台但窗口关闭后这些输出也没了。真正的日志会同时写入logs目录下的catalina.日期.log文件比如catalina.2025-01-15.log。只要你启动了Tomcat这个文件必定会被创建它是排错的第一手资料。3.3 窗口闪退的完整排查链路窗口闪退是Tomcat新手最常见的故障闪退的本质是JVM启动失败后被强制退出因为双击方式下启动窗口不属于交互式命令行系统会在Java进程异常退出后顺手把窗口也关掉。排查这条链路严格按照顺序来第一步打开命令行窗口把目录切换到Tomcat的bin目录手动执行catalina.bat run用run参数而不是start会让Tomcat在前台运行所有控制台输出直接显示。如果Java环境有问题报错信息会留在屏幕上不会闪退。第二步看到报错后区分原因。最常见的是“The JRE_HOME environment variable is not defined correctly”翻译过来就是JAVA_HOME没配好去检查环境变量。其次是“Port 8080 required by Tomcat ... is already in use”说明8080被别的程序占了用下面这行命令找出占用的进程netstat -ano | findstr 8080记下最后一列的PID然后打开任务管理器找到对应进程确认是什么程序决定是杀掉还是换端口。第三步如果命令行里没有任何报错输出但浏览器还是访问不了去logs目录看catalina日志文件找到Server startup标记前的异常堆栈那个就是问题根源。我看到过的奇葩案例包括同一机子上装了多个版本的JDK导致版本号对不上、hosts文件被修改导致localhost解析异常、杀毒软件把Tomcat的startup脚本当病毒隔离这些都属于环境层面的问题日志里不一定有直接提示需要结合上下文判断。启动成功之后还要注意别用任务管理器强杀Java进程。正确关闭方式是执行bin/shutdown.bat它会向Tomcat发送一条shutdown命令默认监听8005端口让Tomcat优雅停机释放端口和文件句柄。强杀进程可能导致端口一直被占住或者webapps目录里的临时文件被锁住下次启动时报诡异错误。4. 部署访问的经典问题端口占用、404、中文乱码与内存溢出4.1 端口被占用从报错到彻底解决端口占用是Tomcat启动时最常报的错错误信息典型如下Port 8080 required by Tomcat v9.0 Server at localhost is already in use。这个报错的解决办法分两条路线一是找到占用8080的进程并停掉它二是给Tomcat换一个新的端口。我个人更推荐先排查占用者因为很多情况下是之前启动的Tomcat没被正常关闭Java进程还赖在内存里。在命令行输入netstat -ano | findstr :8080输出结果里你会看到一条LISTENING状态的记录最后一列的PID就是罪魁祸首。然后执行taskkill /PID 进程号 /F强制结束后再重启Tomcat问题就解决了。如果确定是其他应用占用比如另一个Tomcat实例、Nginx、MySQL等那就能明确是要换端口了。换端口的操作在conf/server.xml里找到这样一段配置Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /把port改成8081或8099之类的空闲端口保存后重启Tomcat访问地址也要跟着改成新端口。这里有个小坑容易忽略改完server.xml之后如果之前在IDE里配置过旧的端口地址IDE里的配置也要同步改否则会经常出现端口冲突提示。4.2 访问路径404分清Tomcat首页404和应用404两种404要分开查。第一种是Tomcat首页404访问localhost:8080直接显示404页面。这种情况大概率是Tomcat的ROOT应用被删掉或损坏了。webapps目录下的ROOT文件夹就是默认应用如果你清理目录的时候不小心把它删了首页自然就没了。恢复方法是从Tomcat源压缩包里重新解压出ROOT目录放回去。第二种是部署自己的项目后404访问http://localhost:8080/项目名/路径找不到资源。这种情况下Tomcat本身是好的问题出在部署的应用上。按经验优先排查几个点war包有没有正确放到webapps目录下、项目访问路径跟war包文件名是否一致、项目的WEB-INF/web.xml里配置的servlet映射路径是否正确。还要注意一个URL大小写的问题。Tomcat在处理URL路径时很多情况下区分大小写特别是针对Linux部署环境项目名的大小写写错了就直接404。你在Windows本地跑时没暴露这个问题因为Windows文件系统不区分大小写一旦部署到Linux服务器上就露馅了这也是很多项目“本地好好的服务器上打不开”的原因之一。4.3 控制台中文乱码老生常谈但原因不同Tomcat乱码有两种形态看起来一样但修复手段完全不同一定要先分清楚。第一种是控制台启动日志里的中文乱码。Windows命令行窗口默认编码是GBK而Tomcat 10起默认日志编码是UTF-8两边不一致导致中文系统日志显示成乱码。修复办法是让Tomcat知道要向控制台输出哪种编码修改conf/logging.properties文件找到java.util.logging.ConsoleHandler.encoding这一行把值改成GBK或UTF-8java.util.logging.ConsoleHandler.encoding UTF-8改完重启。如果还不行在启动脚本的CATALINA_OPTS里加一个JVM参数也可以解决set CATALINA_OPTS-Dfile.encodingUTF-8第二种是部署的应用接口返回数据时中文乱码这种一般不是Tomcat的问题而是请求和响应的字符编码没统一。排查顺序是先看请求头里有没有指定Content-Type的charset再看代码里response是否设置了setCharacterEncoding(UTF-8)最后看数据库连接串有没有characterEncodingutf8。Tomcat层面的乱码是最外层的显示问题要一层层往里查。4.4 内存溢出JVM参数调优入门Tomcat运行一段时间后报OutOfMemoryError最常见的场景是生产环境部署了大项目或者访问量上来了默认256MB的堆内存不够用。Tomcat默认的JVM参数非常保守因为它要保证在任何机器上都能跑起来但实际生产环境需要根据应用规模调整。修改方式是在bin目录下的catalina.batWindows或catalina.shLinux里设置CATALINA_OPTSJVM参数要加在这个变量里而不是加到JAVA_OPTS里。示例set CATALINA_OPTS-server -Xms512m -Xmx1024m -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m参数含义拆解Xms是JVM启动时初始分配的堆内存大小Xmx是堆内存最大上限Metaspace是JDK 8之后替代永久代存放类元数据的区域。官方建议Xms和Xmx设置为相同值这样JVM启动时就一次性分配好全部内存运行过程中不需要频繁扩容性能更稳定。内存在设置时有一个容易被忽略的现实约束你设置的Xmx越大占用的系统物理内存就越多。如果机器总内存8GB你给Tomcat分配4GB再跑一个MySQL和一个Redis系统就很容易用满内存开始疯狂交换到时候Tomcat的响应速度反而会更慢。调优的原则是预留系统和其他服务的余量不要眼睛盯着一个进程猛调。5. 进入开发场景IDEA里配置Tomcat并跑通Web项目5.1 IDEA与Tomcat的集成方式把你的Java Web项目跑起来光装好Tomcat还不够更常用的方式是让IDEA直接管理Tomcat。IDEA里的配置路径分成新版和旧版两个入口新版IDEA在Settings → Build, Execution, Deployment → Application Servers里点加号选择Tomcat Server类型然后在Tomcat Home一栏浏览到Tomcat解压目录旧版则是在Run → Edit Configurations里添加Tomcat Server。这里容易有人犯迷糊IDEA里配置Tomcat分两步第一步是把Tomcat本身作为一个“应用服务器”注册到IDEA里第二步是创建对应的运行配置引用了这个服务器。只配了应用服务器但没有运行配置跑项目时是找不到Tomcat的。反过来只配了运行配置但没登记Tomcat那运行配置就没法选择应用服务器。Tomcat Home指到Tomcat根目录后IDEA会自动识别版本号并显示。这个配置过程不涉及环境变量IDEA会从注册的目录里自己找到启动脚本这也是我推荐用IDEA的Application Server方式而不是手动启动Tomcat的原因有底层的调试接口可以直接连配合断点调试时能直接看Servlet里变量值效率高很多。5.2 部署artifacts的两种方式把项目部署到Tomcat上IDEA里有两种artifact方式。我遇到不少朋友被这个概念卡住这里详细解释。第一种是Exploded展开式把项目的WEB-INF目录、静态资源、class文件按照标准的Web目录结构组装到一个输出目录里。这种方式最大的好处是支持热部署改了Java代码或者前端页面IDEA会自动把变更的class或资源文件同步到Tomcat的运行目录不用每次都重启整个服务器。本地开发强烈建议用这种方式。第二种是Archive归档式会把项目打包成war包再丢给Tomcat。这种方式跟生产环境的部署行为更接近适合用来验证打包流程是否正常但本地开发用它会很痛苦每一次修改都要重新打war包、重新部署调试一个前端按钮可能花五分钟在等待上。所以我的建议是本地调试用Exploded发布验证用Archive。部署配置的操作路径是File → Project Structure → Artifacts创建一个Web Application: Exploded然后到Run/Debug Configurations里找到Deployment选项卡点加号选择刚才建好的artifact。这样启动Tomcat时IDEA会自动把项目挂载到Tomcat下的“/”或指定上下文路径。5.3 热部署配置与常见误区配置热部署主要是修改两个选项On Update action和On frame deactivation建议分别设置成Update classes and resources和Update classes and resources。这样IDEA窗口切换到浏览器时后台能自动同步代码变更。但这里必须降低预期热部署只对普通方法的修改有效如果改动了方法签名、类结构、静态初始化块IDEA在多数情况下会提示需要终止并重启会话。因为JVM的类加载机制决定了它没法卸载已经被加载的class除非使用更复杂的工具做热加载否则结构性改动无论如何都得重启。这不算配置问题是Java虚拟机的机制限制。还有一个小坑IDEA里新建Tomcat运行配置时默认的HTTP端口会预填8080但如果之前已在server.xml里修改过端口这里要手动改成一致的端口否则IDEA启动Tomcat后会自己计算一个新的可用端口你会发现访问方式和预想的不一样。启动后IDEA的Console面板会输出Tomcat日志面板里通常会有一个可以直接点击打开的http://localhost:8080/链接从这里进入更直观。5.4 手动部署war包的最后一道工序在IDEA里调试通关后你大概率还要把项目部署到独立服务器上这时候就该回到传统方式打war包丢进webapps启动Tomcat。IDEA里打war包的入口在Build → Build Artifacts选择Archive类型构建构建完成后war文件会生成在out/artifacts目录下。把war包复制到Tomcat的webapps目录后启动TomcatTomcat会自动解压war包并部署。这里有一个初学者最常见的疑问访问URL到底是/Tomcat还是/项目名答案取决于war包文件名。你命名为myapp.war那么解压出来的目录就是myapp访问路径就是http://localhost:8080/myapp/。如果你想让应用直接通过根路径访问可以把它改名为ROOT.war这会覆盖原来的默认应用访问http://localhost:8080/就直接到达你的项目。一个额外提醒Tomcat自动解压war包后webapps下同时存在myapp.war和myapp目录这是正常现象。war包是源文件目录是解压产物。如果没有特殊情况不要手动删掉war包因为Tomcat在启动时如果发现war比目录新会重新解压覆盖删了war包后目录还在以后更新部署就会麻烦得多。6. 当Tomcat不再是唯一选择内嵌容器与现代替代方案6.1 Spring Boot里为什么默认内嵌Tomcat很多人在IDEA里配置Tomcat之前其实已经接触过Tomcat了——只是没意识到。Spring Boot的web项目默认启动后直接访问8080端口就能看到页面不需要单独安装Tomcat这就是因为Spring Boot在启动时自动把一个内嵌的Tomcat实例跑起来了。内嵌的好处非常明显应用不再依赖服务器环境jar包自带运行时放到任意一台装有JDK的机器上一条java -jar命令就能启动整个Web服务。部署时也不用再关心目标机的Tomcat版本、配置、目录结构这些全部被打包进了应用本身。原理上Spring Boot的spring-boot-starter-web依赖中传递引入了spring-boot-starter-tomcat这个starter启动时通过ServletWebServerFactory自动创建Tomcat的实例并配置好连接器。所以你在IDEA里手动装Tomcat跟Spring Boot内嵌Tomcat两者底层是同一个东西只是运行形态不同。6.2 替换内嵌容器从Tomcat换到Undertow或Jetty既然Spring Boot支持内嵌Tomcat那它自然允许你换成其他的内嵌Web服务器比如Undertow或Jetty。为什么要换最常见的理由是在高并发场景下Undertow的并发吞吐量表现更优内存占用也更少。Jetty则因为轻量在微服务拆分讲究资源隔离的时候经常被选中。替换方法很直接在pom.xml里排除掉Tomcat依赖再引入Undertow依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-undertow/artifactId /dependency改造完成后业务代码完全不用动直接重启项目控制台日志显示的容器类型就变了。这就是Servlet规范带来的好处——应用通过标准接口和容器通信容器可以被替换而不影响应用本身。可以类比一下Servlet规范就像USB接口Tomcat、Undertow、Jetty就像是不同品牌的USB设备你的Web应用只要遵守规范插哪个设备都能用。但注意如果你的代码里直接用了某个容器的专属API比如Tomcat的NioEndpoint、异步处理特性替换容器后这些代码就会失效这部分耦合是规范无法消除的。所以写代码时尽量只依赖标准Servlet API保持容器中立这样以后切换时才不心疼。6.3 独立Tomcat的基本调优方向不管是继续用独立Tomcat还是转容器化部署基础调优知识还是要有的。我按权重说一下三个关键方向。连接器参数方面server.xml里的Connector配置调整这个参数Connector port8080 protocolHTTP/1.1 connectionTimeout20000 maxThreads400 acceptCount200 maxConnections10000 /maxThreads控制最大工作线程数acceptCount是等待队列长度maxConnections是最大TCP连接数。理论上并发达到上限后新请求会排队排满了就会拒绝连接。这几个值的设置需要根据机器的CPU核数、应用单个请求的平均耗时来综合评估不是越大越好。设置过大的线程数会导致CPU频繁进行上下文切换吞吐量反而下降。线程池方面要想在并发上来时保持稳定可以配置一个独立的线程池通过Executor标签注入到Connector。JVM方面除了前面提到的堆内存参数高并发下还可以考虑使用G1垃圾回收器配合适当的暂停时间目标。重要原则调优必须基于压测数据进行不要凭感觉改参数。改任何一个参数后用JMeter或压测工具模拟真实流量对比同一请求量下的响应时间和错误率这样得出的配置才是可靠的。没有数据的调优都是玄学。7. 写在最后的一点个人体会Tomcat虽然看起来是一个老技术但把它的安装、目录结构、启动脚本、部署流程、常见故障这一套搞明白收益远超“会装一个服务器”本身。我这些年排查线上问题时会发现很多疑难杂症最终都跟基础知识点相关为什么内存溢出、为什么端口被占、为什么日志出现大量Time Wait连接理解了Tomcat的运作机制后这些问题都会变得清晰。如果读完这篇你还是在自己操作时遇到启动不了的问题我的建议是先恢复最基本的排查节奏tomcat目录台下执行catalina.bat run把错误信息看全再看logs目录下的catalina日志最后才去搜错误关键字。九成以上的问题日志里已经把答案写好了只是很多人不看或者只看最后一行。另外一个值得投入时间的点理解JVM参数和调优思路。Tomcat的配置过程里会接触到大量JVM参数这些知识在Spring Boot、Kubernetes和容器化部署里同样适用。通过配置Tomcat认识到内存和线程的基本原则未来做服务性能优化时会感谢这段经历。装好一个Tomcat不是终点你真正要学会的是它背后那一整套Java Web运行时的工作链路。
返回列表