/ 中存储网

使用Nginx+memcached+tomcat配置负载均衡集群和session共享

2014-01-10 11:53:01 来源:itjs.cn

配置环境:

windows xp下

jdk1.7.0_10      nginx-1.2.6  (附下载)      memcached-1.2.6-win32-bin.zip (附下载)    tomcat7.0.12

*(注意:nginx负载均衡不会有太大问题,但是,在用memcached配置session共享的时候,tomcat的版本可能成为关系到成败的关键,

一开始用的tomcat7.0.34,总是抛出异常,原因应该是没有匹配最新tomcat的memcached 的jar包)

1、首先用nginx来搭建三台tomcat服务器的负载均衡环境,如何在一台机器启动三个tomcat请参照《在一台机器上启动三个tomcat》

我的tomcat的端口分别是8081,8082,8083

解压下载的nginx压缩包,我的路径是D:MyServer;

在D:MyServernginx-1.2.6conf 下找到 nginx.conf,该文件为nginx的请求分发配置文件,打开nginx.conf做如下修改:

(1)在http {…} - server{…} - location / {…}中加入一行:“proxy_pass  http://127.0.0.1;”

修改后如下:   

         location / {

root   html;

index  index.html index.htm;

proxy_pass    http://127.0.0.1;

}

(2)在http {…}中加入以下代码:

       #设定负载均衡的服务器列表

       upstream 127.0.0.1 {

#weigth参数表示权值,权值越高被分配到的几率越大

server 127.0.0.1:8081 weight=1;

server 127.0.0.1:8082 weight=2;

          server 127.0.0.1:8082 weight=3;

}

可以进行请求分发的简单测试,

启动nginx,打开cmd,进入到 D:MyServernginx-1.2.6 路径下 输入nginx 敲回车,调度处任务管理器看到进程里面有nginx则表示启动成功

启动三台tomcat

用eclipse新建一个web项目cluster,该项目下新建一个clustertest.jsp文件,编辑该文件内容如下:

<%@ page contentType="text/html; charset=UTF-8" %>

<%@ page import="java.util.*" %>

<html><head><title>Cluster Test</title></head>

<body>

<%

  //HttpSession session = request.getSession(true);

  System.out.println(session.getId());

  out.println("<br> SESSION ID:" + session.getId()+"<br>");

  // 如果有新的请求,则添加session属性

  String name = request.getParameter("name");

  if (name != null && name.length() > 0) {

String value = request.getParameter("value");

session.setAttribute(name, value);

  }

out.print("<b>Session List:</b>");

Enumeration<String> names = session.getAttributeNames();

while (names.hasMoreElements()) {

String sname = names.nextElement();

String value = session.getAttribute(sname).toString();

out.println( sname + " = " + value+"<br>");

System.out.println( sname + " = " + value);

   }

%>

</body>

</html>

修改tomcatconfserver.xml 

 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7-1">

对应的另外两台tomcat分别是

    tomcat7-2

    tomcat7-3

将cluster项目打包成war包分别放到每个tomcat的webapps下

在浏览器中输入localhost:8080/cluster/clustertest.jsp 重复刷新可以看到输出的session值在变化说明分发处理成功

2、使用memcached来实现三个tomcat共享session

解压一开始下载好的memcached压缩包到指定路径,我的是D:MyServer (解压就得到一个memcached.exe文件)

下载如下jar包,点击下载spymemcached-2.7.3.jar

其他jar包可以从如下链接找到:http://code.google.com/p/memcached-session-manager/downloads/list

*(注意本次测试用的tomcat7,所以对应的jar包是memcached-session-manager-tc7-1.6.3.jar ,

如果使用的是tomcat6 则下载memcached-session-manager-tc6-1.6.3.jar)

好了,把上述jar包放到tomcat/lib 目录下,然后在测试的项目中也导入上述jar包,修改每个tomcat的配置文件tomcatconfcontext.xml

在<context>...</context>标签之间加入如下代码:

  <Manager

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

memcachedNodes="n1:127.0.0.1:11211"

sticky="false"

sessionBackupAsync="false"

lockingMode="uriPattern:/path1|/path2"

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

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

  />

关闭所有tomcat,打开cmd 进入memcached解压到的路径D:MyServer 输入:memcached.exe –d install 回车安装windows服务

输入:memcached.exe –p 11211 –d start 回车启动memcached服务,启动三个tomcat

在浏览器中输入localhost:8080/cluster/clustertest.jsp  重复刷新发现session的值不变如下所示,session共享成功

SESSION ID:76AC7C56C4B278ADFDEC6EA782192D15-n1.tomcat7-1