本文介绍如何在 Ubuntu 22.04 上安装和配置 Tomcat 10。

Apache Tomcat 是一个开源 Web 服务器和 Java Servlet 容器。它是构建基于 Java 的网站和应用的最流行选择之一。Tomcat 轻量级、易于使用,拥有强大的附加组件生态系统,并驱动许多大型 Web 应用。

安装 Java

Tomcat 10 要求系统上已安装 Java 版本 11 或更高版本。我们将安装 OpenJDK 11,这是 Java 平台的开源实现。

以 root 用户或具有 sudo 权限的用户身份执行以下命令,更新软件包索引并安装 OpenJDK 11 JDK 软件包:

终端

sudo apt update
sudo apt install openjdk-11-jdk

完成后,您可以通过检查 Java 版本来验证是否正确安装了 Tomcat:

终端

java -version

输出应类似于以下内容:

输出

openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)

创建系统用户

在 root 用户下运行 Tomcat 存在安全隐患且可能很危险。以下命令创建一个新系统用户和组,其主目录为 /opt/tomcat,将用于运行 Tomcat 服务:

终端

sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat

下载 Tomcat

Tomcat 二进制发行版可从 Tomcat 软件下载页面下载。

截至撰写本文时,最新的 Tomcat 版本为 10.1.4。在继续下一步之前,请访问 Tomcat 10 下载页面并检查是否有更新的版本可用。

使用 wget 命令将 Tomcat zip 文件下载到 /tmp 目录:

终端

VERSION=10.1.4
wget https://www-eu.apache.org/dist/tomcat/tomcat-10/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz -P /tmp

Tomcat tar 文件下载完成后,将其解压到 /opt/tomcat 目录:

终端

sudo tar -xf /tmp/apache-tomcat-${VERSION}.tar.gz -C /opt/tomcat/

Tomcat 会定期更新。更新包括错误修复、安全补丁和新功能。为了对版本和更新有更多控制,我们将创建一个名为 latest 的符号链接,指向 Tomcat 安装目录:

终端

sudo ln -s /opt/tomcat/apache-tomcat-${VERSION} /opt/tomcat/latest

稍后,当您需要升级 Tomcat 实例时,只需解压新版本并更改符号链接以指向它。

我们之前创建的系统用户必须有权访问 tomcat 安装目录。将目录所有权更改为用户和组 tomcat:

终端

sudo chown -R tomcat: /opt/tomcat

Tomcat 的 bin 目录中的 shell 脚本必须可执行才能运行:

终端

sudo sh -c 'chmod +x /opt/tomcat/latest/bin/*.sh'

这些脚本用于启动、停止和管理 Tomcat 实例。

创建 SystemD 单元文件

我们不会直接执行 shell 脚本来启动和停止 Tomcat 服务器,而是通过 systemd 单元文件运行它们。这样,Tomcat 将作为服务运行。

打开文本编辑器,在 /etc/systemd/system/ 目录中创建 tomcat.service 单元文件:

终端

sudo nano /etc/systemd/system/tomcat.service

粘贴以下配置:

/etc/systemd/system/tomcat.serviceini

[Unit]
Description=Tomcat 10 servlet container
After=network.target

[Service]
Type=forking

User=tomcat
Group=tomcat

Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Djava.awt.headless=true"

Environment="CATALINA_BASE=/opt/tomcat/latest"
Environment="CATALINA_HOME=/opt/tomcat/latest"
Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

信息如果 Java 安装路径不同,请修改 JAVA_HOME 变量。

保存并关闭文件,然后运行以下命令通知 systemd 我们创建了一个新单元文件:

终端

sudo systemctl daemon-reload

启用并启动 Tomcat 服务:

终端

sudo systemctl enable --now tomcat

检查服务状态:

终端

sudo systemctl status tomcat

输出应显示 Tomcat 服务器已启用并正在运行:

输出

● tomcat.service - Tomcat 10 servlet container
     Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-12-24 18:53:37 UTC; 6s ago
    Process: 5124 ExecStart=/opt/tomcat/latest/bin/startup.sh (code=exited, status=0/SUCCESS)
   Main PID: 5131 (java)...

您可以像任何其他 systemd 服务一样启动、停止和重启 Tomcat:

终端

sudo systemctl start tomcat
sudo systemctl stop tomcat
sudo systemctl restart tomcat

配置防火墙

如果您使用防火墙过滤流量并希望从本地网络外部访问 Tomcat,您需要打开端口 8080。使用以下命令打开端口:

终端

sudo ufw allow 8080/tcp

提示通常,在生产环境中运行 Tomcat 时,您应该使用负载均衡器或反向代理。仅从内部网络允许访问端口 8080 是最佳实践。

配置 Tomcat Web 管理界面

此时,您应该能够通过 Web 浏览器在端口 8080 上访问 Tomcat。Web 管理界面不可用,因为我们尚未创建用户。

Tomcat 用户和角色定义在 tomcat-users.xml 文件中。默认情况下,该文件包括注释和示例,显示如何创建用户或角色。

在本例中,我们将创建一个具有“admin-gui”和“manager-gui”角色的用户。

“admin-gui”角色允许用户访问 /host-manager/html URL 并创建、删除和管理虚拟主机。“manager-gui”角色允许用户通过 /host-manager/html 界面部署和取消部署 Web 应用,而无需重启容器。

使用文本编辑器打开 tomcat-users.xml 文件并创建新用户,如下所示:

终端

sudo nano /opt/tomcat/latest/conf/tomcat-users.xml

/opt/tomcat/latest/conf/tomcat-users.xmlxml

<tomcat-users>
<!--
    Comments
-->
   <role rolename="admin-gui"/>
   <role rolename="manager-gui"/>
   <user username="admin" password="admin_password" roles="admin-gui,manager-gui"/>
</tomcat-users>

请确保将用户名和密码更改为更安全的内容。

默认情况下,Tomcat Web 管理界面仅配置为允许从 localhost 访问 Manager 和 Host Manager 应用。如果您想从远程 IP 访问 Web 界面,必须移除这些限制。这可能有各种安全影响,不建议用于生产系统。

要启用从任何地方访问 Web 界面,请打开以下两个文件并注释或删除黄色高亮的行。

对于 Manager 应用:

终端

sudo nano /opt/tomcat/latest/webapps/manager/META-INF/context.xml

对于 Host Manager 应用:

终端

sudo nano /opt/tomcat/latest/webapps/host-manager/META-INF/context.xml

context.xmlxml

<Context antiResourceLocking="false" privileged="true" >
<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
</Context>

如果您只想从特定 IP 访问 Web 界面,而不是注释块,请将您的公共 IP 添加到列表中。

假设您的公共 IP 为 41.41.41.41,您只想允许从该 IP 访问:

context.xmlxml

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|41.41.41.41" />
</Context>

允许的 IP 地址列表是由垂直条 | 分隔的列表。您可以添加单个 IP 地址或使用正则表达式。

完成后,重启 Tomcat 服务以使更改生效:

终端

sudo systemctl restart tomcat

测试 Tomcat 安装

打开浏览器并输入:http://<your_domain_or_IP_address>:8080

假设安装成功,应出现如下所示的界面:

Tomcat 8.5

Tomcat Web 应用程序管理器位于:http://<your_domain_or_IP_address>:8080/manager/html。

Tomcat Web 应用程序管理器

Tomcat 虚拟主机管理器位于:http://<your_domain_or_IP_address>:8080/host-manager/html。

Tomcat 虚拟主机管理器