整个过程可以分为以下几个核心步骤:
- 环境准备:准备好 nginx 和多个 tomcat 实例。
- 配置 tomcat 集群:确保所有 tomcat 实例配置一致,并能通过
session共享来维持用户登录状态。 - 配置 nginx 负载均衡:设置 nginx 反向代理,将请求分发到不同的 tomcat 实例。
- 验证与测试:验证集群是否正常工作。
1. 环境准备
- 一台 nginx 服务器:用于接收外部请求并分发。
- 两台或多台 tomcat 服务器:构成应用服务器集群。为了简单演示,我们可以在同一台服务器上启动多个 tomcat 实例,通过修改端口来区分它们。
示例场景:
- nginx 服务器:
192.168.1.100,监听80端口。 - tomcat 集群:
- tomcat 1: 监听
8080端口 - tomcat 2: 监听
8081端口
- tomcat 1: 监听
2. 配置 tomcat 集群 (session 共享)
这是集群部署的关键。如果不配置 session 共享,用户的一次请求可能分发到 tomcat 1,登录成功后,下一次请求可能分发到 tomcat 2,而 tomcat 2 上没有该用户的 session,导致用户需要重新登录。
解决方案:使用 redis 集中存储 session。
步骤 a:修改 tomcat 配置 (conf/context.xml)
在所有 tomcat 实例的 conf/context.xml 文件中,添加以下 <manager> 配置。
<!-- tomcat 1 和 tomcat 2 的 context.xml 都需要添加此配置 -->
<context>
... 其他配置 ...
<!--
使用 redis 存储 session
确保你的项目中已经引入了 tomcat-redis-session-manager 的相关 jar 包
下载地址: https://github.com/ran-jit/tomcat-redis-session-manager/releases
需要将 tomcat-redis-session-manager-version.jar, jedis-version.jar, commons-pool2-version.jar 放入 tomcat 的 lib 目录
-->
<manager classname="com.orangefunction.tomcat.redissessions.redissessionmanager"
host="127.0.0.1" <!-- redis 服务器地址 -->
port="6379" <!-- redis 端口 -->
password="" <!-- redis 密码 (如果没有则为空) -->
database="0" <!-- 使用的 redis 数据库 -->
maxinactiveinterval="60" <!-- session 过期时间(秒) -->
sessionpersistpolicies="persist_policy_1,persist_policy_2" />
</context>
重要:
- 我的测试版本:apache-tomcat-9.0.113,下载jar 包 jackson-databind-2.13.4.jar,redisson-all-3.17.0.jar,redisson-tomcat-9-3.17.0.jar,slf4j-simple-1.7.36.jar,放入每个 tomcat 实例的
lib目录下。 - mven仓库地址:https://mvnrepository.com/artifact/com.dotcms
- 所有 tomcat 实例都必须连接到同一个 redis 实例。
步骤 b:修改 tomcat 端口 (如果在同一台服务器)
如果你的多个 tomcat 实例在同一台服务器上,需要修改 conf/server.xml 文件来避免端口冲突。
对于 tomcat 2 (tomcat2),修改以下三个端口:
<!-- 修改前 --> <server port="8005" shutdown="shutdown"> <connector port="8080" protocol="http/1.1" ... /> <connector port="8009" protocol="ajp/1.3" redirectport="8443" /> <!-- 修改后 (例如) --> <server port="8006" shutdown="shutdown"> <connector port="8081" protocol="http/1.1" ... /> <connector port="8010" protocol="ajp/1.3" redirectport="8443" />
步骤 c:部署测试应用
为了验证负载均衡和 session 共享是否生效,我们可以创建一个简单的 jsp 页面。
在两个 tomcat 的 webapps/root 目录下创建一个 index.jsp 文件:
<%@ page contenttype="text/html;charset=utf-8" language="java" %>
<html>
<head>
<title>tomcat cluster test</title>
</head>
<body>
<h1>tomcat cluster test</h1>
<p>服务器信息: <%= request.getlocaladdr() + ":" + request.getlocalport() %></p>
<p>session id: <%= session.getid() %></p>
<p>session 创建时间: <%= new java.util.date(session.getcreationtime()) %></p>
<%
// 在 session 中设置一个属性
string dataname = "testdata";
if (session.getattribute(dataname) == null) {
session.setattribute(dataname, "this is a test data from tomcat.");
out.println("<p>session 数据已创建!</p>");
} else {
out.println("<p>session 数据: " + session.getattribute(dataname) + "</p>");
}
%>
</body>
</html>
启动 tomcat:分别启动两个 tomcat 实例。
3. 配置 nginx 负载均衡
配置 nginx,让它作为前端反向代理。
编辑 nginx 的主配置文件 nginx.conf 或者在 conf.d 目录下创建一个新的配置文件(例如 tomcat-cluster.conf)。
# 定义一个上游服务器组,即你的 tomcat 集群
upstream tomcat_cluster {
# 策略1: 默认轮询 (round robin)
# 每个请求按时间顺序逐一分配到不同的后端服务器。
server 127.0.0.1:8080 weight=1; # tomcat 1
server 127.0.0.1:8081 weight=1; # tomcat 2
# 策略2: 最少连接 (least connections)
# 请求被转发到当前活动连接数最少的后端服务器。
# least_conn;
# 策略3: ip 哈希 (ip hash)
# 根据访问 ip 的哈希结果分配,确保来自同一 ip 的请求始终定向到同一台后端服务器。
# ip_hash;
}
# 配置一个 server 块来接收外部请求
server {
listen 80;
server_name 192.168.1.100; # 你的 nginx 服务器地址或域名
location / {
# 将请求代理到上游服务器组
proxy_pass http://tomcat_cluster;
# 以下是一些推荐的 proxy 设置
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_set_header x-forwarded-proto $scheme;
# 为了 websocket 支持 (如果需要)
proxy_http_version 1.1;
proxy_set_header upgrade $http_upgrade;
proxy_set_header connection "upgrade";
}
# 配置静态资源直接由 nginx 处理,提高性能
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
# 假设你的静态资源在 nginx 的 html 目录下
root /usr/share/nginx/html;
expires 30d; # 缓存30天
}
}
配置说明:
upstream tomcat_cluster: 定义了一个名为tomcat_cluster的服务器池。server 127.0.0.1:8080;: 指定了后端服务器的地址和端口。weight参数表示权重,权重越高的服务器被分配到请求的概率越大。proxy_pass http://tomcat_cluster;: 这是核心指令,它将当前location匹配的所有请求转发到tomcat_cluster这个服务器池中。proxy_set_header: 设置一些重要的 http header,以便后端 tomcat 能够获取到真实的客户端信息。
检查并重新加载 nginx 配置:
运行
# 检查配置语法是否正确 sudo nginx -t # 如果语法正确,重新加载配置 sudo nginx -s reload
4. 验证与测试
现在,所有配置都已完成。打开你的浏览器,访问 nginx 的地址:http://192.168.1.100。
预期结果:
负载均衡验证:
- 第一次刷新页面,你可能会看到 "服务器信息" 显示
127.0.0.1:8080。 - 第二次刷新页面,你可能会看到 "服务器信息" 显示
127.0.0.1:8081。 - 这证明了 nginx 正在将请求轮流分发到两个 tomcat 实例上。
- 第一次刷新页面,你可能会看到 "服务器信息" 显示
session 共享验证:
- 在多次刷新页面,切换不同 tomcat 服务器的过程中,你会发现 "session id" 始终是同一个。
- "session 数据" 也会一直显示,不会因为切换服务器而丢失。
- 这证明了两个 tomcat 实例成功地从 redis 中共享了 session 信息。
总结
到此这篇关于使用nginx实现tomcat集群的负载均衡的文章就介绍到这了,更多相关nginx实现tomcat集群的负载均衡内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论