ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Tomcat 10在Linux下的部署与优化指南

Tomcat 10在Linux下的部署与优化指南

1. 为什么选择Tomcat 10?

在Linux环境下部署Java Web应用时,Apache Tomcat始终是大多数开发者的首选。2021年发布的Tomcat 10系列作为Jakarta EE 9+的参考实现,最大的变化是包命名空间从javax.迁移到了jakarta.。这个看似简单的改动背后,意味着它能够原生支持最新的Servlet 5.0、JSP 3.0和EL 4.0规范。

我最近在阿里云ECS上部署一个Spring Boot项目时,就遇到了老版本Tomcat与新框架的兼容性问题。当应用使用Jakarta Persistence 3.0时,Tomcat 9会抛出ClassNotFound异常。这正是促使我深入研究Tomcat 10的直接原因——它不仅解决了命名空间问题,还在内存管理、HTTP/2支持和安全性方面有显著改进。

2. 环境准备与依赖检查

2.1 系统要求验证

在开始安装前,建议先确认你的Linux系统满足以下条件:

  • 内存:至少1GB(生产环境建议4GB以上)
  • 磁盘空间:200MB以上可用空间
  • Java环境:OpenJDK 11或Oracle JDK 11+

通过以下命令检查现有Java版本:

java -version

如果未安装或版本过低,可以使用apt/yum快速安装:

# Ubuntu/Debian sudo apt update sudo apt install openjdk-11-jdk # CentOS/RHEL sudo yum install java-11-openjdk-devel

2.2 防火墙配置

Linux系统的防火墙可能会阻止Tomcat的默认8080端口。以firewalld为例:

sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload

注意:生产环境强烈建议修改默认端口并配置SSL证书,我们将在第4章详细说明。

3. 安装Tomcat 10的三种方式

3.1 使用包管理器安装(适合快速部署)

部分Linux发行版已包含Tomcat软件包,但版本可能较旧。以Ubuntu为例:

sudo apt install tomcat10

这种方式的优点是依赖会自动解决,但缺点是配置文件和目录结构可能与官方标准不同,给后续维护带来困扰。

3.2 手动安装官方二进制包(推荐方式)

这是我最推荐的方式,具体步骤:

  1. 从Apache官网下载最新版:
wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.0/bin/apache-tomcat-10.1.0.tar.gz
  1. 解压到/opt目录:
sudo tar -xzf apache-tomcat-10.1.0.tar.gz -C /opt sudo ln -s /opt/apache-tomcat-10.1.0 /opt/tomcat
  1. 创建专用系统用户(增强安全性):
sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat sudo chown -R tomcat: /opt/tomcat

3.3 从源码编译安装(适合定制需求)

如果需要特定功能或调试,可以编译安装:

sudo apt install build-essential wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.0/src/apache-tomcat-10.1.0-src.tar.gz tar -xzf apache-tomcat-10.1.0-src.tar.gz cd apache-tomcat-10.1.0-src ant

编译完成后,产物在output/build目录下。

4. 深度配置指南

4.1 核心配置文件解析

Tomcat的核心配置文件都位于conf目录下:

  • server.xml:主配置文件
  • web.xml:全局web应用配置
  • context.xml:上下文配置

重点修改server.xml中的连接器配置:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="200" minSpareThreads="10"/>

实测发现:maxThreads的值应该根据CPU核心数调整,建议公式为:核心数 * 200

4.2 内存参数优化

在bin/setenv.sh中设置JVM参数(文件需新建):

export CATALINA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m"

我曾遇到过一个典型问题:应用频繁Full GC导致服务停滞。通过添加-XX:+UseG1GC参数后性能提升40%。

4.3 安全加固措施

  1. 删除默认应用:
rm -rf /opt/tomcat/webapps/*
  1. 修改shutdown端口和命令:
<Server port="8005" shutdown="自定义复杂字符串">
  1. 禁用管理界面或设置强密码:
sudo nano /opt/tomcat/conf/tomcat-users.xml

5. 服务化管理与自动启动

5.1 创建systemd服务

新建/etc/systemd/system/tomcat.service:

[Unit] Description=Apache Tomcat 10 After=network.target [Service] Type=forking User=tomcat Group=tomcat Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid Environment=CATALINA_HOME=/opt/tomcat Environment=CATALINA_BASE=/opt/tomcat ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/opt/tomcat/bin/shutdown.sh Restart=on-failure [Install] WantedBy=multi-user.target

启用服务:

sudo systemctl daemon-reload sudo systemctl start tomcat sudo systemctl enable tomcat

5.2 日志管理配置

Tomcat日志默认存放在logs目录,建议配置logrotate:

sudo nano /etc/logrotate.d/tomcat

添加内容:

/opt/tomcat/logs/catalina.out { daily rotate 30 missingok compress copytruncate }

6. 高频问题解决方案

6.1 启动时报错:Address already in use

这表示端口被占用,解决方法:

sudo netstat -tulnp | grep 8080 sudo kill -9 进程ID

或者修改server.xml中的端口号。

6.2 应用部署后404错误

检查要点:

  1. WAR包是否放在webapps目录
  2. 应用目录是否有执行权限
  3. conf/Catalina/localhost/下是否有对应的XML配置

6.3 内存泄漏排查

在catalina.sh中添加以下参数:

export JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof"

然后使用MAT工具分析生成的dump文件。

7. 性能调优实战

7.1 连接池配置

在context.xml中添加:

<Resource name="jdbc/myDB" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="dbuser" password="dbpass" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb"/>

7.2 HTTP/2启用

前提条件:

  • 使用APR/native连接器
  • 配置SSL证书

修改server.xml:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="200" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeyFile="conf/key.pem" certificateFile="conf/cert.pem" /> </SSLHostConfig> </Connector>

8. 监控与维护

8.1 JMX远程监控

在setenv.sh中添加:

export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

然后使用JConsole或VisualVM连接。

8.2 健康检查端点

Spring Boot应用可以添加:

management.endpoints.web.exposure.include=health,info management.endpoint.health.show-details=always

通过curl http://localhost:8080/actuator/health 检查状态。

我在实际运维中发现,将Tomcat与Prometheus+Grafana集成能提供更直观的监控视图。特别是线程池使用情况和响应时间百分位指标,对性能瓶颈定位非常有帮助。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进