开发者社区> 科技探索者> 正文

nginx+tomcat+redis实现session共享

简介:
+关注继续查看

Redis与Memcached的区别:

内存利用率:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached

性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。

 

Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用

Redis支持数据的备份,即master-slave模式的数据备份。

Redis不仅仅支持简单的key-Value类型的数据,同时还提供listsetzsethash数据结构的存储。


部署准备:

Nginx           192.168.1.11

Tomcat1       192.168.1.12

Tomcat2         192.168.1.13

Redis           192.168.1.14

以下环境都必须要关闭防火墙和SElinux安全机制

service iptables stop

setenforce 0

1.安装部署nginx

yum -y install zlib-devel pcre-devel openssl-devel  //安装依赖包

tar xf nginx-1.6.2.tar.gz

tar xf nginx-1.6.2.tar.gz

cd nginx-1.6.2

./configure &&make && make install

cd

ln -s/usr/local/nginx/sbin/nginx /usr/local/sbin/

修改配置文件以实现对tomcat负载均衡

vim /usr/local/nginx/conf/nginx.conf

在原配置基础上添加以下红色部分:

upstream backend {

    server 192.168.1.12:8080 weight=1max_fails=1 fail_timeout=10s;

    server 192.168.1.13:8080 weight=1max_fails=1 fail_timeout=10s;

}

    server {

        listen       80;

        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {

            root   html;

            index  index.html index.htm;

            proxy_pass http://backend;

        }

保存退出,使用nginx –t 检查配置是否正确,确认无误启动nginx

nginx

Nginx部署完毕

2.安装部署tomcat1

为了避免系统的open-jdk环境与新安装jdk环境冲突,我们需要卸载open-jdk 可以不做,直接使用系统自带的JAVA环境也没有影响

rpm -e java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64 --nodeps

rpm -e java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64 --nodeps

rpm -e java-1.7.0-openjdk-devel-1.7.0.45-2.4.3.3.el6.x86_64 --nodeps

rpm -e java-1.6.0-openjdk-devel-1.6.0.0-1.66.1.13.0.el6.x86_64 --nodeps

1)解压jdk

tar xf jdk-7u65-linux-x64.gz

mv jdk1.7.0_65 /usr/local/java

2)配置环境变量

vim /etc/profile.d/java.sh  #添加以下内容

export JAVA_HOME=/usr/local/java  #设置java的根目录

export PATH=$PATH:$JAVA_HOME/bin

3)生效脚本

source /etc/profile.d/java.sh

安装

tar xf apache-tomcat-7.0.54.tar.gz

mv apache-tomcat-7.0.54 /usr/local/tomcat

tomcat需要调用redisjar包放入tomcat/lib

cp tomcat-redis-session-manage-tomcat7.jar tomcat-juli.jar commons-logging-1.1.3.jarcommons-pool2-2.2.jar jedis-2.5.2.jar /usr/local/tomcat/lib

修改context.xml文件以支持调用redis

vim /usr/local/tomcat/conf/context.xml

Context段中加入以下内容

<Context>

<ValveclassName="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/>

        <ManagerclassName="com.orangefunction.tomcat.redissessions.RedisSessionManager" 

host="192.168.1.14"   //redisIP地址

port="6379"         //redis的端口

database="0" 

maxInactiveInterval="60"/>

</Context>

修改server.xml文件以支持调取创建的测试页

vim /usr/local/tomcat/conf/server.xml

126行加入以下内容:

126  <Context docBase="/web/webapp"path="" reloadable="false" >

127              </Context>

创建测试页:

mkdir -p /web/webapp

cd /web/webapp/

vim index.jsp

 

Session ID:<%=session.getId() %><BR>

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

<%out.println("This tomcat server 192.168.1.12");%>

启动tomcat

/usr/local/tomcat7/bin/startup.sh

[root@centos5 nginx]#netstat -anpt |grep 8080

tcp        0 0 :::8080           :::*                        LISTEN      48726/java 

 

3.tomcat2的安装部署

