云原生(TOMCAT实验)

实验简介

实验 1:Tomcat 安装部署

核心目标

完成 Tomcat 的基础安装、环境配置与系统服务化,为后续整合和集群搭建打下基础。

关键操作
  1. 基础部署
    • 下载 Tomcat 9 安装包,解压到/usr/local并改名tomcat
    • 安装 JDK 1.8(Tomcat 运行依赖 Java 环境),启动 Tomcat 并验证 8080 端口监听。
  2. 服务化配置
    • 创建tomcat.conf定义 JAVA_HOME 环境变量;
    • 编写tomcat.service系统服务文件(Type=forking,指定启动 / 停止脚本,设置运行用户为 tomcat);
    • 创建 tomcat 系统用户,修改 Tomcat 目录权限,配置开机自启并验证服务状态。
实验价值

规范 Tomcat 部署流程,实现 Tomcat 的系统级管理(开机自启、便捷启停),符合生产环境的部署规范。

实验 2:Nginx 与 Tomcat 的整合

核心目标

实现 Nginx 作为前端反向代理,将 JSP 请求转发给后端 Tomcat 处理,分为单体架构Tomcat 负载均衡两个阶段。

关键操作
  1. 单体架构阶段
    • 在 Nginx 的conf.d/vhosts.conf中配置虚拟主机,监听 80 端口,匹配.jsp后缀的请求,代理到单台 Tomcat(172.25.254.10:8080);
    • 将测试用的test.jsp文件部署到 Tomcat 的webapps/ROOT目录;
    • 重载 Nginx 配置,通过域名app.timinglee.org/test.jsp访问验证。
  2. 负载均衡阶段
    • 在 Nginx 配置中新增upstream模块,定义两台 Tomcat 节点(172.25.254.10:8080、172.25.254.20:8080),并通过hash $cookie_JSESSIONID绑定会话(基于 JSESSIONID 保证会话粘性);
    • 修改proxy_pass指向upstream集群名称,实现 JSP 请求在多台 Tomcat 间的负载分发。
实验价值

解决单 Tomcat 性能瓶颈,通过 Nginx 实现请求分发,是 Web 服务水平扩展的基础。

实验 3:Tomcat+Memcache 实现 session 会话零丢失

核心目标

解决 Tomcat 负载均衡场景下的会话丢失问题(如某台 Tomcat 宕机后,用户会话不失效),通过 Memcache 存储会话数据,实现会话共享与故障转移。

关键操作
  1. 环境准备
    • 解压并部署 Memcache 相关 jar 包到两台 Tomcat 的lib目录(提供会话存储与交互能力);
    • 安装并配置 Memcached 服务(监听 11211 端口,允许所有地址访问),验证服务启动。
  2. Tomcat 会话配置
    • 修改 Tomcat 的context.xml,添加MemcachedBackupSessionManager管理器;
    • 配置 Memcached 节点(n1:172.25.254.10:11211、n2:172.25.254.20:11211)、故障转移节点(RS1 指定 failoverNodes="n1",RS2 指定 failoverNodes="n2");
    • 忽略静态资源的会话追踪,指定 Kryo 序列化方式,重启 Tomcat 生效。
实验价值

实现 Tomcat 集群会话共享,保障服务高可用,避免单点故障导致的会话丢失,是生产环境必备的高可用配置。

Tomcat安装部署

下载安装包

