Nginx+Tomcat+Memcached 实现集群部署时Session共享

一.简介

我们系统经常要保存用户登录信息,有Cookie和Session机制,Cookie客户端保存用户信息,Session在服务端保存用户信息,如果浏览器不支持Cookie或者用户把Cookie禁掉了,Cookie就用不了,还有不同的浏览器采用不用方式保存Cookie,所以我们采用Session服务端来保存,上一节我们有介绍了Tomcat集群部署,怎么样集群的Tomcat对同个用户请求的都能获取保存在Session的用户信息,采用了Memcached管理Session,Memcached 是一个高性能的分布式内存对象缓存系统,接下来我们介绍Nginx+Tomcat+Memcached实现Session共享。

二.Tomcat、Nginx、Memcached配置

第一步:Memcached的安装部署Memcached部署 这查看这篇文章

第二步:Nginx的安装 Nginx的安装部署 这查看这篇文章

第三步:Tomcat和JDK的安装和环境配置 Tomcat和JDK的安装部署 这查看这篇文章

三.实现

我们采用Memcached管理Session,主要是memcached-session-manager开源tomcat插件改变Tomcat原始的Session存储机制,将session的存储放到分布式缓存Memcached中,从而实现对Session的共享。

  第一步:我们在Apache-tomcat-8081和Apache-tomcat-8082 下的ROOT实现一个index.jsp,如下代码所示:

     Apache-tomcat-8081的index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> hello apache-tomcat-8081 index.jsp sessionId:<%=session.getId()%>
<BR>
sessionIp:<%=request.getServerName()%>
<BR>
sessionPort:<%=request.getServerPort()%>
</body>
</html>

Apache-tomcat-8082的index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> hello apache-tomcat-8082 index.jsp sessionId:<%=session.getId()%>
<BR>
sessionIp:<%=request.getServerName()%>
<BR>
sessionPort:<%=request.getServerPort()%>
</body>
</html>

第二步:启动Memcached服务

#/opt/bin/memcached -d -m 5 -u root -l 192.168.74.129 -p 12000 -c 256 -P /tmp/memcached.pid ,如图所示:

第三步:Nginx作为了代理服务器,客服端请求服务器端时,采用了负载均衡来处理,这样就能平均的把客服端请求分发到每一天服务器,这样减少服务器端的压力。实现动静态分离,配置Nginx下的nginx.conf文件。

#vi /usr/local/nginx/conf/nginx.conf

<span style="color:#333333;">#user  nobody;
worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid; events {
use epoll;
worker_connections 1024;
} http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
</span><span style="color:#ff0000;">upstream localhost_server {
ip_hash;
server 192.168.74.129:8081;
server 192.168.74.129:8082;
}</span><span style="color:#333333;"> server {
listen 80 default;
server_name localhost;
</span><span style="color:#ff0000;"> location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ //由nginx处理静态页面</span><span style="color:#333333;">
{
root /usr/tomcat/apache-tomcat-8081/webapps/ROOT;
expires 30d; //缓存到客户端30天
}
error_page 404 /404.html; #redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
</span><span style="color:#ff6666;"> location ~ \.(jsp|do)$ {//所有jsp的动态请求都交给Tomcat处理 </span><span style="color:#333333;">
</span><span style="color:#c0c0c0;">proxy_pass http://localhost_server; //来自jsp或者do的后缀的请求交给tomcat处理</span><span style="color:#333333;">
proxy_redirect off;
proxy_set_header Host $host; //后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; //允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; //缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 90; //nginx跟后端服务器连接超时时间
proxy_read_timeout 90; //连接成功后,后端服务器响应时间
proxy_buffer_size 4k; //设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 6 32k; //proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k;//高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; //设定缓存文件夹大小,大于这个值,将从upstream服务器传
} } }</span>

第四步:修改了Apache-tomcat-8081和Apache-tomcat-8082下的conf/context.xml 文件,修改session的存储方式。

在<Context></Context>标签里加入

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="<span style="color:#ff0000;">n1:192.168.74.129:12000</span>" sessionBackupAsync="false" sessionBackupTimeout="100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"/>  

说明:

1.requestUriIgnorePatter:过滤图片等静态文件去触发Session备份到Memcached。

2.sessionBackupAsync:指定Session是否应该被异步保存到Memcached中。

3.backupThreadCount :用来异步保存Session的线程数。

4.sessionBackupTimeout :默认100毫秒,操作超过时间那么保存失败。

第五步:  要引入memcached-session-manager所需要的jar包

如果在tomcat/lib下没引入时,会报找不到对应的类,如图所示:

需要的jar

memcached-session-manager-1.6.3.jar

javolution-5.5.1.jar

spymemcached-2.7.1.jar

memcached-session-manager-tc6-1.6.3.jar

msm-javolution-serializer-1.6.3.jar

msm-xstream-serializer-1.6.3.jar

到这里下载 所需JAR

1.这边需要注意的是,我们那时引入这个memcached-2.6.jar包,而不是映入spymemcached-2.7.1.jar时会报这个错误,如图所示:

2.memcached-session-manager-tc6-1.6.3.jar这个包时针对tomcat6

第六步:启动Nginx、Tomcat服务

1.启动Tomcat

#./bin/startup.sh;tail -f ./logs/catalina.out,这边可以查看到修改保存session的方式,并查看是否配置正确,如图所示:

2.启动Nginx

#cd /usr/local/nginx

#sbin/nginx

第七步:访问index.jsp

1.我们先试一下不通过Nginx反向代理,我们直接访问tomcat是否能访问jsp,并测试我们所写的JSP是否正确,并sessionId能正常显示,如图所示:

