Tomcat

Tomcat安装部署

一、下载 Tomcat 安装包

复制代码
# 切换到root用户(若未切换)
su root
# 下载Tomcat 9.0.115版本安装包(官网直链)
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz

若提示wget: command not found,先执行yum install wget -y安装 wget 工具

二、部署 Tomcat

  1. 安装 Java 运行环境(JRE)

    yum install java-1.8.0-openjdk.x86_64 -y

  2. 解压并移动 Tomcat 目录

    解压安装包到/usr/local目录

    tar zxf apache-tomcat-9.0.115.tar.gz -C /usr/local

    进入/usr/local目录

    cd /usr/local/

    重命名Tomcat目录为简洁的tomcat

    mv apache-tomcat-9.0.115/ tomcat

    进入Tomcat目录,验证文件结构

    cd tomcat/
    ls

执行ls后应看到:bin、conf、lib、logs、README.md、RUNNING.txt、webapps、BUILDING.txt、CONTRIBUTING.md、LICENSE、NOTICE、RELEASE-NOTES、temp、work

  1. 启动 Tomcat 并验证端口

    进入Tomcat的bin目录

    cd bin/

    启动Tomcat

    ./startup.sh

    检查8080端口是否监听(Tomcat默认端口)

    netstat -antlupe | grep 8080

执行后应看到类似输出:tcp6 0 0 :::8080 :::* LISTEN 0 xxxxx xxxx/java若提示netstat: command not found,先执行yum install net-tools -y安装 net-tools 工具

三、制作 Tomcat 系统服务启动脚本(实现开机自启)

  1. 配置 Java 环境变量文件

    编辑Tomcat环境配置文件

    vim /usr/local/tomcat/conf/tomcat.conf

    在文件中写入以下内容,保存并退出(按i编辑,esc后:wq保存)

    JAVA_HOME=/etc/alternatives/jre

  2. 创建 systemd 服务文件

    编辑tomcat.service服务文件

    vim /lib/systemd/system/tomcat.service

    写入以下内容(覆盖原有内容,若无则新建)

    [Unit]
    Description=Tomcat
    After=syslog.target network.target

    [Service]
    Type=forking
    EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
    ExecStart=/usr/local/tomcat/bin/startup.sh
    ExecStop=/usr/local/tomcat/bin/shutdown.sh
    PrivateTmp=true
    User=tomcat
    Group=tomcat

    [Install]
    WantedBy=multi-user.target

  3. 创建 tomcat 用户并授权

    创建无登录权限的tomcat用户(仅用于运行Tomcat)

    useradd -s /sbin/nologin -M tomcat

    递归修改Tomcat目录的所属用户和组为tomcat

    chown tomcat.tomcat /usr/local/tomcat/ -R

  4. 重载服务并设置开机自启

    重载systemd配置(使新服务生效)

    systemctl daemon-reload

    启用并立即启动tomcat服务

    systemctl enable --now tomcat

    验证Java进程对应的端口(8080为HTTP端口,8005为关闭端口)

    netstat -antlupe | grep java

执行后应看到类似输出:tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1000 xxxxx xxxx/java``tcp6 0 0 :::8080 :::* LISTEN 1000 xxxxx xxxx/java

补充说明

  • 停止 Tomcat:systemctl stop tomcat
  • 重启 Tomcat:systemctl restart tomcat
  • 查看 Tomcat 状态:systemctl status tomcat
  • 访问 Tomcat 控制台:浏览器输入http://服务器IP:8080(需确保服务器防火墙放行 8080 端口,执行firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload

Nginx与tomcat的整合

一、操作前提

  1. 已部署 Nginx 服务器(示例中 IP 未明确,需确保可连通 Tomcat 节点)
  2. 两台 Tomcat 服务器(172.25.254.10、172.25.254.20)已启动,且 8080 端口可访问
  3. 测试文件test.jsp已准备(需包含可验证会话 / 访问的内容,比如输出当前服务器 IP 或会话 ID)

二、完整操作步骤(与示例对齐)

