实验简介
实验 1:Tomcat 安装部署
核心目标
完成 Tomcat 的基础安装、环境配置与系统服务化,为后续整合和集群搭建打下基础。
关键操作
- 基础部署 :
- 下载 Tomcat 9 安装包,解压到
/usr/local并改名tomcat; - 安装 JDK 1.8(Tomcat 运行依赖 Java 环境),启动 Tomcat 并验证 8080 端口监听。
- 下载 Tomcat 9 安装包,解压到
- 服务化配置 :
- 创建
tomcat.conf定义 JAVA_HOME 环境变量; - 编写
tomcat.service系统服务文件(Type=forking,指定启动 / 停止脚本,设置运行用户为 tomcat); - 创建 tomcat 系统用户,修改 Tomcat 目录权限,配置开机自启并验证服务状态。
- 创建
实验价值
规范 Tomcat 部署流程,实现 Tomcat 的系统级管理(开机自启、便捷启停),符合生产环境的部署规范。
实验 2:Nginx 与 Tomcat 的整合
核心目标
实现 Nginx 作为前端反向代理,将 JSP 请求转发给后端 Tomcat 处理,分为单体架构 和Tomcat 负载均衡两个阶段。
关键操作
- 单体架构阶段 :
- 在 Nginx 的
conf.d/vhosts.conf中配置虚拟主机,监听 80 端口,匹配.jsp后缀的请求,代理到单台 Tomcat(172.25.254.10:8080); - 将测试用的
test.jsp文件部署到 Tomcat 的webapps/ROOT目录; - 重载 Nginx 配置,通过域名
app.timinglee.org/test.jsp访问验证。
- 在 Nginx 的
- 负载均衡阶段 :
- 在 Nginx 配置中新增
upstream模块,定义两台 Tomcat 节点(172.25.254.10:8080、172.25.254.20:8080),并通过hash $cookie_JSESSIONID绑定会话(基于 JSESSIONID 保证会话粘性); - 修改
proxy_pass指向upstream集群名称,实现 JSP 请求在多台 Tomcat 间的负载分发。
- 在 Nginx 配置中新增
实验价值
解决单 Tomcat 性能瓶颈,通过 Nginx 实现请求分发,是 Web 服务水平扩展的基础。
实验 3:Tomcat+Memcache 实现 session 会话零丢失
核心目标
解决 Tomcat 负载均衡场景下的会话丢失问题(如某台 Tomcat 宕机后,用户会话不失效),通过 Memcache 存储会话数据,实现会话共享与故障转移。
关键操作
- 环境准备 :
- 解压并部署 Memcache 相关 jar 包到两台 Tomcat 的
lib目录(提供会话存储与交互能力); - 安装并配置 Memcached 服务(监听 11211 端口,允许所有地址访问),验证服务启动。
- 解压并部署 Memcache 相关 jar 包到两台 Tomcat 的
- 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 集群会话共享,保障服务高可用,避免单点故障导致的会话丢失,是生产环境必备的高可用配置。
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