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
-
安装 Java 运行环境(JRE)
yum install java-1.8.0-openjdk.x86_64 -y
-
解压并移动 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
-
启动 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 系统服务启动脚本(实现开机自启)
-
配置 Java 环境变量文件
编辑Tomcat环境配置文件
vim /usr/local/tomcat/conf/tomcat.conf
在文件中写入以下内容,保存并退出(按i编辑,esc后:wq保存)
JAVA_HOME=/etc/alternatives/jre
-
创建 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 -
创建 tomcat 用户并授权
创建无登录权限的tomcat用户(仅用于运行Tomcat)
useradd -s /sbin/nologin -M tomcat
递归修改Tomcat目录的所属用户和组为tomcat
chown tomcat.tomcat /usr/local/tomcat/ -R
-
重载服务并设置开机自启
重载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的整合
一、操作前提
- 已部署 Nginx 服务器(示例中 IP 未明确,需确保可连通 Tomcat 节点)
- 两台 Tomcat 服务器(172.25.254.10、172.25.254.20)已启动,且 8080 端口可访问
- 测试文件
test.jsp已准备(需包含可验证会话 / 访问的内容,比如输出当前服务器 IP 或会话 ID)
二、完整操作步骤(与示例对齐)
步骤 1:单体架构配置(Nginx 代理单 Tomcat)
-
进入 Nginx 虚拟主机配置目录
[root@Nginx ~]# cd /usr/local/nginx/conf/conf.d/
-
编辑虚拟主机配置文件
[root@Nginx conf.d]# vim vhosts.conf
-
写入单 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;
}
} -
部署测试文件到 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/
-
重新加载 Nginx 配置(使配置生效)
[root@Nginx conf.d]# nginx -s reload
-
客户端解析域名并测试访问
- Windows 系统:编辑
C:\Windows\System32\drivers\etc\hosts文件,添加一行:Nginx服务器IP app.timinglee.org - 打开浏览器,访问
http://app.timinglee.org/test.jsp,验证是否能正常访问 Tomcat 的 jsp 页面。
- Windows 系统:编辑
步骤 2:Tomcat 负载均衡配置(Nginx 代理多 Tomcat)
-
编辑 Nginx 虚拟主机配置文件,修改为负载均衡配置
[root@Nginx conf.d]# vim vhosts.conf
-
写入负载均衡配置(基于
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;
}
} -
重新加载 Nginx 配置
[root@Nginx conf.d]# nginx -s reload
-
客户端测试负载均衡
- 保持 Windows
hosts文件解析不变; - 打开多个浏览器(或无痕模式),访问
http://app.timinglee.org/test.jsp; - 验证:可在
test.jsp中添加输出当前服务器 IP 的代码,查看不同浏览器(不同会话)是否访问到不同 Tomcat 节点,同一浏览器多次刷新是否保持访问同一节点(会话粘性)。
- 保持 Windows
三、关键注意事项
- Nginx 与 Tomcat 之间网络需互通,确保 8080 端口未被防火墙拦截;
- Tomcat 默认
webapps/ROOT目录为根路径,若部署到其他目录需调整访问路径; - 会话粘性(
hash $cookie_JSESSIONID)依赖客户端携带JSESSIONIDCookie,若客户端禁用 Cookie 则失效,可改用ip_hash(基于客户端 IP); - 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) - 已安装
unzip、dnf(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"
五、关键说明
memcachedNodes:指定所有 memcached 节点(n1、n2 为自定义节点名,对应两台服务器的 memcached 地址 + 端口);failoverNodes:故障转移节点,RS1 配置failoverNodes="n1"表示 RS1 自身故障时,session 切换到 n2(RS2);RS2 配置failoverNodes="n2"同理;requestUriIgnorePattern:忽略静态资源的 session 同步(减少不必要的开销);transcoderFactoryClass:指定序列化方式(kryo 性能优于默认);- 确保两台服务器的 Tomcat、Memcached 服务互通(防火墙放行 8080、11211 端口)。
六、验证 session 共享
- 在 RS1 的 Tomcat 部署一个测试 Web 应用,写入 session;
- 访问 RS2 的 Tomcat,读取同一个 session,验证是否一致;
- 停止 RS1 的 Tomcat/Memcached,