nginx+tomcat7+redis实现session共享(单点redis)

本文主要介绍redis的安装和配置、nginx和tomcat已经写过一篇很详细的文档、请参考:http://francis905.blog.51cto.com/3048056/1716740

实验环境:3台虚拟机(pc1:nginx1.6.3,pc2:tomcat7+redis2.6.13,pc3:tomcat7+redis2.6.13)

实验目的:通过redis实现session的共享

[注]棕色为必须做的 其他作为资料延伸

cd /usr/local/src

tar zxvf redis-2.6.13.tar.gz

cd redis-2.6.13

make PREFIX=/usr/local/redis  install

如果make失败一般是你们系统中gcc还未安装 yum install -y gcc

安装成功后/usr/loca/redis/bin会有这5个文件

[[email protected] redis-2.6.13]# ls /usr/local/redis/bin/

redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server

redis-server:Redis服务器的daemon启动程序

redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作

redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能

redis-check-aof:数据修复

redis-check-dump:检查导出工具

此处、如果不做启动脚本可以直接这样启动:/usr/loca/redis/bin/redis-server

cp /usr/local/src/redis-2.6.13/utils/redis_init_script /etc/init.d/redis//复制启动脚本

[[email protected] redis-2.6.13]# chkconfig --add redis

redis 服务不支持 chkconfig

vim /etc/init.d/redis

..................................................................................

#!/bin/sh

# chkconfig: 2345 80 90   //解决服务不支持chkconfig问题

# Simple Redis init.d script conceived to work on Linux systems

# as it does use of the /proc filesystem.

REDISPORT=6379

EXEC=/usr/local/redis/bin/redis-server//修改路径

CLIEXEC=/usr/local/redis/bin/redis-cli//修改路径

PIDFILE=/var/run/redis_${REDISPORT}.pid

CONF="/etc/redis/${REDISPORT}.conf"

case "$1" in

start)

if [ -f $PIDFILE ]

then

echo "$PIDFILE exists, process is already running or crashed"

else

echo "Starting Redis server..."

$EXEC $CONF &//加入&放在后台执行

fi

;;

stop)

if [ ! -f $PIDFILE ]

then

echo "$PIDFILE does not exist, process is not running"

else

PID=$(cat $PIDFILE)

echo "Stopping ..."

$CLIEXEC -p $REDISPORT shutdown

while [ -x /proc/${PID} ]

do

echo "Waiting for Redis to shutdown ..."

sleep 1

done

echo "Redis stopped"

fi

;;

*)

echo "Please use start or stop as first argument"

;;

esac

..................................................................................

将redis配置文件拷贝到/etc/redis/${REDISPORT}.conf

mkdir /etc/redis

cp /usr/local/src/redis-2.6.13/redis.conf /etc/redis/6379.conf

解析来需要自己定义redis的配置文件

mkdir /usr/local/redis/etc/

mkdir /usr/local/redis/var/

vim  /usr/local/redis/etc/redis.conf

.............................................................

daemonize yes

pidfile /usr/local/redis/var/redis.pid

port 6379

timeout 300

loglevel debug

logfile /usr/local/redis/var/redis.log

databases 16

save 900 1

save 300 10

save 60 10000

rdbcompression yes

dbfilename dump.rdb

dir /usr/local/redis/var/

appendonly no

appendfsync always

.............................................................

启动的时候指定配置文件 /usr/local/redis/bin/redis-server /usr/loca/redis/etc/redis.conf

conf的主要配置参数的意义:

daemonize:是否以后台daemon方式运行

pidfile:pid文件位置

port:监听的端口号

timeout:请求超时时间

loglevel:log信息级别

logfile:log文件位置

databases:开启数据库的数量

save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。

rdbcompression:是否使用压缩

dbfilename:数据快照文件名(只是文件名,不包括目录)

dir:数据快照的保存目录(这个是目录)

appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。

appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

chkconfig --add redis

chkconfig redis on

service redis start

将Redis的命令所在目录添加到系统参数PATH中

vim /etc/profile

export PATH="$PATH:/usr/local/redis/bin"

source /etc/profile

启动redis

/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

关闭redis

redis-cli shutdown

调用redis-cli的命令测试

[[email protected] redis-2.6.13]# redis-cli

redis 127.0.0.1:6379> auth nihao123!   //对用户增加了验证

OK

redis 127.0.0.1:6379> ping

PONG

redis 127.0.0.1:6379> set foo bar

OK

redis 127.0.0.1:6379> get foo

"bar"

redis 127.0.0.1:6379> keys "*"  //看以看到session信息 实验结果可以用这个测试

对Redis增加用户验证2种方法

1、修改配置文件redis.conf

vim /etc/redis/6379.conf

260 requirepass nihao123!    //260指的是行号

service redis stop;start

2、通过config命令可以设置密码以及获取当前用户密码

1.  redis 127.0.0.1:6379[1]> config set requirepass 123456

2. OK

3.  redis 127.0.0.1:6379[1]> config get requirepass

4. 1) "requirepass"

5. 2) "123456"

[注:]设置验证密码之后,redis服务关闭需要密码验证通过之后才能关闭,因此命令修改为:

redis-cli –a 123456 shutdown

PS:截止到2015-05-12前redis是不支持Tomcat8的,详情见官网:https://github.com/jcoleman/tomcat-redis-session-manager

配置Tomcat的conf目录下的context.xml文件:

1> 单点Reids配置

<!--

Jedis save session

-->

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />

<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"

host="localhost"   //填写你要指定做redis服务的IP

