tomcat

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恢复后自动重新同步。

相关推荐
Shadow(⊙o⊙)10 分钟前
System V共享内存详解,shm系列接口,三种共享内存删除机制。System V通信缺点分析
linux·运维·服务器·开发语言·网络·c++
喵喵爱自由17 分钟前
ubuntu离线扩展磁盘分区
linux·运维·ubuntu
摇滚侠20 分钟前
git ignore 忽略 .idea 目录 全新项目(尚未提交过 .idea).idea 已经被 Git 跟踪(已提交过)
java·git·intellij-idea
linge_sun20 分钟前
SpringAI SQL 智能助手实战:用自然语言查询数据库
java·人工智能·ai编程
熟悉的新风景21 分钟前
maven常用依赖
java·maven
light blue bird22 分钟前
3C 数码电子BOM 协同工作台组件
java·开发语言·jvm·windows·.net·桌面端
落羽的落羽23 分钟前
【项目】JsonRpc框架——功能测试、项目总结
linux·服务器·开发语言·c++·qt·算法·机器学习
RisunJan23 分钟前
Linux命令-openssl(强大的安全套接字层密码库)
linux·运维·服务器
我是一颗柠檬30 分钟前
【Redis】Redis分布式锁Day13(2026年)
java·redis·分布式·缓存
bush49 小时前
嵌入式linux学习记录七,中断
linux·嵌入式