nginx+tomcat9+memcached-session-manager会话共享
nginx+tomcat9+memcached-session-manager会话共享
环境搭建
代理服务器:外网地址:10.0.0.5 内网地址:172.16.1.5
tomcat服务器:外网地址:10.0.0.10 内网地址:172.16.1.10
memcache服务器:外网地址:10.0.0.21 内网地址:172.16.1.21
第一个里程:nginx服务安装
http://1a7f2dd7.wiz03.com/share/s/0qvOTn10-AEH29_zxM18oPGG1QICGl14RkIx2GujYl2NuYca
第二个里程:安装memcache服务,并启动memcahed服务
yum -y install memcached
systemctl start memcatched
第三个里程:安装jdk与tomcat服务
下载JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
在/etc/profile中添加
tar xf jdk-8u201-linux-x64.tar.gz
mv jdk1.8.0_201/ /application/
ln -s jdk1.8.0_201/ /application/jdk
编辑/etc/profile文件,进行添加
export JAVA_HOME=/application/jdk
export PATH=$PATH:$JAVA_HOME/bin;
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
java -version
下载tomcat软件
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.17/bin/apache-tomcat-9.0.17.tar.gz
tar xf apache-tomcat-9.0.17.tar.gz
创建多个实例
cp -a apache-tomcat-9.0.17 /application/tomcat9
cp -a apache-tomcat-9.0.17 /application/tomcat9_1
cd /application/
第四个里程:修改index.jsp页面,修改tomcat的端口信息
<html>
<body>
<center>
<%= request.getSession().getId() %>
<h1>10.0.0.10</h1>
<h1>port:8081</h1>
<h1>this is Tomcat-node1 ! </h1>
</center>
</body>
</html>
<%@ 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 201 !"); %>
#修改tomcat端口
sed -i 's#8005#8006#;s#8080#8081#';s#8009#8010# tomcat9/conf/server.xml
sed -i 's#8005#8007#;s#8080#8082#;s#8009#8011#g' tomcat9_1/conf/server.xml
#启动tomcat服务
/application/tomcat9/bin/startup.sh
/application/tomcat9_1/bin/startup.sh
第五个里程:修改nginx服务器的配置文件,启动nginx服务
[root@lb01 ~]# cat /application/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream jsp {
server 10.0.0.10:8081;
server 10.0.0.10:8082;
}
server {
listen 10.0.0.5:80;
server_name jsp.etiantian.org;
location / {
proxy_pass http://jsp;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
/application/nginx/sbin/nginx
第六个里程:下载memcached-session-manager依赖包jar包(这里使用的是kryo序列化,如里使用其它方式需要下载相对的jar包)
官方文档:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
memcached-session-manager-tc9-2.3.2.jar下载地址:http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager
spymemcached-2.12.3.jar下载地址:http://repo1.maven.org/maven2/net/spy/spymemcached/
msm-kryo-serializer-2.3.2.jar下载地址: http://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/
kryo-serializers-0.45.jar下载地址:http://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/
kryo-4.0.2.jar下载地址:http://repo1.maven.org/maven2/com/esotericsoftware/kryo/
minlog-1.3.1.jar下载地址:http://repo1.maven.org/maven2/com/esotericsoftware/minlog/
reflectasm-1.11.9.jar下载地址:http://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/
asm-7.1.jar下载地址:http://repo1.maven.org/maven2/org/ow2/asm/asm/
objenesis-3.0.1.jar下载地址:http://repo1.maven.org/maven2/org/objenesis/objenesis/
memcached-session-manager-2.3.2.jar下载地址:http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/
特别注意:
memcached-session-manager-tc9-2.3.2.jar中的tc8为tomcat的版本号。
一定要注意:不同版本号的tomcat,对应的msm包也不同。此处为tomcat9的jar包。
接下来进行序列化tomcat配置,序列化tomcat配置的方法有很多种:
java默认序列化tomcat配置、javolution序列化tomcat配置、xstream序列化tomcat配置、flexjson序列化tomcat配置和kryo序列化tomcat配置。
官网介绍说 使用kryo序列化tomcat的效率最高,所以这里只介绍kryo序列化。
第七个里程:将下载好的jar包复制到tomcat下面的lib下(如有多个实例都需要进行相同的操作)
cp ./* /application/tomcat9/lib/
cp ./* /application/tomcat9_1/lib/
第八个里程:修改tomcat/conf下面的context.xml配置文件(在No-Stick模式和Stick模式下context.xml文件配置也有所不同,一般用的是No-Stick模式)
#No-Stick模式
[root@java01 application]# vim tomcat9/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
<!--此处是填写memcahed服务器地址,如有多个用逗号分开 -->
memcachedNodes="n1:172.16.1.21:11211"
lockingMode="auto"
sticky="false"
sessionBackupAsync="false"
sessionBackupTimeout= "1000"
copyCollectionsForSerialization="true"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
在第一个实例中配置好后,复制到另一个实例相同的路径下即可
#Stick模式
故障转移配置节点(failoverNodes),不能使用在Non-Sticky模式,多个使用空格或逗号分开,配置某个节点为备份节点。
当其他节点都不可用时才会存储到备份节点,适用于sticky模式(即一台tomcat,多台memcached)。
[root@java01 application]# vim tomcat9/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.1.21:11211,n2:172.16.1.22:11211" #多个memcached之间用空格或逗号隔开都可以的
sticky="true"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|swf|flv)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
copyCollectionsForSerialization="true"
/>
Manager 各参数说明:
memcachedNodes 必选项,memcached的节点信息,多个memcached节点,中间需要使用空格
failoverNodes="n2" 表示当前session保持到n1的memcached节点上
failoverNodes 可选项,不能使用在non-sticky sessions模式。故障转移配置节点,多个使用空格或逗号分开,配置某个节点为备份节点,
当其他节点都不可用时才会存储到备份节点,官方建议配置为和tomcat同服务器的节点。
理由如下:
假如有两台服务器m1,m2,其中m1部署tomcat和memcached节点n1,m2部署memcached节点n2。
如果配置tomcat的failoverNodes值为n2或者不配置,则当服务器m1挂掉后n1和tomcat中保存的session会丢失,而n2中未保存或者只保存了部分session,
这就造成 部分用户状态丢失。
如果配置tomcat的failoverNodes值为n1,则当m1挂掉后因为n2中保存了所有的session,所以重启tomcat的时候用户状态不会丢失。
为什么n2中保存了所有的session? 因为failoverNodes配置的值是n1,只有当n2节点不可用时才会把session存储到n1,所以这个时候n1中是没有保存任何session的。
lockingMode 可选值,默认none,只对non-sticky有效。
requestUriIgnorePattern 可选值,制定忽略那些请求的session操作,一般制定静态资源如css,js一类的。
sessionBackupAsync 可选值,默认true,是否异步的方式存储到memcached。
sessionBackupTimeout 可选项,默认100毫秒,异步存储session的超时时间。
第九个里程:重启tomcat服务
pkill java
/application/tomcat9/bin/startup.sh
/application/tomcat9_1/bin/startup.sh
第十个里程:访问jsp.etiantian.org,按ctrl+F5强刷页面,发现session信息会变,但是sessionid不会改变!说明session实现了共享! 如下,表示当前sessionid保存到了n1这个memcached节点上了