Nginx+Tomcat集群配置

Nginx+Tomcat+Memcached集群配置

1       概述

本文以Nginx和部署在本机和虚拟机上的两个Tomcat的集群配置为例来说明集群配置的过程。通过Nginx的反向代理可以加快程序请求响应速度,而且Nginx的负载均衡机制可以减轻服务器负担;由于使用多个Tomcat,需要Session的统一管理。Session统一管理主要有两种方式,我们采用Memcached存储Session实现统一管理。

2       预期读者

本文档的预期读者为软件开发、测试人员、需求分析人员以及项目管理人员等具备一定计算机基础的人员。

3       名称解释

Nginx(“engine x”):一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP 代理服务器。其特点是占有内存少,并发能力强,中国大陆使用nginx网站用户有:新浪网易 腾讯等。

Memcached:一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。

MSM:MSM(memcachedsession manager)是一个用于解决分布式tomcat环境下session共享的问题的开源解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。

反向代理(ReverseProxy):代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

负载均衡Load Balancing其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

黏性(sticky)模式:tomcat session 为 主session, memcached 为备 session。Request请求到来时, 从memcached加载备 session 到 tomcat。Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。

非黏性(non-sticky)模式:tomcat session为中转session,memcached1为主session,memcached 2 为备session。Request请求到来时,从memcached 2加载备 session 到 tomcat,Request请求结束时,将tomcat session更新至 主memcached1和备memcached2,并且清除tomcat session ,以达到主备同步之目的。

4       整体部署架构图

图1 集群整体部署架构

如图,请求首先会经过Nginx,通过Nginx的请求转发机制将请求装发给tomcat1或tomcat2,然后tomcat从memcached中取session,若没有则创建session,在请求结束时,将session更新至memcached1和memcached2,并清除tomcat session。

5       集群环境的安装部署

集群环境的安装部署包括Nginx安装、两个Tomcat(我使用的是Tomcat7.0)的安装部署以及两个Memcached的安装、MSM所需要的JAR包的引入。

通过在主机和虚拟机中各部署一个Tomcat和一个Memcached来模拟两台机器,实现分布式的服务器。

5.1  Nginx的安装部署

解压附件中的nginx-1.7.3.zip(nginx-1.7.3版本是最新稳定版),解压路径可自定义。

直接双击nginx.exe即可启动服务,可以在任务管理器中停止服务。

5.2  Tomcat的安装部署

将Tomcat7安装介质解压,一个放在本机上,一个拷贝一份放到虚拟机上,修改setclasspath.bat文件中的Java_home为对应的JDK根目录。然后修改conf下的server.xml文件:

修改“<Server port="6005" shutdown="SHUTDOWN">”、“<Connectorport="6060" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="6443"/>”和“<Connector port="6009"  protocol="AJP/1.3"  redirectPort="6443"/>”中的端口号,保证不与本机上的tomcat端口重复即可(例如可全部加1),主机和虚拟机上的都要修改,二者端口可以相同。

然后在“<Engine name="Catalina"defaultHost="localhost">”中添加“jvmRoute”属性,本机上的值设为jvmRoute="tomcat1",虚拟机上的值设为tomcat2,用以区分访问的是哪个服务器。

5.3  Memcached以及MSM的安装部署

Memcached服务直接解压即可,里边有一个可执行文件,在命令行中进入此文件目录,执行下面的命令将其添加到系统服务中:“memcached.exe -d install”,添加成功后继续执行“memcached.exe -p 11211 -d start”即可启动Memcached服务,监听的端口为11211,同样在虚拟机中也添加Memcached服务。

MSM是一个开源的session共享解决方案利用 Value(Tomcat 阀)对Request进行跟踪。Request请求到来时,从memcached加载session,Request请求结束时,将tomcat session更新至memcached,以达到session共享之目的。要使用MSM,需要在tomcat中引入所需jar包,解压附件中的memjar.rar,将解压得到的所有jar包放到tomcat的lib下即可,我为了方便与lib下的其它jar包区分,将其放在了sp目录下。所需Jar包如下:

