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

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

1.概述html

对于Web应用来讲,集群最大的问题就是Session信息的共享,通常有如下解决方法:nginx

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

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

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

固然了,也能够把会话信息存到共享文件系统或者数据库windows

在配置Nginx的过程当中,可能会遇到如下问题:浏览器

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

在windows上杀掉全部的nginx.exe进程,taskkill/fi"imagenameeqnginx.exe"/ftomcat

在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从入门到精通开发实战技能。

相关文章
相关标签/搜索