千锋扣丁学堂Linux培训之如何轻松配置Nginx+Tomcat的集群和负载均衡

2019-06-13 13:50:21 198浏览

今天千锋扣丁学堂Linux培训老师给大家分享一篇关于如何轻松配置Nginx+Tomcat的集群和负载均衡的详细介绍,首先Tomcat集群是当单台服务器达到性能瓶颈,通过横向扩展的方式提高整体系统性能的有效手段。Nginx是一个高性能的HTTP和反向代理web服务器,可以通过简单的配置实现Tomcat集群的负载均衡。本文使用的Tomcat是8.5.35版本,Nginx是1.14.2版本。



1.概述

对于Web应用来说,集群最大的问题就是Session信息的共享,一般有以下解决方法:

使用粘性会话,比如,使用IPHash的负载均衡策略,将当前用户的请求都集中到一台服务器上;缺点是单点故障,会话丢失

使用Session复制,使用Tomcat自带的Session复制策略,将会话信息同步到集群的各个节点;缺点是消耗更多内存和带宽,适用于小型集群

使用第三方缓存中间件缓存整个集群会话信息,比如Redis缓存,可由应用程序控制与Session的关联,也可以适配Tomcat

当然了,也可以把会话信息存到共享文件系统或者数据库

在配置Nginx的过程中,可能会遇到以下问题:

配置upstream名称时不能使用下划线,比如tomcat_ha,否则Tomcat会抛出Thecharacter[_]isnevervalidinadomainname的异常

在windows上杀掉所有的nginx.exe进程,taskkill/fi"imagenameeqnginx.exe"/f

在windows上有个pid为4的系统进程会占用80端口,所以这里将nginx改为了8000

在配置Tomcat集群的过程中,需要注意的问题:

确保web.xml配置了元素

确保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集群配置

启用集群配置,在元素中添加以下配置:

<!-- 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'mTomcat1/2"用于区分两个Tomcat,启动Nginx和Tomcat,在浏览器访问172.31.1.42:8000可以看到请求在两个服务器间切换:

4.3Session复制

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

假设Nginx始终将请求定位到Tomcat1上,然后在Tomcat1上创建会话,往会话中添加一些属性

关闭Tomcat1模拟故障,此时Nginx会带着之前的会话Cookie将请求转发到Tomcat2,上

查看Tomcat2上是否存在与Cookie(JSESSIONID)关联的Session信息,若有表示复制成功

整个过程如下:

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

以上就是关于千锋扣丁学堂Linux培训之如何轻松配置Nginx+Tomcat的集群和负载均衡的全部内容,最后想要了解更多关于Linux方面内容的小伙伴,请关注扣丁学堂Linux培训官网、微信等平台,扣丁学堂IT职业在线学习教育平台为您提供权威的Linux开发视频,Linux培训后的前景无限,行业薪资和未来的发展会越来越好的,扣丁学堂老师精心推出的Linux在线教程定能让你快速掌握Linux从入门到精通开发实战技能。扣丁学堂Linux技术交流群:422345477。


扣丁学堂微信公众号                          Python全栈开发爬虫人工智能机器学习数据分析免费公开课直播间


      【关注微信公众号获取更多学习资料】         【扫码进入Python全栈开发免费公开课】



查看更多关于“Linux培训资讯”的相关文章>>

标签: Linux培训 Linux视频教程 红帽Linux视频 Linux学习视频 Linux入门视频

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号