步骤 1:单体架构配置(Nginx 代理单 Tomcat)
  1. 进入 Nginx 虚拟主机配置目录

    [root@Nginx ~]# cd /usr/local/nginx/conf/conf.d/

  2. 编辑虚拟主机配置文件

    [root@Nginx conf.d]# vim vhosts.conf

  3. 写入单 Tomcat 代理配置(监听 80 端口,匹配 jsp 请求转发到单个 Tomcat)

    server {
    listen 80;
    server_name app.timinglee.org;
    # 匹配所有jsp后缀的请求
    location ~* .jsp { proxy_pass http://172.25.254.10:8080; # 可选:添加代理头部,保证Tomcat获取真实客户端信息 proxy_set_header Host host;
    proxy_set_header X-Real-IP remote_addr; proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
    }
    }

  4. 部署测试文件到 Tomcat 节点

    本地Tomcat(172.25.254.10)部署test.jsp

    [root@RS1 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/

    远程复制到第二个Tomcat(172.25.254.20)(单体架构暂时用不到,为后续负载均衡准备)

    [root@RS1 ~]# scp test.jsp root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/

  5. 重新加载 Nginx 配置(使配置生效)

    [root@Nginx conf.d]# nginx -s reload

  6. 客户端解析域名并测试访问

    • Windows 系统:编辑C:\Windows\System32\drivers\etc\hosts文件,添加一行:Nginx服务器IP app.timinglee.org
    • 打开浏览器,访问http://app.timinglee.org/test.jsp,验证是否能正常访问 Tomcat 的 jsp 页面。
步骤 2:Tomcat 负载均衡配置(Nginx 代理多 Tomcat)
  1. 编辑 Nginx 虚拟主机配置文件,修改为负载均衡配置

    [root@Nginx conf.d]# vim vhosts.conf

  2. 写入负载均衡配置(基于JSESSIONID会话粘性,保证同一客户端请求到同一 Tomcat)

    定义Tomcat集群节点

    upstream tomcat {
    hash $cookie_JSESSIONID; # 基于JSESSIONID做会话粘性
    server 172.25.254.10:8080; # 第一个Tomcat节点
    server 172.25.254.20:8080; # 第二个Tomcat节点
    # 可选:添加权重/状态配置,比如 server 172.25.254.10:8080 weight=2;(权重2)
    }

    server {
    listen 80;
    server_name app.timinglee.org;
    location ~* .jsp { proxy_pass http://tomcat; # 转发到定义的tomcat集群 # 必加:代理头部配置,否则Tomcat可能无法正常处理请求 proxy_set_header Host host;
    proxy_set_header X-Real-IP remote_addr; proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
    # 可选:会话超时配置
    proxy_connect_timeout 60s;
    proxy_read_timeout 60s;
    }
    }

  3. 重新加载 Nginx 配置

    [root@Nginx conf.d]# nginx -s reload

  4. 客户端测试负载均衡

    • 保持 Windowshosts文件解析不变;
    • 打开多个浏览器(或无痕模式),访问http://app.timinglee.org/test.jsp
    • 验证:可在test.jsp中添加输出当前服务器 IP 的代码,查看不同浏览器(不同会话)是否访问到不同 Tomcat 节点,同一浏览器多次刷新是否保持访问同一节点(会话粘性)。

三、关键注意事项

  1. Nginx 与 Tomcat 之间网络需互通,确保 8080 端口未被防火墙拦截;
  2. Tomcat 默认webapps/ROOT目录为根路径,若部署到其他目录需调整访问路径;
  3. 会话粘性(hash $cookie_JSESSIONID)依赖客户端携带JSESSIONID Cookie,若客户端禁用 Cookie 则失效,可改用ip_hash(基于客户端 IP);
  4. Nginx 配置修改后必须执行nginx -s reload,若配置错误会导致 reload 失败,可先执行nginx -t验证配置语法。

四、test.jsp 示例代码(用于验证访问节点)

复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Tomcat节点测试</title>
</head>
<body>
    <h1>当前访问的Tomcat节点IP:</h1>
    <%
        // 输出当前Tomcat服务器的IP地址
        java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
        out.println(addr.getHostAddress());
        // 输出会话ID,验证会话粘性
        out.println("<br/>JSESSIONID:" + session.getId());
    %>
</body>
</html>

tomcat+memcache实现session会话零丢失

一、环境准备

  • 两台服务器(示例:RS1:172.25.254.10,RS2:172.25.254.20)
  • 已安装 Tomcat(示例路径:/usr/local/tomcat
  • 已安装 unzipdnf(CentOS/RHEL 系统)
  • 准备好 msm 相关 jar 包(打包为 jar.zip

二、步骤 1:Tomcat 加载 MSM 模块

将 memcached-session-manager 相关 jar 包部署到两台 Tomcat 服务器的 lib 目录:

复制代码
# 在 RS1 服务器操作
unzip jar.zip
cd jar/
cp * /usr/local/tomcat/lib/  # 复制jar包到Tomcat lib目录
scp * root@172.25.254.20:/usr/local/tomcat/lib/  # 同步到RS2服务器

# (可选)在 RS2 验证jar包是否存在
ssh root@172.25.254.20 "ls /usr/local/tomcat/lib/ | grep msm"

三、步骤 2:安装并配置 Memcached

1. 安装 Memcached
复制代码
# RS1 服务器安装
dnf install memcached -y

# RS2 服务器安装(可远程执行或直接登录操作)
ssh root@172.25.254.20 "dnf install memcached -y"
2. 配置 Memcached(两台服务器配置一致)
复制代码
# 编辑 RS1 的 Memcached 配置文件
vim /etc/sysconfig/memcached
# 修改配置内容为:
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"

# 同步配置到 RS2
scp /etc/sysconfig/memcached root@172.25.254.20:/etc/sysconfig/memcached

# 启动并设置 Memcached 开机自启(两台服务器)
# RS1
systemctl start memcached
systemctl enable memcached

# RS2
ssh root@172.25.254.20 "systemctl start memcached && systemctl enable memcached"

# 验证 Memcached 监听状态(两台服务器)
# RS1
netstat -antluple | grep memcached
# RS2
ssh root@172.25.254.20 "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

四、步骤 3:配置 Tomcat 的 context.xml(核心)

1. 配置 RS1 服务器(172.25.254.10)
复制代码
vim /usr/local/tomcat/conf/context.xml

<Context> 标签内添加 / 修改如下内容:

复制代码
<Context>
    <!-- 原有监控资源配置 -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- 禁用默认session持久化(可选,注释打开) -->
    <!-- <Manager pathname="" /> -->

    <!-- MSM 核心配置 -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
        failoverNodes="n1"  <!-- RS1 故障时切换到 n1(自身)/n2(RS2),此处表示RS1故障则使用n2 -->
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>
2. 配置 RS2 服务器(172.25.254.20)
复制代码
ssh root@172.25.254.20 "vim /usr/local/tomcat/conf/context.xml"

<Context> 标签内添加 / 修改如下内容:

复制代码
<Context>
    <!-- 原有监控资源配置 -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- 禁用默认session持久化(可选,注释打开) -->
    <!-- <Manager pathname="" /> -->

    <!-- MSM 核心配置 -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
        failoverNodes="n2"  <!-- RS2 故障时切换到 n2(自身)/n1(RS1),此处表示RS2故障则使用n1 -->
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>
3. 重启 Tomcat 使配置生效
复制代码
# 重启 RS1 的 Tomcat
systemctl restart tomcat.service

# 重启 RS2 的 Tomcat
ssh root@172.25.254.20 "systemctl restart tomcat.service"

# 验证 Tomcat 启动状态
systemctl status tomcat.service
ssh root@172.25.254.20 "systemctl status tomcat.service"

五、关键说明

  1. memcachedNodes:指定所有 memcached 节点(n1、n2 为自定义节点名,对应两台服务器的 memcached 地址 + 端口);
  2. failoverNodes:故障转移节点,RS1 配置 failoverNodes="n1" 表示 RS1 自身故障时,session 切换到 n2(RS2);RS2 配置 failoverNodes="n2" 同理;
  3. requestUriIgnorePattern:忽略静态资源的 session 同步(减少不必要的开销);
  4. transcoderFactoryClass:指定序列化方式(kryo 性能优于默认);
  5. 确保两台服务器的 Tomcat、Memcached 服务互通(防火墙放行 8080、11211 端口)。

六、验证 session 共享

  1. 在 RS1 的 Tomcat 部署一个测试 Web 应用,写入 session;
  2. 访问 RS2 的 Tomcat,读取同一个 session,验证是否一致;
  3. 停止 RS1 的 Tomcat/Memcached,
相关推荐
爱学习的小可爱卢1 小时前
JavaSE基础-Java异常体系:Bug定位终极指南
java·bug·javase
甲枫叶1 小时前
【claude+weelinking产品经理系列15】UI/UX 打磨——产品经理的审美终于能自己实现
java·人工智能·python·ui·产品经理·ai编程·ux
zihan03211 小时前
将若依(RuoYi)框架从适配 Spring Boot 2 的版本升级到 Spring Boot 3
java·spring boot·github·若依框架
@insist1231 小时前
软考-软件设计师-数据表示核心考点详解:从进制转换到 IEEE 754 标准
java·数据结构·算法
柒.梧.1 小时前
Java拷贝精讲:彻底分清浅拷贝与深拷贝
java·开发语言·python
七夜zippoe1 小时前
微服务架构下Spring Session与Redis分布式会话实战全解析
java·redis·maven·spring session·分布式会话
vx_Biye_Design3 小时前
【关注可免费领取源码】云计算及其应用网络教学系统--毕设附源码35183
java·spring·spring cloud·servlet·eclipse·云计算·课程设计
码农阿豪10 小时前
Nacos 日志与 Raft 数据清理指南:如何安全释放磁盘空间
java·安全·nacos
直有两条腿10 小时前
【大模型】Langchain4j
java·langchain