在工作中,为了响应高并发,经常会在Tomcat前面挡一层 Nginx,用 Nginx 来转发请求,这种情况下,我们会在 Nginx 后面放置好多 Tomcat,这就是所谓的集群,示意图如下。本文只是简单的搭建一个Nginx+Tomcat的集群框架。 在搭建框架之前,我们先了解一下,什么是反向代理?什么是负载均衡?
当我们有一个服务器集群,并且服务器集群中的每台服务器的内容一样的时候,此时,我们想要直接从个人电脑访问到服务器集群中服务器的时候是无法访问的,必须要通过第三方服务器才能访问集群。
这个时候,我们可以通过第三方服务器访问服务器集群的内容,但是我们并不知道是集群中的哪一台服务器提供的内容,此种代理方式称为反向代理
负载均衡公司会建立很多的服务器,这些服务器组成了服务器集群。当用户访问网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入选择的服务器。
所以,用户每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
一句话:Nginx会给你分配集群中服务器压力小的那一个去访问
环境工具 :两个Tomcat + 一个Nginx启动两个Tomcat和Nginx
在浏览器中输入:http://192.168.1.102 页面如下:
不断刷新,会看到两个tomcat的index.jsp页面会重复出现,如下页面:
上面页面交替出现的频率是由在Nginx的配置文件中设置的weight有关。
2018.7.30补充:负载均衡的策略负载均衡架构图: 负载均衡策略 3 种方式: (1)、Nginx 提供轮询(round robin) (2)、用户IP哈希(client IP) (3)、指定权重
Session是Tomcat服务器上的内存空间,如果一个用户发出多个请求,却发到了多个tomcat服务器中,那么就会出现Session不同步的问题。
解决方案1:
将一个用户的请求锁定到某一台服务器上,简单,但是缺乏容错性,一旦某个服务器发生故障,Session可能丢失,
(但是服务器发生故障是一个低概率事件,如果一个服务器经常挂掉,要么是硬件有问题,要么是应用有问题),
可以使用用户IP哈希实现。
解决方案2:
Session复制策略,基于网络的广播策略,一个节点Session变化,其他节点同步复制,具有容错性,
但节点多或复制量大时对网络负荷大,使网络效率低下,甚至阻塞:
(1)、 在/conf/server.xml文件中开启Session复制的选项,将注释去掉,7.0默认值以配置好,
需要接收器绑定内网(一般服务器都有两块网卡)网卡地址,修改端口>。
(2)、在应用中指定应用是在分布式部署之下,在web.xml中添加选项
解决方案3:
额外创建一个共享的空间用来存放Session,所有服务器共享一个Session
memcached缓存共享方案基本原理粘性Session与非粘性Session方式:(需要一些工具jar包,官网有目录和下载连接 在/conf/context.xml中进行配置,全局有效)
(1)、传递Session需要实体类序列化支持,实现可序列化接口,设置版本号 (2)、获取用户IP地址方法的变化,获取真实客户端ip而不是Nginx代理地址 (3)、动静分离结构的预规划, 一般高并发的网站上,资源类的文件,如js,css,图片通常是由静态服务器处理,Nginx处理静态文件效率就非常高,而Tomcat处理静态文件是它很大的一个弱势,tomcat只负责动态请求的处理。那么编码的时候就要考虑静态资源最后可能要被拿出去,地址会有变化,所以在开发的时候应该规划访问地址,保持最大灵活性。