网站首页 > 技术教程 正文
Tomcat 集群是当单台服务器达到性能瓶颈,通过横向扩展的方式提高整体系统性能的有效手段。Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,可以通过简单的配置实现 Tomcat 集群的负载均衡。
本文使用的 Tomcat 是 8.5.35 版本,Nginx 是 1.14.2 版本。接下来看下配置的过程以及可能会遇到的问题,首发于微信公众号「顿悟源码」。
1. 概述
对于 Web 应用来说,集群最大的问题就是 Session 信息的共享,一般有以下解决方法:
- 使用粘性会话,比如,使用 IP Hash 的负载均衡策略,将当前用户的请求都集中到一台服务器上;缺点是单点故障,会话丢失
- 使用 Session 复制,使用 Tomcat 自带的 Session 复制策略,将会话信息同步到集群的各个节点;缺点是消耗更多内存和带宽,适用于小型集群
- 使用第三方缓存中间件缓存整个集群会话信息,比如 Redis 缓存,可由应用程序控制与 Session 的关联,也可以适配 Tomcat
- 当然了,也可以把会话信息存到共享文件系统或者数据库
在配置 Nginx 的过程中,可能会遇到以下问题:
- 配置 upstream 名称时不能使用下划线,比如 tomcat_ha,否则 Tomcat 会抛出 The character [_] is never valid in a domain name 的异常
- 在 windows 上杀掉所有的 nginx.exe 进程,taskkill /fi "imagename eq nginx.exe" /f
- 在 windows 上有个 pid 为 4 的系统进程会占用 80 端口,所以这里将 nginx 改为了 8000
在配置 Tomcat 集群的过程中,需要注意的问题:
- 确保 web.xml 配置了 <distributable/> 元素
- 确保 Context 的 Manager 别被替换成了标准会话管理器
- Receiver.address 不要配置成 auto,因为默认可能会绑定 127.0.0.1;Receiver.port 可改也可不改,Tomcat 会自行检测 4000-4100 范围内的可用端口,自动处理冲突
- 如果在不同服务器上,需要关闭防火墙或开端口,还有时间同步
2. Nginx 核心配置
Nginx 使用的是默认配置,添加和修改的核心配置如下:
http { ... #gzip on; #设置负载均衡的服务器列表和权重 upstream tomcat-ha { #ip_hash; server 172.31.1.41:8080 weight=1; server 172.31.1.42:8080 weight=1; } server { listen 8000; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; #转发请求 proxy_pass http://tomcat-ha$request_uri; proxy_set_header Host $http_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; } ... } }
3. Tomcat 集群配置
启用集群配置,在 <Engine> 元素中添加以下配置:
<!-- channelSendOptions=6 同步复制 --> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> <!-- 集群 Session 管理器 --> <Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" mapSendOptions="6"/> <!-- <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> --> <!-- 集群内部通信配置 --> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.10.2" port="5000" selectorTimeout="100" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> </Channel> <!-- 此 vavle 拦截请求,并将 Session 信息发给内部节点 --> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
简单描述下工作原理:
- nginx 将请求转发给 Tomcat1,请求登录认证,创建会话,生成 Cookie,在响应返回之前,将 Session 信息复制到 Tomcat2
- 再次请求时,nginx 将带着会话 Cookie 的请求转发给了 Tomcat2,Tomcat2 发现内部 Session 池中有关联的已认证成功的 Session 对象,不再认证返回请求资源
4. 验证负载均衡和 Session 复制
4.1 测试环境
- 使用两台 PC 部署 Tomcat,对应关系是:172.31.1.41-Tomcat1,172.31.1.42-Tomcat2
- 部署基于使用 Tomcat 自带的 SessionExample 程序,编写了一个 tomcat-benchmark 的 web 应用
- 结合 Tomcat 自带的 Manager 应用,查看已部署应用内部 Session 池
4.2 负载均衡
修改 tomcat-benchmark 部署描述符文件中的 context-param 为 "I'm Tomcat 1/2" 用于区分两个 Tomcat,启动 Nginx 和 Tomcat,在浏览器访问 localhost:8080 可以看到请求在两个服务器间切换:
4.3 Session 复制
为了方便理解,这里先把 Nginx 的负载均衡策略设置成 ip_hash:
- 假设 Nginx 始终将请求定位到 Tomcat1 上,然后在 Tomcat1 上创建会话,往会话中添加一些属性
- 关闭 Tomcat1 模拟故障,此时 Nginx 会带着之前的会话 Cookie 将请求转发到 Tomcat2,上
- 查看 Tomcat2 上是否存在与 Cookie(JSESSIONID) 关联的 Session 信息,若有表示复制成功
整个过程如下:
动图正好与上述描述的相反,可以看到 Session 信息从 Tomcat2 复制到了 Tomcat1 中。
5. 小结
搜索微信号「顿悟源码」,回复「Tomcat」后,可获取本文测试使用的工程以及 Nginx 和 Tomcat 的配置文件。
猜你喜欢
- 2024-10-09 中小规模网站架构设计:Nginx与HAProxy负载均衡比较
- 2024-09-08 理解Nginx的反向代理与负载均衡(理解nginx的反向代理与负载均衡分析)
- 2024-09-08 架构之路:Nginx与IIS服务器搭建集群实现负载均衡
- 2024-09-08 Linux 下配置nginx到php的连接(linux nginx php)
- 2024-09-08 如何理解Nginx和Tomcat?(nginx和tomcat的关系)
- 2024-09-08 一文看懂nginx如何配置跨域,值得收藏
- 2024-09-08 这样搭建Nginx+Tomcat集群,实现负载均衡及动静分离,太轻松!
- 2024-09-08 通过nginx进行wss和ws协议转换(ftp文件传输协议对应于osi的)
- 2024-09-08 Nginx与安全有关的几个配置(nginx 安全设置)
- 2024-09-08 借助新的OpenSSL兼容性层 Rustls现在可以与Nginx协同工作
你 发表评论:
欢迎- 最近发表
-
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- linux移植(Linux移植freemodbus)
- 独家解读:Win10预览版9879为何无法识别硬盘
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- Docker镜像瘦身(docker 减小镜像大小)
- 在linux上安装ollama(linux安装locale)
- 渗透测试系统Kali推出Docker镜像(kali linux渗透测试技术详解pdf)
- Linux环境中部署Harbor私有镜像仓库
- linux之间传文件命令之Rsync傻瓜式教程
- 解决ollama在linux中安装或升级时,通过国内镜像缩短安装时长
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)