Tomcat简介
Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。Java 的 Web 应用经常会选择它作为应用服务器来提供 Web 服务。由于 Tomcat 本身也内含了一个 HTTP 服务器,它也可以被视作一个单独的 Web 服务器。
安装Tomcat
Tomcat国内下载地址:https://mirrors.cnnic.cn/apache/tomcat
Tomcat官方下载地址:https://tomcat.apache.org/download-90.cgi
1、安装java
Tomcat 9需要Java SE 8或更高版本。安装OpenJDK 11(Java平台的开源实现)。
yum install -y java-11-openjdk-devel
java -version
2、创建系统用户
在root用户下运行Tomcat存在安全风险。我们将使用主目录/opt/tomcat/创建一个新的系统用户和组,该用户和组将运行Tomcat服务。
useradd -m -U -d /opt/tomcat -s /bin/false tomcat
3、下载安装tomcat
VERSION=9.0.39
wget --no-check-certificate https://mirrors.cnnic.cn/apache/tomcat/tomcat-9/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz -P /tmp
mkdir -p /opt/tomcat/
tar -xf /tmp/apache-tomcat-${VERSION}.tar.gz -C /opt/tomcat/
4、Tomcat会定期进行更新。为了更好地控制版本和更新,我们将创建一个名为的符号链接latest,该链接指向Tomcat安装目录:
ln -s /opt/tomcat/apache-tomcat-${VERSION} /opt/tomcat/latest
5、先前创建的系统用户必须有权访问tomcat安装目录。将目录所有权更改为用户和组tomcat:
chown -R tomcat: /opt/tomcat
6、使bin目录内的shell脚本可执行:
chmod +x /opt/tomcat/latest/bin/*.sh
7、创建tomcat服务启动文件
cat > /etc/systemd/system/tomcat.service <<EOF
[Unit]
Description=Tomcat 9 servlet container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"
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
EOF
8、启动tomcat服务
systemctl enable --now tomcat
systemctl status tomcat
9、此时应该能够使用Web浏览器8080端口访问Tomcat
http://192.168.92.30:8080/
浏览器访问:
查看tomcat版本
sh /opt/tomcat/latest/bin/version.sh
配置Tomcat Web管理界面
由于尚未创建用户,因此无法访问Web管理界面。Tomcat用户和角色在tomcat-users.xml
文件中定义。
vim /opt/tomcat/latest/conf/tomcat-users.xml
要创建可以访问tomcat Web界面(manager-gui和admin-gui)的新用户,请编辑文件,如下所示。确保将用户名和密码更改为更安全的名称:
<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管理界面配置为仅允许从本地主机访问,如果您需要从任何地方访问Web界面,需要修改以下文件。
打开manager文件
vim /opt/tomcat/latest/webapps/manager/META-INF/context.xml
注释以下内容
<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>
打开host-manager文件
vim /opt/tomcat/latest/webapps/host-manager/META-INF/context.xml
注释以下内容
<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访问:
修改/opt/tomcat/latest/webapps/manager/META-INF/context.xml
<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>
修改/opt/tomcat/latest/webapps/host-manager/META-INF/context.xml
<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管理界面
访问tomcat主界面:
http://192.168.92.30:8080
Tomcat Web应用程序管理器状态:
http://192.168.92.30:8080/manager/status
Tomcat Web应用程序管理器仪表板允许您部署,取消部署,启动,停止和重新加载应用程序。可在以下网址获得:
http://<your_domain_or_IP_address>:8080/manager/html
Tomcat虚拟主机管理器仪表板允许您创建,删除和管理Tomcat虚拟主机。可在以下网址获得:
http://<your_domain_or_IP_address>:8080/host-manager/html
host-manager界面:
参考:https://linuxize.com/post/how-to-install-tomcat-9-on-centos-8/
tomcat部署web应用
Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用。
也可以将JSP程序打包成一个war包放在目录下,服务器会自动解开这个war包,并在这个目录下生成一个同名的文件夹。
一个war包就是有特性格式的jar包,它是将一个Web程序的所有内容进行压缩得到。具体如何打包,可以使用许多开发工具的IDE环境,如Eclipse、NetBeans、ant、JBuilder等。
下载示例war包:https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/
webapps默认目录
[root@localhost ~]# ll /opt/tomcat/latest/webapps/
total 20
drwxr-x--- 15 tomcat tomcat 4096 Oct 28 19:26 docs
drwxr-x--- 6 tomcat tomcat 83 Oct 28 19:26 examples
drwxr-x--- 5 tomcat tomcat 87 Oct 28 19:26 host-manager
drwxr-x--- 6 tomcat tomcat 114 Oct 28 19:26 manager
drwxr-x--- 3 tomcat tomcat 283 Oct 28 19:26 ROOT
复制sample.war到webapps目录下:
cd /opt/tomcat/latest/webapps/
wget https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample.war
重启tomcat:
systemctl restart tomcat
webapps目录下会解压war到当前目录
[root@localhost ~]# ll /opt/tomcat/latest/webapps/
total 20
drwxr-x--- 15 tomcat tomcat 4096 Oct 28 19:26 docs
drwxr-x--- 6 tomcat tomcat 83 Oct 28 19:26 examples
drwxr-x--- 5 tomcat tomcat 87 Oct 28 19:26 host-manager
drwxr-x--- 6 tomcat tomcat 114 Oct 28 19:26 manager
drwxr-x--- 3 tomcat tomcat 283 Oct 28 19:26 ROOT
drwxr-x--- 5 tomcat tomcat 86 Oct 28 20:52 sample
-rw-r--r-- 1 root root 4606 Oct 28 20:52 sample.war
通过路径访问sample应用
http://192.168.92.30:8080/sample/
sample访问页面:
docker运行tomcat应用
准备war包应用
mkdir -p /data/tomcat/app1
cd /data/tomcat/app1
wget https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample.war
运行tomcat应用
docker run -d --name tomcat-app \
--restart always \
-p 8001:8080 \
-e TZ=Asia/Shanghai \
-v /data/tomcat/app1:/usr/local/tomcat/webapps \
tomcat
访问tomcat应用
http://192.168.92.30:8080/sample/
tomcat部署多项目
在同一台服务器上部署多个tomcat服务有如下两种方法:
- 单Tomcat 同一个端口部署多个项目,默认tomcat支持多应用部署,将多个war包放置在tomcat下的webapps下即可,这种方式启动停止tomcat服务所有项目都会受影响。
- 单Tomcat不同端口部署多项目,需要修改conf/server.xml配置文件,彼此互不影响,配置稍微复杂。
- 多Tomcat部署多项目建议使用容器方式。
应用使用相同端口
多个应用war包直接放在webapps目录下,webapps目录下有sample.war和sample1.war两个应用,tomcat会将2个war包解压到当前目录,目录名以war包名称命名。
[root@localhost ~]# cd /opt/tomcat/latest/webapps
[root@localhost webapps]# ll
total 20
drwxr-x--- 15 tomcat tomcat 4096 Oct 28 19:26 docs
drwxr-x--- 6 tomcat tomcat 83 Oct 28 19:26 examples
drwxr-x--- 5 tomcat tomcat 87 Oct 28 19:26 host-manager
drwxr-x--- 6 tomcat tomcat 114 Oct 28 19:26 manager
drwxr-x--- 3 tomcat tomcat 283 Oct 28 19:26 ROOT
drwxr-x--- 5 tomcat tomcat 86 Oct 28 20:52 sample
drwxr-x--- 5 tomcat tomcat 86 Oct 28 20:54 sample1
-rw-r--r-- 1 root root 4606 Oct 28 20:54 sample1.war
-rw-r--r-- 1 root root 4606 Oct 28 20:52 sample.war
浏览器访问时,使用路径访问不同应用:
http://192.168.92.30:8080/sample/
http://192.168.92.30:8080/sample1/
应用使用不同端口
mkdir -p /opt/tomcat/latest/webapps1
cp sample.war /opt/tomcat/latest/webapps1
修改server.xml,复制一份service部分
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Catalina2">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina2" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps1"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
修改以下选项
- Service name
- Connector port
- Engine name
- Host appBase
重启tomcat
systemctl restart tomcat
应用访问方式
http://192.168.92.30:8080/sample/
http://192.168.92.30:8081/sample/