tomcat session 共享

时间:2024-04-15 00:05:03

1. nginx+tomcat7+memcached

安装JDK7
sudo apt-get install java7-jdk

安装tomcat7
Tomcat7下载地址
http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-7/v7.0.34/bin/

找到apache-tomcat-7.0.34.tar.gz
解压 sudo tar xvzf apache-tomcat-7.0.34.tar.gz
移动tomcat sudo mv apache-tomcat-7.0.34 /data/game-web/

启动tomcat
/data/game-web/apache-tomcat-7.0.34/bin/startup.sh
查看是否正常启动,tomcat 端口默认为 8080

关闭tomcat
/data/game-web/apache-tomcat-7.0.34/bin/ shutdown.sh

Tomcat7必须增加java包,下载地址:
http://memcached-session-manager.googlecode.com/files/memcached-session-manager-tc7-1.6.1.jar
http://memcached-session-manager.googlecode.com/files/memcached-session-manager-1.6.1.jar
http://spymemcached.googlecode.com/files/spymemcached-2.8.0.jar

下载好后复制到/data/game-web/apache-tomcat-7.0.34/lib 目录下

修改/data/game-web/apache-tomcat-7.0.34/ server.xml 文件找到Engine标签修改如下内容
<Engine name="Catalina" defaultHost="localhost">

修改
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

每一个 t omcat 的jvmRoute名都不同

修改/data/game-web/apache-tomcat-7.0.34/context.xml 文件找到Context 标签增加如下内容

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="node1:localhost:11211"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sticky="false"
sessionBackupAsync="false" />

或者修改/data/game-web/apache-tomcat-7.0.34/server.xml 文件在Host标签增加如下内容
<Context path="" docBase="/web/url" reloadable="true" crossContext="true" >

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="node1:192.168.130.101:11211"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sticky="false"
sessionBackupAsync="false"
/>
</ Context>

Manager标签属性说明:

className此属性是必须的。

memcachedNodes此属性是必须的。这个属性必须包含你所有运行的memcached节点。每个节点的定义格式为<id>:<host>:<port>。多个之间用空格或半角逗号隔开(如:memcachedNodes="n1:localhost:11211,n2:localhost:11212")。如果你设置单个memcache节点<id>是可选的,所以它允许设置为<host>:<port>(memcachedNodes="localhost:11211")。

failoverNodes可选项,属性只能用在非粘连Session机制中。此属性必须包含memcached节点的Id,此节点是Tomcat作为备份使用。多个之间用空格或逗号隔开

memcachedProtocol可选项,默认为text。出属性指明memcached使用的存储协议。只支持text或者binary。

sticky 可选项,默认为true。
指定使用粘性的还是非粘性的Session机制。

lockingMode 可选项, 此属性只对非粘性Session有用,默认为none。
指定非粘性Session的锁定策略。他的只有
(1)、none:从来不加锁
(2)、all: 当请求时对Session锁定,直到请求结束
(3)、auto:对只读的request不加锁,对非只读的request加锁
(4)、uriPattern:<regexp>: 使用正则表达式来比较requestRUI + "?" + queryString来决定是否加锁,

requestUriIgnorePattern 可选项

此属性是那些不能改备份Session的请求的正则表达式。如果像css,javascript,图片等静态文件被同一个Tomcat和同一个应用上下文来提供,这些请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要触发Session备份。所以那些静态文件没必要触发Session备份,你就可以使用此属性定义。此属性必须符合java regex正则规范。

sessionBackupAsync 可选项,默认true
指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout设置的过期时间起作用。

backupThreadCount 可选项,默认为CPU内核数。用来异步保存Session的线程数(如果sessionBackupAsync="true")。

sessionBackupTimeout 可选项,默认100,单位毫秒
设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync="false"是起作用。默认100毫秒

sessionAttributeFilter 可选项 从1.5.0版本有此属性是用来控制Session中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如

sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"属性保存到Memcached中。依赖于选择的序列化策略。

transcoderFactoryClass 可选,默认为
de.javakaffee.web.msm.JavaSerializationTranscoderFactory 此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。例如其他的有效的实现在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer.

copyCollectionsForSerialization 可选项,默认false。

customConverter 可选项

enableStatistics 可选项,默认true用来指定是否进行统计。

enabled 可选项,默认true指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session。

安装nginx
sudo apt-get install nginx

修改 nginx.conf 文件
找到http {},在http{}增加以下内容

upstream monitor.zqgame.com {
ip_hash; #同一个客户IP的请求分配给同一个后台服务器
server 192.168.120.17:80 ;#应用 1
server 192.168.120.16:80 ;#应用2

}
# monitor.zqgame.com 为拦截的域名
server {
server_name monitor.zqgame.com;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://monitor.zqgame.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /log/nginx/monitor.zqgame.com_access.log access;
}

测试:
结果就是,seesion ID会随着每次用户的提交而变换节点,但ID不变。
例如:
JSESSIONID=CFC1ACAC6B0B8C27BEA76919F3A99BF8-node1.jvm1
CFC1ACAC6B0B8C27BEA76919F3A99BF8为session会话id
node1为memcache 的id
jvm1为 jvmRoute 的值

后台打印日志
/data/game-web/apache-tomcat-7.0.34/conf/logging.properties 文件中添加de.javakaffee.web.msm.level=FINE , 就可以在
catalina.out 的日志中看到详细的session 存取情况