今天千锋扣丁学堂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从入门到精通开发实战技能。