port="6379"

database="0"

maxInactiveInterval="60"/>

如图:

2> Sentinel集群配置:

<!-- Sentinel 配置 -->

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />

<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"

maxInactiveInterval="60"

sentinelMaster="mymaster"

sentinels="127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381,127.0.0.1:26382"

/>

#集群配置没验证 后续文档会把这个做上

[注]:从Tomcat6开始默认开启了Session持久化设置,测试时可以关闭本地Session持久化,在Tomcat的conf目录下的context.xml文件中,取消注释下面那段配置即可:

<!-- Uncomment this to disable session persistence across Tomcat restarts -->

<!--

<Manager pathname="" />

-->

redis异常解决:jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set

redis通过属性requirepass 设置访问密码,但没有设置该属性时,客户端向服务端发送AUTH请求,服务端就好返回异常:ERR Client sent AUTH, but no password is set 注释掉redis配置文件requirepass即可。

Tomcat为了方便看到测试结果、从新写一段java代码

vim /usr/local/tomcat7/webapps/Root/index.jsp

.........................................................................

<%@ page language="java" %>

<html>

<head><title>TomcatA</title></head>

<body>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

sessionID:<%=session.getId()%>

<br>

SessionIP:<%=request.getServerName()%>

<br>

SessionPort:<%=request.getServerPort()%>

<%

out.println("This tomcat server is 192.168.3.12");

%>

.........................................................................

#两台tomcat都是如此 、、为了区分  最后的IP地址 自己修改一下

配置nginx反向代理、参考开头部分提到的网址

启动redis、tomcat、nginx

可以看到效果:

时间: 2024-11-05 16:10:20

nginx+tomcat7+redis实现session共享(单点redis)的相关文章

NGINX + TOMCAT7 + MEMCACHED 实现SESSION 共享

TOMCAT7.0+ NGINX + MEMCACHED + memcached-session-manager 实现SESSION共享 http://blog.csdn.net/nerissa/article/details/18961361  ; //参考博客 http://pan.baidu.com/s/1pJlZ0mB    //相关包下载,含lib所需的jar包 环境:centOS 6.5(64位) .jdk8_8u5 .tomcat7.054.nginx1.47.libevent-2

nginx+redis实现session共享 .NET分布式架构

上两篇文件介绍了如何安装和封装redis 本篇主要是记录下怎么实现 nginx+redis实现session共享 目前session问题点 又爱又恨的Session 刚接触程序开发的人一定爱死Session了,因为Session让Http从无状态变成有状态了,页面之间传值.用户相关信息.一些不变的数据.甚至于查出来的DataTable也可以放进去,取值的时候只需要Session[Key]即可,真是方便极了.Session真是个利器,人挡杀人佛挡杀佛,但任何事物被封为利器基本也是双刃剑,Sessi

Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http://www.cnblogs.com/fanshuyao/ 代码美化版或附件下载见:http://fanshuyao.iteye.com/blog/2400975 一.Session共享使用tomcat-cluster-redis-session-manager插件实现 插件地址见:https://g

spring boot + redis 实现session共享

这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下: @Configuration @EnableRedisHttpSession public class RedisSessionConfig { } 而@EnableRedisHttpSession这个注解是由spring-session-data-redis提供的,所以

项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享

因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXin(开源的微信开发SDK)开发的一款微信应用类系统,主要业务是围绕当下流行的微信元素,如:微官网.微商城.微分销.营销活动.会员卡等. 关于RabbitHub详情请戳: .NET 平台下的插件化开发内核(Rabbit Kernel) RabbitHub开源情况及计划 关于Rabbit.WeiXin详

分布式中使用Redis实现Session共享(二)

上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+iis实现负载均衡搭建负载均衡站点了,这里我们会搭建两个站点来验证redis实现的session是否能共享. 阅读目录 Session实现原理 session共享实现方案 问题拓展 总结 回到顶部 Session实现原理 session和cookie是我们做web开发中常用到的两个对象,它们之间会不会

使用 Redis 实现 Session 共享

1    第4-3课:使用 Redis 实现 Session 共享 在微服务架构中,往往由多个微服务共同支撑前端请求,如果涉及到用户状态就需要考虑分布式 Session 管理问题,比如用户登录请求分发在服务器 A,用户购买请求分发到了服务器 B, 那么服务器就必须可以获取到用户的登录信息,否则就会影响正常交易.因此,在分布式架构或微服务架构下,必须保证一个应用服务器上保存 Session 后,其他应用服务器可以同步或共享这个 Session. 目前主流的分布式 Session 管理有两种方案.

springboot+redis实现session共享

1.场景描述 因项目访问压力有点大,需要做负载均衡,但是登录使用的是公司统一提供的单点登录系统,需要做session共享,否则假如在A机器登录成功,在B机器上操作就会存在用户未登录情况. 2. 解决方案 因项目是springboot项目,采用Springboot+Springsession+Redis来实现session共享. 2.1 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId> &

Spring Boot 多站点利用 Redis 实现 Session 共享

如何在不同站点(web服务进程)之间共享会话 Session 呢,原理很简单,就是把这个 Session 独立存储在一个地方,所有的站点都从这个地方读取 Session. 通常我们使用 Redis 来解决这个问题 Spring Boot 2.1.8 Redis 5.0.3 本项目源码 github 下载 本章解决前面文章 Spring Boot 利用 nginx 实现生产环境的伪热更新 产生的session共享问题. 1 Redis 准备 本示例使用 Redis 5.0.3 操作系统为 Mac