注意这几点,轻轻松松配置 Nginx + Tomcat 的集群和负载均衡

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;
          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>

简单描述下工作原理:

  1. nginx 将请求转发给 Tomcat1,请求登录认证,创建会话,生成 Cookie,在响应返回之前,将 Session 信息复制到 Tomcat2
  2. 再次请求时,nginx 将带着会话 Cookie 的请求转发给了 Tomcat2,Tomcat2 发现内部 Session 池中有关联的已认证成功的 Session 对象,不再认证返回请求资源

4. 验证负载均衡和 Session 复制

4.1 测试环境

  1. 使用两台 PC 部署 Tomcat,对应关系是:172.31.1.41-Tomcat1,172.31.1.42-Tomcat2
  2. 部署基于使用 Tomcat 自带的 SessionExample 程序,编写了一个 tomcat-benchmark 的 web 应用
  3. 结合 Tomcat 自带的 Manager 应用,查看已部署应用内部 Session 池

4.2 负载均衡

修改 tomcat-benchmark 部署描述符文件中的 context-param 为 "I'm Tomcat 1/2" 用于区分两个 Tomcat,启动 Nginx 和 Tomcat,在浏览器访问 172.31.1.42:8080 可以看到请求在两个服务器间切换:

req-balance

4.3 Session 复制

为了方便理解,这里先把 Nginx 的负载均衡策略设置成 ip_hash:

  1. 假设 Nginx 始终将请求定位到 Tomcat1 上,然后在 Tomcat1 上创建会话,往会话中添加一些属性
  2. 关闭 Tomcat1 模拟故障,此时 Nginx 会带着之前的会话 Cookie 将请求转发到 Tomcat2,上
  3. 查看 Tomcat2 上是否存在与 Cookie(JSESSIONID) 关联的 Session 信息,若有表示复制成功

整个过程如下:

session-copy

动图正好与上述描述的相反,可以看到 Session 信息从 Tomcat2 复制到了 Tomcat1 中。

5. 小结

搜索微信号「顿悟源码」,回复「Tomcat」后,可获取本文测试使用的工程以及 Nginx 和 Tomcat 的配置文件。

转载于:https://www.cnblogs.com/wskwbog/p/10934546.html

H3C S5000E-X轻轻松松配交换 V2.8 更新说明 《轻轻松松配交换 V2.8》,新增:常用配置1篇(V7交换机基本QINQ配置方法) 2019-1-17 《轻轻松松配交换 V2.7》,新增:常用配置2篇(包含V5交换机和V7交换机Console口安全配置方法) 2019-12-31 《轻轻松松配交换 V2.6》,新增:常用配置2篇(包含V5交换机和V7交换机使用XMODE协议升级软件版本方法) 2019-11-30 《轻轻松松配交换 V2.5》,新增:常用配置2篇(包含V5交换机和V7交换机堆叠后BFD检测配置方法) 2019-10-31 《轻轻松松配交换 V2.4》,新增:常用配置2篇(包含V5交换机和V7交换机VRRP对接配置方法,一篇V5交换机为master,一篇V7交换机为master) 2019-9-31 《轻轻松松配交换 V2.3》,新增:常用配置2篇(包含V5 /V7交换机二层组播命令行配置方法);常用配置2篇(包含V5 /V7交换机二层组播WEB界面配置方法); 2019-8-30 《轻轻松松配交换 V2.2》,新增:常用配置2篇(包含V5 /V7交换机远程端口镜像配置方法); 2019-7-31 《轻轻松松配交换 V2.1》,新增:常用配置2篇(包含V5 /V7交换机策略路由配置方法); 2019-6-30 《轻轻松松配交换 V2.0》,新增:常用配置2篇(包含V5 /V7交换机静态路由、Track与NQA联动); 2019-5-31 《轻轻松松配交换 V1.9》,新增:常用配置2篇(包含V5 V7交换机环路检测配置方法); 2019-4-29 《轻轻松松配交换 V1.8》,新增:常用配置2篇(包含V5 V7交换机NTP服务器、客户端配置方法); 2019-3-31 《轻轻松松配交换 V1.7》,新增:常用配置2篇(包含V5 V7交换机日志主机配置方法); 2019-2-28 《轻轻松松配交换 V1.6》,新增:常用配置2篇(包含V5 V7交换机用户角色切换配置方法); 2019-1-31 《轻轻松松配交换 V1.5》,新增:设备维护2篇(包含V5 V7交换机升级方法方法); 2018-12-31 《轻轻松松配交换 V1.4》,新增:常用配置5篇(包含本地帐号授权命令、NTP服务器/客户端、切换用户角色配置方法); 2018-11-30 《轻轻松松配交换 V1.3》,新增:设备管理2篇(包含V5、V7交换机启动过程Console信息显示说明)、常用配置5篇(包含单向访问、限速,V7交换机用户及角色赋予配置方法); 2018-10-30 《轻轻松松配交换 V1.2》,新增:常用配置10篇:包含V5、V7交换机配置SSH(客户端、服务器)、DHCP 中继、DHCP Snooping方法; 2018-9-30 《轻轻松松配交换 V1.1》,新增:常用配置12篇:包含V5、V7交换机配置IRF2堆叠、配置包过滤(拒绝指定的主机访问网络配置方法、允许指定范围内的主机互相访问配置方法)、OSPF动态路由协议配置方法(OSPF单区域、多区域、OSPF路由引入配置方法); 2018-8-27 《轻轻松松配交换 V1.0》 分为4部分: 1、Comware V5、V7平台交换机分类说明; 2、设备管理: 2.1、V5交换机登录设备方法;包含设备Console、telnet、WEB登录方法; 2.2、V7交换机登录设备方法;包含设备Console、telnet、WEB登录方法; 3、常用配置: 3.1、V5交换机常用配置;包含开启PoE、Combo切换、VLAN划分、DHCP server配置、链路聚合、端口镜像、端口隔离8个功能的命令行和WEB页面配置方法; 3.2、V7交换机常用配置;包含开启PoE、Combo切换、VLAN划分、DHCP server配置、链路聚合、端口镜像、端口隔离8个功能的命令行和WEB页面配置方法; 4、设备维护: 4.1、V5交换机维护;包含Console、telnet、WEB密码忘记处理方法、恢复出厂方法、配置备份方法; 4.2、V7交换机维护;包含Console、telnet、WEB密码忘记处理方法、恢复出厂方法、配置备份方法; 2018-7-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值