Tomcat配置中的常见问题及解决方案
Tomcat默认使用8080(HTTP)、8005(关闭服务)、8009(AJP)等端口,若这些端口被其他程序(如IIS、Skype、其他Tomcat实例)占用,会导致启动失败,日志中会出现“Address already in use”错误。
解决方法:
netstat -ano | findstr "端口号"(Windows)或lsof -i :端口号(Linux)命令查找占用端口的进程;kill -9 PID或任务管理器结束);conf/server.xml中的Connector标签port属性(如将8080改为8081),保存后重启Tomcat。若JAVA_HOME环境变量未正确设置,或Java版本与Tomcat不兼容(如Tomcat 10需要Java 11及以上),会导致启动时报“The JAVA_HOME environment variable is not defined”或版本不兼容错误。
解决方法:
C:\Program Files\Java\jdk1.8.0_45);JAVA_HOME:Windows在系统环境变量中添加JAVA_HOME,值为JDK路径;Linux在~/.bashrc或/etc/profile中添加export JAVA_HOME=/usr/lib/jvm/java-11-openjdk;%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(Linux)添加到Path环境变量中;当Tomcat处理大型应用或高并发时,可能出现java.lang.OutOfMemoryError: Java heap space(堆内存不足)或java.lang.OutOfMemoryError: PermGen space(永久代空间不足,Java 8后为Metaspace)错误,导致应用崩溃。
解决方法:
bin/catalina.sh(Linux)或bin/catalina.bat(Windows)中的JAVA_OPTS,设置-Xms(初始堆内存,如512m)和-Xmx(最大堆内存,如1024m),建议两者一致避免频繁GC;-XX:PermSize=128m -XX:MaxPermSize=256m,Java 8后添加-XX:MaxMetaspaceSize=256m;server.xml中Connector的maxThreads(如从200调整为500)和acceptCount(如从100调整为200),但需根据服务器配置调整,避免过度消耗内存。server.xml(端口、连接器配置)、web.xml(应用部署配置)等配置文件的语法错误(如标签未闭合、属性值缺失),会导致Tomcat启动失败,日志中会出现“org.xml.sax.SAXParseException”错误。
解决方法:
<Connector>标签是否有对应的</Connector>)、属性值是否用引号包裹(如port="8080");server.xml中Connector的protocol属性取值)。Tomcat对logs、work、temp、webapps等目录的读写权限不足(如Linux下目录权限为700),会导致启动时报“Permission denied”错误,或无法写入日志、部署应用。
解决方法:
chmod -R 755 $CATALINA_HOME/logs $CATALINA_HOME/work $CATALINA_HOME/temp $CATALINA_HOME/webapps命令赋予读写执行权限;Tomcat用户(如tomcat)添加“完全控制”权限;tomcat)对配置文件和目录有访问权限。部署应用(如WAR文件)到webapps目录后,应用无法访问(如访问http://localhost:8080/app报404),可能是以下原因:
webapps目录下是否有对应的解压目录(如app);WEB-INF/lib目录下是否有必要的JAR包;web.xml配置错误:检查应用的web.xml中servlet、servlet-mapping配置是否正确;server.xml中<Context>标签的path属性是否与应用名称冲突。webapps目录下的WAR文件和解压目录,重新部署;WEB-INF/lib目录下的依赖JAR包;web.xml配置是否符合规范(如servlet-name与servlet-mapping中的name一致);server.xml中的<Context>标签path属性(如将path="/app"改为path="",默认访问根路径)。配置HTTPS时,若server.xml中的Connector标签参数错误(如keystoreFile路径不正确、keystorePass错误),会导致SSL握手失败,浏览器提示“无法建立安全连接”。
解决方法:
keystore.jks)的路径正确,且Tomcat用户有读取权限;server.xml中Connector标签的keystoreFile(如keystoreFile="conf/keystore.jks")、keystorePass(如keystorePass="changeit")参数是否正确;keytool -list -v -keystore conf/keystore.jks命令验证证书信息(需输入密码);protocol属性设置为org.apache.coyote.http11.Http11NioProtocol(支持NIO,性能更好)。Tomcat控制台输出、应用页面(如JSP)出现乱码(如中文显示为“???”),通常是由于字符编码设置不一致导致的。
解决方法:
conf/logging.properties文件,添加java.util.logging.ConsoleHandler.encoding = UTF-8;<%@ page contentType="text/html;charset=UTF-8" language="java" %>;web.xml中添加字符编码过滤器(Character Encoding Filter),设置request.setCharacterEncoding("UTF-8")和response.setCharacterEncoding("UTF-8");useUnicode=true&characterEncoding=UTF-8(如MySQL)。