6       集群配置

6.1  NginX的相关配置

要将Nginx作为两个tomcat的前端反向代理服务器,需要在nginx.conf(在conf目录下)中进行相关配置。

在http {…}—>server{…}—>location / {…}中加入如下内容(代理相关设置,如连接超时时间等):

proxy_pass                   http://backserver;

proxy_redirect          off;

proxy_next_upstream     error timeout invalid_header http_500;

proxy_connect_timeout   2;

proxy_set_header        Host            $host;

       proxy_set_header        X-Real-IP       $remote_addr;

       proxy_set_header        X-Forwarded-For$proxy_add_x_forwarded_for;

然后在http {…}中加入以下内容(设定负载均衡的服务器列表):

upstreambackserver {

ip_hash;

              server 127.0.0.1:6061;

              server 192.168.56.128:6061;

       }

注意:“192.168.56.128”是我的虚拟机的ip地址,两个tomcat的端口号我都设为6061。该内容最好放在http {…}中server{…}的上边,否则请求分发容易出错。server{…}下可以设置Nginx监听端口,默认为80,若80端口被占用,需要修改端口。

6.2  两个Tomcat中的配置

找到Tomcat安装目录下的conf下的context.xml文件,在<Context>标签中加入如下配置(MSM相关参数的设置):

<Manager 

       className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 

       memcachedNodes="n1:127.0.0.1:11211,n2:192.168.56.128:11211"

       sticky="false" 

       sessionBackupAsync="false" 

       lockingMode="uriPattern:/path1|/path2" 

       requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 

       transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

关键要注意memcachedNodes节点的配置,这个属性必须包含你所有运行的memcached节点。每个节点的定义格式为<id>:<host>:<port>,多个之间用空格或半角逗号隔开。sticky="false"设置使用非黏性模式。transcoderFactoryClass:此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。

本机和虚拟机上的两个tomcat都要这样配置,虚拟机上n1,n2节点IP要修改,n1改为主机IP,n2改为localhost。

7       集群测试

7.1  NginX反向代理测试

将测试web项目Demo部署到两个tomcat的webapps目录下。然后启动两个tomcat,登录进入测试页面。

我在页面上增加了一段输出sessionId信息的代码,用来表征该sessionId是访问哪个Tomcat创建的,同时也能知道session是从哪个Memcached取得的,打印的sessionId如下:

SESSION_ID:4F87CB142DA09147E4A9EB8D45F48001-n2.tomcat1

可以看出,当前访问的是tomcat1,我们关掉tomcat1,看看是否能转到tomcat2访问,如果可以而且速度比较快,说明Nginx反向代理配置成功,请自行测试。

7.2  Memcached的Session存储机制测试

MSM 是通过类似客户端的方式管理session存储的,当有新的请求到来时,在session manager中将session存储到两个Memcached中,但是取的时候只会从一个中取,没取到再去另一个中找。如果关掉当前session所在的Memcached,仍然可以从另一个中获得session。

如果请求到来时只启动了Memcached1,那么即使之后又启动了Memcached2,session也不会从Memcached1中同步到Memcached2中,这是因为session manager是通过请求来触发session同步的。

测试效果如下,n1为Memcached1的id,n2为Memcached2的id:

SESSION_ID:4F87CB142DA09147E4A9EB8D45F48001-n2.tomcat1

开启两个Memcached

关掉Memcached2,刷新页面:

SESSION_ID:4F87CB142DA09147E4A9EB8D45F48001-n1.tomcat1

关掉Memcached2

可以看到session还是同一个,只不过变成了从Memcached1中取得。

我们再启动Memcached2,然后停止Memcached1,可以看到又返回登陆页了,说明session丢失。验证了上面说的session同步机制。

8       附件说明

附件包括Nginx服务、Memcached服务、MSM所需jar包、相关配置文件。

附件下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值