tomcat1相同,唯一区别就是为区分测试效果tomcat2的测试页面为:

mkdir -p /web/webapp

cd /web/webapp/

vim index.jsp

 

Session ID:<%=session.getId() %><BR>

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

<%out.println("This tomcat server 192.168.1.13");%>

4.安装部署redis

tar xf redis-3.2.5.tar.gz

cd redis-3.2.5

make

这里如果报错,tclsh8.5: not found 发现少了tcl 报错 
  
解决方法:下载,安装tcl

#wgethttp://downloads.sourceforge.net/tcl/tcl8.5.9-src.tar.gz

#cd /tcl8.5.9-src/unix

#./configure

#make

#make install

接着make && make install 就没报错了

mkdir -p /usr/local/redis/bin

mkdir -p /usr/local/redis/etc

mkdir -p /usr/local/redis/var

cd src/

src目录下这些文件作用如下
    redis-server
Redis服务器的daemon启动程序
    redis-cli
Redis命令行操作工具.你也可以用telnet根据其纯文本协议来操作
    redis-benchmark
Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能.
    redis-stat
Redis状态检测工具,可以检测Redis当前状态参数及延迟状况

cp redis-benchmark  redis-check-aof redis-cli redis-server  /usr/local/redis/bin/

cp ../redis.conf  /usr/local/redis/etc

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

修改配置文件

daemonize no  改为 daemonize yes  //是否把redis-server启动在后台,默认是。若改成yes,会生成一个pid文件

bind 127.0.0.1          改为 bind 0.0.0.0   //任意主机都可访问

其他的看需要修改

关闭redis

killall -9 redis-server

启动redis

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

查看是否启动:

netstat -anpt |grep redis

tcp        0     0 0.0.0.0:6379               0.0.0.0:*                   LISTEN      46390/redis-server

监控redis共享session

redis-cli -p 6379  monitor

5.测试

在客户端访问http://192.168.1.11,刷新后会轮流出现以下页面:

wKioL1l1o2vhWaoMAADeH1s6Nwk083.png

测试页面IP地址发生变化,而session ID不变

可以查看redis主机监控,会出现以下页面:

wKioL1l1o_TRgVC6AAF6ah9sRi4294.png

至此nginx+2 tomcat+redis实现session共享成功

 

使用keepalived来实现redis主从高可用

接上面的实验,下面使用keepalived来实现redis主从高可用

部署准备

添加一台Redis2服务器

Nginx                   192.168.1.11

Tomcat1              192.168.1.12

Tomcat2              192.168.1.13

Redis1                   192.168.1.14

Redis2                   192.168.1.15

关闭防火墙和SElinux安全机制

service iptables stop

setenforce 0

部署redis

Redis2上安装部署redis2

安装过程与redis1相同

修改redis2上的redis.conf

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

daemonize no          改为 daemonize yes

bind 127.0.0.1          改为 bind 0.0.0.0

slaveof 192.168.1.146379    //去掉此行注释,并改为redis1ip地址和端口号

然后启动redis2

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

测试redis1redis2数据是否能够同步

redis1上写入数据:

[root@localhost ~]#/usr/local/redis/bin/redis-cli -h 192.168.1.14

192.168.1.14:6379> setname zhangsan

OK

192.168.1.14:6379> getname

"zhangsan"

redis2上查看:

[root@localhost src]#/usr/local/redis/bin/redis-cli -h 192.168.1.15

192.168.1.15:6379> getname

"zhangsan"

此时两台redis服务器之间数据能够同步

安装keepalived

redis1上安装keepalived

直接使用yum方式安装即可:

yum -y install keepalived

chkconfig keepalived --add

chkconfig keepalived on

修改配置文件:

vim /etc/keepalived/keepalived.conf

 

! Configuration File forkeepalived

 

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

 

vrrp_script redis {

        script /opt/chk_redis.sh

        interval 2

        weight -10

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

}

track_script {

        redis

        }

    virtual_ipaddress {

        192.168.1.10

    }

}

redis2上安装keepalived

