Nginx+Memcached+Tomcat session会话共享实战

来源:互联网 发布:胜利足彩欧赔数据库 编辑:程序博客网 时间:2024/06/11 09:46

服务器说明:

192.168.1.8 tomcat1 memcached(虚拟机1)

192.168.1.9 tomcat2(虚拟机2)

192.168.1.200 nginx (本机)


对于tomcat+nginx的配置请参考博客:【Nginx-反向代理服务器】实践篇(三)之Tomcat+Nginx搭建集群


接下来我们来安装memcached,注意linux系统的用户权限问题


1.分别把memcached和libevent下载回来,放到/usr/src目录下:

         # cd /usr/src
# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz




2.先安装libevent:

         # tar zxvf libevent-1.2.tar.gz
# cd libevent-1.2
# ./configure –prefix=/usr
# make
# make install


3.测试libevent是否安装成功:

          # ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a
-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3

4.安装memcached,同时需要安装中指定libevent的安装位置:

         # cd /tmp
# tar zxvf memcached-1.2.0.tar.gz
# cd memcached-1.2.0
# ./configure –with-libevent=/usr
# make
# make install
如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
安装完成后会把memcached放到 /usr/local/bin/memcached 


5.测试是否成功安装memcached:

        # ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached
-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug




6.启动memcache


       useradd   memcache   #添加memcache用户

        memcached -m 64 -d -u memcache -p 11211 -l 192.168.1.8 -c 5000 -P /tmp/memcached.pid

  或者 memcached -m 64 -d -u root -p 11211 -l 192.168.1.8 -c 5000 -P /tmp/memcached.pid




注:再次启动时报了一个端口已占用,则kill掉memcache进程,然后二次启动时才成功。





tomcat还需要额外配置如下:


tomcat 连接memcache session会话共享配置:session存储到192.168.1.8:11211 memcache里面。


vi  /usr/local/tomcat/conf/context.xml #将下面配置复制到<Context> 和 </Context>之间

两台主机做同样的配置

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"        memcachedNodes="node1:192.168.1.8:11211"                requestUriIgnorePattern=".*/.(png|gif|jpg|css|js)$"                        sticky="false"                                storageKeyPrefix="context"                                        lockingMode="uriPattern:/path1|/path2"                                                sessionBackupAsync="false"                                                        sessionBackupTimeout="100"                                                                copyCollectionsForSerialization="false"                                                                        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/> 


说明:


这里的memcachedNodes是填写memcached节点,多个节点时可以以空隔分开,如: 
 n1:localhost:11211 n2:localhost:11212     /localhost改为安装memcached的服务器的IP
sessionBackupTimeout的单位为分钟


当然配置完成后需要添加相应的jar包,将如下jar包分别放在两台tomcat的lib目录下即可。




修改后重启两个TOMCAT和nginx即可,这个时候已经解决SESSION的共享问题

启动tomcat,并打印log,及时查看问题






测试Nginx和Tomcat


  测试Nginx是否实现负载均衡已经Tomcat能否共享session信息,分别在两个Tomcat服务器的\webapps\ROOT目录下新建两个test.jsp页面,内容如下:


Tomcat1

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>SessionID:<%=session.getId()%> <BR> SessionIP:<%=request.getServerName()%> <BR> SessionPort:<%=request.getServerPort()%> <% out.println("This is Tomcat Server 1111111"); %> 

Tomcat2

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>SessionID:<%=session.getId()%> <BR> SessionIP:<%=request.getServerName()%> <BR> SessionPort:<%=request.getServerPort()%> <% out.println("This is Tomcat Server 2222222"); %>


通过浏览器访问Nginx服务器,如下图将访问地址改成Nginx所在服务器。

反复刷新浏览器,如果SessionID一直不变,下面的SessionPort的内容在不断变化则说明配置成功。


测试结果如下:



刷新浏览器



再打开火狐浏览器看结果




刷新火狐浏览器






附:

1,当session未实现共享时,两台tomcat服务器权重比为1:1

效果:刷新浏览器,每次的sessionid均不同


原因:当浏览器首次访问时,创建session,然后将sessionid存放到浏览器的cookie中,当浏览器再次刷新或者访问其他页面时,本地有sessionid,但是此时的请求被分发到另一台服务器上,本地带过去的sessionid在新的服务器上并找不到对应的session,故重新产生session。so 每次刷新都是不同的sessionid,session无法共享。


2,当session实现共享时,两台tomcat服务器权重比为1:1

效果:刷新浏览器,每次的sessionid不变,但是打印的This is tomcat server 值会变


原因:当浏览器首次访问时,创建session,并将sessionId存到浏览器中,那么当用户再刷新浏览器或者访问其他页面时,我们客户端的请求会带上sessionid,然后我们通过sessionid去查找session,此时无论请求分发到哪个服务器上面,我们均可以找到session,因为我们将session存储到memcached服务器上了,故session不会重新创建,也就session共享了。


附所需jar包下载





4 0
原创粉丝点击