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包、相关配置文件。