复制代码
[root@RS1 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz

部署tomcat

复制代码
[root@RS1 local]# yum install java-1.8.0-openjdk.x86_64 -y
[root@RS1 ~]# tar zxf apache-tomcat-9.0.115.tar.gz  -C /usr/local
[root@RS1 ~]# cd /usr/local/
[root@RS1 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src  tomcat-9.0-doc
[root@RS1 local]# mv apache-tomcat-9.0.115/ tomcat
[root@RS1 local]# cd tomcat/
[root@RS1 tomcat]# ls
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work
[root@RS1 bin]# ./startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@RS1 bin]# netstat -antlupe | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      0          139291     10372/java

制作tomcat的启动脚本

复制代码
[root@RS1 bin]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre
[root@RS1 bin]# vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
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
[root@RS1 bin]# useradd  -s /sbin/nologin -M tomcat
[root@RS1 bin]# chown  tomcat.tomcat /usr/local/tomcat/ -R
[root@RS1 bin]# systemctl daemon-reload
[root@RS1 bin]# systemctl enable --now tomcat
[root@RS1 bin]# netstat -antlupe | grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       139979     10682/java
tcp6       0      0 :::8080                 :::*                    LISTEN      1000       140563     10682/java

Nginx与tomcat的整合

单体架构

复制代码
[root@nginx conf.d]# cd /usr/local/nginx/conf/conf.d/
[root@nginx conf.d]# vim vhosts.conf
server {
    listen 80;
    server_name app.timinglee.org;
    location ~* \.jsp$ {
        proxy_pass http://172.25.254.10:8080;
    }
}

[root@RS1 ~]# cp test.jsp  /usr/local/tomcat/webapps/ROOT/
[root@RS1 ~]# scp test.jsp  root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/
[root@Nginx conf.d]# nginx  -s reload
#在windows中设定app.timinglee.org的解析
#在浏览器中访问 app.timinglee.org/test.jsp

tomcat负载均衡

复制代码
[root@nginx conf.d]# vim vhosts.conf
upstream tomcat {
    hash $cookie_JSESSIONID;
    server 172.25.254.10:8080;
    server 172.25.254.20:8080;
}
server {
    listen  80;
    server_name app.timinglee.org;
    location ~* \.jsp$ {
        proxy_pass http://tomcat;
    }
}
[root@nginx conf.d]# nginx  -s reload
#在windows浏览器中访问 app.timinglee.org/test.jsp;
#在windows的另外一个浏览器中访问 app.timinglee.org/test.jsp;

tomcat+memcache实现session会话零丢失

tomcat加载模块

复制代码
[root@RS1 ~]# unzip jar.zip
[root@RS1 ~]# cd jar/
[root@RS1 jar]# cp * /usr/local/tomcat/
[root@RS1 jar]# scp * root@172.25.254.20:/usr/local/tomcat/lib/

安装memcache

复制代码
[root@RS1 jar]# dnf install memcached
[root@RS2 ~]# dnf install memcached -y
[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"

[root@RS1+2 ~]# 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

配置tomcat

复制代码
[root@RS1 ]#  vim /usr/local/tomcat/conf/context.xml

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
   <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"
    />

</Context>
[root@RS2 ]#  vim /usr/local/tomcat/conf/context.xml

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
   <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"
    />

</Context>
[root@RS1 ~]#  systemctl restart tomcat.service
[root@RS2 ~]#  systemctl restart tomcat.service
相关推荐
金銀銅鐵1 小时前
浅解 Junit 4 第七篇:AllDefaultPossibilitiesBuilder
java·junit·单元测试
笨蛋不要掉眼泪1 小时前
Spring Cloud Alibaba Sentinel 从入门到实战:微服务稳定性的守护者
分布式·微服务·云原生·架构·sentinel
BigGGGuardian1 小时前
给 Spring Boot 接口加了幂等保护:Token 机制 + 结果缓存,一个注解搞定
java·开源
Kiyra1 小时前
深入浅出远程连接:Java 后端视角下的底层原理与实践
java·开发语言
一只鹿鹿鹿1 小时前
数据治理文档(word原件)
java·运维·spring boot·后端
beata1 小时前
Java基础-12:Java IO深度解析与避坑指南:从底层原理到BIO NIO AIO实战
java·后端
Hx_Ma161 小时前
测试题(五)
java·开发语言·后端
yy.y--1 小时前
Java文件读取实战:用FileInputStream显示源码
java·开发语言
我是大猴子1 小时前
异常的处理
java·开发语言