nginx+tomcat+redis实现session共享

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

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如需转载请自行联系原作者


迟到的栋子

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
缓存 前端开发 JavaScript
tomcat核心技术+Nginx性能调优技术
而Tomcat的基本配置,每个配置项也基本上对应了Tomcat的组件结构,如果要用一张图来形象展现一下Tomcat组成的话
37 1
|
2月前
|
Java 应用服务中间件 Apache
简介Nginx,Tomcat和 Apache
简介Nginx,Tomcat和 Apache
简介Nginx,Tomcat和 Apache
|
3月前
|
缓存 NoSQL 应用服务中间件
2.2.2 redis,memcached,nginx网络组件
2.2.2 redis,memcached,nginx网络组件
|
3月前
|
NoSQL Java 应用服务中间件
4.网络设计与redis、memcached、nginx组件(二)
4.网络设计与redis、memcached、nginx组件(二)
28 0
|
3月前
|
存储 NoSQL 应用服务中间件
4.网络设计与redis、memcached、nginx组件(一)
4.网络设计与redis、memcached、nginx组件(一)
76 0
|
3月前
|
负载均衡 应用服务中间件 nginx
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
34 0
|
3月前
|
负载均衡 安全 前端开发
百度搜索:蓝易云【Nginx与Tomcat负载均衡-动静分离教程】
这些是将Nginx与Tomcat结合使用实现负载均衡和动静分离的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
48 1
|
1月前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
206 0
|
1月前
|
NoSQL Java 应用服务中间件
使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包
使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包
使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包
|
1月前
|
存储 NoSQL 前端开发
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题

热门文章

最新文章