yum -y install keepalived

chkconfig keepalived --add

chkconfig keepalived on

 

vim /etc/keepalived/keepalived.conf

 

! Configuration File forkeepalived

 

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

 

vrrp_script redis {

        script /opt/chk_redis.sh

        interval 2

        weight -10

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

}

track_script {

        redis

        }

    virtual_ipaddress {

        192.168.1.10

    }

}

分别在redis1redis2上部署redis健康检测脚本

两台redis做相同操作:

vim /opt/chk_redis.sh

 

#!/bin/bash

# check redis serverst="/usr/local/nginx/sbin/nginx"

REDIS="/usr/local/redis/bin/redis-server/usr/local/redis/etc/redis.conf"

redispid=$(ps -Credis-server --no-header |wc -l)

if [ $redispid -eq 0];then

$REDIS

sleep 3

redispid=$(ps -Credis-server --no-header |wc -l)

if [ $redispid -eq 0];then

/etc/init.d/keepalivedstop

echo "Keepalivedstopped ,please check your redis !"|tee -a /var/log/messages

fi

fi

启动keepalived

service keepalived start

分别修改tomcat1tomcat2context.xml以支持VIP

在两台tomcat上做相同操作:

vim /usr/local/tomcat/conf/context.xml

host="192.168.1.14"  改为 host="192.168.1.10"

重启tomcat服务:

/usr/local/tomcat/bin/shutdown.sh

/usr/local/tomcat/bin/startup.sh

测试

关闭redis1keepalivedredis服务(注意一定要先关闭keepalived,否则redis会再次重启,影响测试效果

/etc/init.d/keepalivedstop

killall -9 redis-server

然后使用客户端访问http://192.168.1.1,出现以下页面:

wKioL1l1o96ilgFMAABpGmiZ-wI727.png

至此nginx + 2tomcat + 2redis(主从)部署完毕

本文转自lyndon博客51CTO博客,原文链接http://blog.51cto.com/lyndon/1950481如需转载请自行联系原作者


迟到的栋子

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
24783 0
bboss session共享时序列化存储jasperreports报表对象JasperPrint方法
bboss session共享时序列化存储jasperreports报表对象JasperPrint方法bboss session共享组件使用方法介绍 由于JasperPrint对象有点特殊,序列化存储到session时,必须采用java自带的序列化机来序列化和还原JasperPrint对象,否则bboss序列化机制无法实现对原始JasperPrint对象的序列化。
814 0
Spring Boot 使用 Spring Session 集成 Redis 实现Session共享
Spring Boot 使用 Spring Session 集成 Redis 实现Session共享 《Spring Boot 2.0极简教程》—— 基于 Gradle + Kotlin的企业级应用开发最佳实践 通常在web开发中,Session 会话管理是很重要的一部分,用于存储与用户相关的一些数据。
4061 0
bboss session共享架构及特点
bboss会话共享架构 bboss session共享特点 作    用:为应用提供统一会话管理功能,避免集群部署场景下负载切换session丢失问题; 跨域跨应用共享会话并实现SSO功能;解决了会话共享五大技术难题:session数据序列 化问题,session sticking问题,跨域跨应用session共享问题,跨容器 (tomcat,jetty,weblogic)共享session问题,sso单点登入单点登出一致性问题。
1125 0
又双叒叕来session共享
之前写过两篇springboot分布式中的session共享解决方案,参考《springboot中redis的使用和分布式session共享问题》和 《再谈session共享》 经过同事共同研究,原来springboot提供另外一种解决方案:0行代码解决方案 配置文件 spring.session.redis.namespace=自己定义的命名空间 spring.session.store-type=redis 是的,只需要这两行即可,不再需要其他配置或者代码实现,测试方法见上面两篇文章。
1428 0
springboot中redis的使用和分布式session共享问题
本文旨在解决分布式系统的session如何共享问题,大致思路:session放入redis。其他解决方案:持久化、放cache等都可以,但是自从有了redis,这完全可以变的简简单单。
1128 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
17981 0
5488
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载