1.什么是Tomcat?
简单理解:Tomcat就是一个"Java网站运行容器"。你写的JSP页面、Servlet代码,需要放在Tomcat里才能被其他人访问。它免费、开源,是学习Java Web开发的首选服务器。
2.Tomcat安装
2.1 检查并安装Java环境
Tomcat是用Java写的,必须先装JDK。打开终端,先看看系统有没有Java:
java -version
如果显示"command not found"或者版本低于11,需要安装:
sudo dnf install -y java-17-openjdk java-17-openjdk-devel
装完再验证一下:
java -version
javac -version
出现版本信息就说明Java准备好了。
2.2 下载Tomcat
去Tomcat官网找到下载链接。把软件放在/目录下
cd /
sudo wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.34/bin/apache-tomcat-10.1.34.tar.gz
下载完成后解压:
sudo tar -zxvf apache-tomcat-10.1.34.tar.gz
为了方便管理,改个简短的名字:
sudo mv apache-tomcat-10.1.34 tomcat10
2.3 配置环境变量
编辑当前用户的bash配置文件 :
vi ~/.bashrc
在文件末尾加上:
export CATALINA_HOME=/tomcat10
export PATH=PATH:CATALINA_HOME/bin
保存退出,让配置生效:
source ~/.bashrc
2.4 启动Tomcat
进入Tomcat的bin目录:
cd /tomcat10/bin\
启动服务:
./startup.sh
看到"Tomcat started"就说明成功了。
这时可以在浏览器输入:http://你的服务器IP:8080。如果是本机,输入http://localhost:8080。
看到那只猫的欢迎页面了吗?恭喜,Tomcat已经跑起来了!
2.5 防火墙设置
RHEL 9默认防火墙是开启的,需要放行8080端口:
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
查看端口是否开放:
sudo firewall-cmd --list-ports
这时候再用浏览器访问,应该就能看到Tomcat首页了。
2.6 创建自己的第一个Web应用
在/tomcat10/webapps目录下新建一个文件夹,比如myapp:
cd /tomcat10/webapps
sudo mkdir myapp
在myapp里建一个最简单的网页:
cd myapp
sudo vi index.html
随便写点内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>我的第一个Tomcat应用</title>
</head>
<body>
<h1>Hello Tomcat on RHEL 9!</h1>
<p>2026年,马年大吉!</p>
</body>
</html>
保存文件。不用重启Tomcat,浏览器访问http://你的IP:8080/myapp/,就能看到你写的页面了。
2.7 可能遇到的坑及解决方法
-
端口被占用 :如果8080被其他程序占了,可以修改
/tomcat10/conf/server.xml,把8080改成其他端口(比如8081),然后重启。 -
启动时权限报错:解压后的Tomcat文件属主是root,如果用普通用户启动会报错。可以修改目录属主:
sudo chown -R 你的用户名:你的用户组 /tomcat10
- Manager页面403 :默认不允许远程访问管理界面。如果需要远程管理,编辑
conf/tomcat-users.xml,添加用户和角色,同时编辑webapps/manager/META-INF/context.xml,把IP限制注释掉(生产环境不推荐)。
2.8 常用命令
- 启动:/tomcat10/bin/startup.sh
- 关闭:/tomcat10/bin/shutdown.sh
- 查看日志:tail -f /tomcat10/logs/catalina.out
- 重启:先关闭,再启动
3.Tomcat + Memcached 双机集群会话共享实验
两台Tomcat + 两台Memcached,互相备份,任意一台宕机,Session零丢失。
实验环境
| 主机名 | IP地址 | 角色 |
|---|---|---|
| RS1 | 172.25.254.10 | Tomcat节点1 + Memcached节点1 |
| RS2 | 172.25.254.20 | Tomcat节点2 + Memcached节点2 |
3.1 准备Tomcat的Session共享JAR包
RS1上操作,将所需JAR包解压并分发到两台服务器的Tomcat库目录:
在RS1上
root@RS1 \~# unzip jar.zip -d jar
root@RS1 \~# cd jar/
复制到本地Tomcat
root@RS1 jar# cp * /usr/local/tomcat/lib/
复制到RS2的Tomcat
root@RS1 jar# scp * root@172.25.254.20:/usr/local/tomcat/lib/
3.2 安装并配置Memcached
两台服务器都要安装:
RS1和RS2都要执行
root@RS1 \~# dnf install memcached -y
root@RS2 \~# dnf install memcached -y
修改Memcached配置文件,允许外网访问:
root@RS1 \~# vim /etc/sysconfig/memcached
root@RS2 \~# vim /etc/sysconfig/memcached
内容如下:
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
启动Memcached并设置开机自启:
root@RS1 \~# systemctl start memcached
root@RS1 \~# systemctl enable memcached
root@RS2 \~# systemctl start memcached
root@RS2 \~# systemctl enable memcached
验证服务是否正常监听:
root@RS1 \~# netstat -antluple | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 988 142615 35756/memcached
tcp6 0 0 ::1:11211 :::* LISTEN 988 142616 35756/memcached
防火墙放行Memcached端口(两台都做):
root@RS1 \~# firewall-cmd --permanent --add-port=11211/tcp
root@RS1 \~# firewall-cmd --reload
root@RS2 \~# firewall-cmd --permanent --add-port=11211/tcp
root@RS2 \~# firewall-cmd --reload
3.3 配置Tomcat的Session共享
RS1的配置
root@RS1 \~# vim /usr/local/tomcat/conf/context.xml
在<Context>标签内添加:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
RS2的配置
root@RS2 \~# vim /usr/local/tomcat/conf/context.xml
在<Context>标签内添加:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
3.4 重启服务
两台服务器分别重启Tomcat:
root@RS1 \~# systemctl restart tomcat.service
root@RS2 \~# systemctl restart tomcat.service
3.5 验证Session共享与故障转移
3.5.1 准备测试页面
在RS1的/usr/local/tomcat/webapps/ROOT/下创建session.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>双机Session共享测试</title>
</head>
<body>
<h2>Tomcat节点:<%= request.getLocalAddr() %>:<%= request.getLocalPort() %></h2>
<p>Session ID: <%= session.getId() %></p>
<p>服务器时间: <%= new java.util.Date() %></p>
<%
Integer count = (Integer) session.getAttribute("count");
if (count == null) {
count = 1;
} else {
count++;
}
session.setAttribute("count", count);
%>
<p>您在本会话中已访问 <strong style="color:red;"><%= count %></strong> 次。</p>
<p>存入Memcached测试属性:马年大吉2026</p>
</body>
</html>
把文件复制到RS2:
root@RS1 \~# scp /usr/local/tomcat/webapps/ROOT/session.jsp root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/
3.5.2 测试正常情况
浏览器访问http://172.25.254.10:8080/session.jsp,刷新几次,count值累加。
直接访问http://172.25.254.20:8080/session.jsp,注意观察:Session ID没有变!count值继续累加!说明两台Tomcat读取的是同一个Session。
3.5.3 测试故障转移
RS1的Memcached宕机
root@RS1 \~# systemctl stop memcached
刷新RS2上的session.jsp,Session依然有效,访问次数继续累加。因为RS2的failoverNodes设的是n2,正常情况下写n1,n1挂了自动切换到n2。
RS1的Tomcat宕机
root@RS1 \~# systemctl stop tomcat.service
此时只用RS2提供服务。刷新页面,Session ID不变,count值继续+1。
两台Memcached全宕
root@RS1 \~# systemctl stop memcached
root@RS2 \~# systemctl stop memcached
此时Session无法写入缓存,但Tomcat会降级为本地Session,用户不会直接被踢出,服务依然可用。Memcached恢复后自动重新同步。