2.我们访问Nginx反向代理,我们部署了Apache-tomcat-8081和Apache-tomcat-8082两个集群,我们查看一下是否能共用一个session,我们在页面打印出来,看sessionId是否一样?

请求地址都是192.168.74.129/index.jsp,我们多刷几次,页面的端口就会改变,我们查看调用Apache-tomcat-8081的index.jsp与调用Apache-tomcat-8082的index.jsp的sessionId会不会改变,如图所示:

Apache-tomcat-8081的index.jsp并显示SessionId

Apache-tomcat-8082的index.jsp并显示SessionId

这时发现调用Apache-tomcat-8081的index.jsp与调用Apache-tomcat-8082的index.jsp的SessionId一样,说明共用同一个session。

Nginx+Tomcat+Memcached 实现集群部署时Session共享的更多相关文章

  1. Apache + Tomcat + mod_jk实现集群服务及session共享

    实现效果:用apache 分发请求到tomcat中的对应的项目 原理:

  2. 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享

    今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...

  3. nginx+tomcat+redis的集群+session共享

    nginx+tomcat+redis的集群+session共享 环境准备 1.tomcat版本:tomcat7 tomcat下载及安装,目前很多好的资源和步骤,此处省略. 2.jdk版本:jdk1.7 ...

  4. 使用Redis存储Nginx+Tomcat负载均衡集群的Session

    配置Tomcat的session共享可以有三种解决方案: 第一种是以负载均衡服务器本身提供的session共享策略,每种服务期的配置是不一样的并且nginx本身是没有的. 第二种是利用web容器本身的 ...

  5. Tomcat集群环境下session共享方案 通过memcached 方法实现

    对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...

  6. 同主机下Docker+nginx+tomcat负载均衡集群搭建

    想用Docker模拟一下nginx+tomcat集群部署,今天折腾了一天,遇坑无数,终于在午夜即将到来之际将整个流程走通,借本文希望给同样遇到类似问题的小伙伴们留点线索. 主机环境是CentOS 7, ...

  7. Nginx+Tomcat+Redis实现集群搭建

    背景: 最近几天一直在琢磨Nginx反向代理以及使用Redis保存session,因为本人对java开发比较熟悉,所以在闲暇之余将公司的一个系统在虚拟机上搭建一个集群.特此总结过程. 一.需要使用的一 ...

  8. 面试系列32 集群部署时的分布式session如何实现

    session是啥?浏览器有个cookie,在一段时间内这个cookie都存在,然后每次发请求过来都带上一个特殊的jsessionid cookie,就根据这个东西,在服务端可以维护一个对应的sess ...

  9. 大厂面试题:集群部署时的分布式 session 如何实现?

    面试官心理分析 面试官问了你一堆 dubbo 是怎么玩儿的,你会玩儿 dubbo 就可以把单块系统弄成分布式系统,然后分布式之后接踵而来的就是一堆问题,最大的问题就是分布式事务.接口幂等性.分布式锁, ...

随机推荐

  1. 平台升级至nginx+Tomcat9.0.1(Spring5.0.1+velocity2.0+quartz-2.3.0)+redis集群

    在公司部份应用上 使用了 Tomcat9.0.1 稳定性还可以,由于将公司的集群服务也升级为 Tomcat9.0.1,下面我们来谈一下改变: 1:logging.properties 支持日志最大天数 ...

  2. 设置Images.xcassets后启动仍旧黑屏的问题

    换了XCode6之后,发现以前写Icon-76.png这样很麻烦,就使用了Image.xcassets,公司所有测试机跑了一下,发现没什么问题.唯独有一台设置有问题,iphone5 ios6.0系统, ...

  3. 让手机连接到指定的WIFI网络,适用于之前已经连过的网络

    这个例子是从网上找的,我给重新优化了下.这里有个问题是只能连接到之前已经连接过的wifi,目前还没找到连接到陌生wifi(有/无密码)的方法.总之慢慢来吧~ 说下思路: 1.通过wifiManager ...

  4. Spring常用表单验证注解

    下面是主要的验证注解及说明: 注解 适用的数据类型 说明 @AssertFalse Boolean, boolean 验证注解的元素值是false @AssertTrue Boolean, boole ...

  5. Orchard 前台权限与自定义权限

    一:关于前台权限 1:只允许自己看到 首先,我们需要确定在 Role 设置页面,用户所对应的 View Page by others 和 View all content 未被选中.备注,我们首先和得 ...

  6. 多目标进化算法(MOEA)概述

    Weighted Sum Approach 该方法给出的表达式为: 首先,λ被称之为权重向量,观察和式,这完全就是m维向量的点乘公式嘛.具体的说,在目标空间中,把算法求出的一个目标点和原点相连构造成一 ...

  7. http协议报头详解HTTP协议结构

    http协议 请求报文和响应报文都是由以下4部分组成 1.请求行 2.请求头 3.空行 4.消息主体 下图为http请求的报文结构 下图为http响应报文结构 请求行 格式为: Method Requ ...

  8. Maven 入门指南

    为什么要用 Maven? Maven 主要帮助用户完成以下 3 个方面的工作: 生命周期管理,便捷的构建过程: 依赖管理,方便引入所需依赖 Jar 包: 仓库管理,提供统一管理所有 Jar 包的工具: ...

  9. 【大数据】下载Windows版本的Redis 转

    https://www.cnblogs.com/tommy-huang/p/6093813.html 下载Windows版本的Redis   1.打开官网http://redis.io/点击Downl ...

  10. Linq-Contains查询

    customers.Where(c => c.Name.Contains("john"));