tomcat+nginx+redis集群试验
Nginx负载平衡 + Tomcat + 会话存储Redis配置要点
使用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现0当机的7x24 运营效果。因为将会话存储在Redis中,因此Nginx就不必配置成stick粘粘某个Tomcat方式,这样才能真正实现后台多个Tomcat负载平 衡,用户请求能够发往任何一个tomcat主机,当我们需要部署新应用代码时,只要停止任何一台tomcat,所有当前在线用户都会导向到运行中的 tomcat实例,因为会话数据被序列化到Redis,在线用户不会受到影响,一旦停掉的tomcat实例上线,另外其他重复部署过程。
Nginx
首先,我们安装Nginx:
$ sudo rpm -ivh nginx-1.4.2-1.el6.ngx.x86_64.rpm
编辑/etc/nginx/nginx.conf,加入负载平衡配置:
http {
upstream tomcat {
server localhost:8080;
server localhost:8081;
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
更新/etc/nginx/conf.d/default.conf,用下面location配置替代原来:
location / {
proxy_pass http://tomcat;
}
重新启动Nginx:
sudo service nginx restart
Tomcat实例
下面我们开始安装两个Tomcat实例,改变第二个服务器端口,防止它们冲突,这时如果你在浏览器输入 https://localhost,我们访问到缺省的Tomcat页面,因为我们没有设置会话粘粘sticky sessions,每个请求分发使用负载平衡round robin算法,也就是意味着每次请求都会创建一个新的会话,通过tomcat内建案例可以方便看到这种行为,进入http://localhost/examples/servlets/servlet/SessionExample,过一会儿刷新一下这个页面,注意到每次Session ID都会改变,让我们来解决这个问题。
下载安装Redis,在http://redis.io/download 有文档说明如何安装和启动,启动服务器以后,使用客户端程序检查是否正在工作。
最后,我们需要配置Tomcat存储会话到Redis,我们需要使用 tomcat-redis-session-manager开源库包,具体需要一些调整,下载这个项目的源码项目,重新构建,本文使用版本为commons-pool2-2.2.jar 和 jedis-2.6.1.jar.复制这些Jar到tomcat的lib目录。
将你的commons-pool, jedis 更新版本和tomcat版本在tomcat-redis-session-manager的build.gradle中配置一下,然后重新构 建项目,将构建结果 tomcat-redis-session-manager-1.2.jar 复制到tomcat lib目录下,两个实例都要复制,在tomcat的context.xml中配置:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60" />
重新启动tomcat一切完成,你现在可以看到tomcat会话存储在redis中,使用先前tomcat内置案例,试验两个tomcat开机和关机不同情况进行测试,会话数据都不会受到影响。
tomcat+nginx+redis集群试验
tomcat+nginx+redis集群试验,有需要的朋友可以参考下。
redis的安装不说了
只说处理session的问题。
首先要下载三个包:tomcat-redis-session-manager.jar and
jedis-2.0.0.jar,和commons-pool-1.6.jar,最开始用的包是commons-pool-2点多的,但是不是启动
tomcat的时候报错,说找不到org.apache.commons.pool什么什么类,然后我把commons-pool-2点多的那个jar包
解压后看到它的包名是org.apache.commons.pool2,所以才会发生上述的错误,因此我就换成了commons-pool-
1.6.jar。然后启动成功。
然后在tomcat的conf/server.xml中的Host节点中配置如下:
<Context path="" docBase="/usr/local/tomcat/webapps/web" debug="0" reloadable="true">
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60"
/>
</Context>
本来是照着官网https://github.com/jcoleman/tomcat-redis-session-manager,这个上面配置的,但是报错,xml解析错误,把注释去掉就好了。
nginx安装之前的博客中有,下面说一下配置:
在http节点中,添加如下:
upstream myproject {
<span style="white-space:pre"> </span>#这个是配置后端的tomcat,我是在本地启动了两个tomcat,一个端口为8080,一个为8081
server localhost:8080;
server localhost:8081;
<span style="white-space:pre"> </span>#下面这三行可以注释掉,这是因为之前用nginx配置根据jvm进行负载均衡
# server localhost:8080 srun_id:jvm1;
# server localhost:8081 srun_id:jvm2;
# jvm_route $cookie_JSESSIONID|sessionid reverse;
}
在location节点下配置:
location / {
# root html;
# index index.html index.htm;
add_header Cache-Control 'no-store';
client_max_body_size 100m;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_cache Z;
proxy_cache_valid 200 1m;
<span style="white-space:pre"> </span>#重要的是这里,这里的Myproject和上面的那段配置中的myproject名字一样就可以了,非常简单
proxy_pass http://myproject;
}
两个tomcat,端口设为不一样的,然后每个tomcat里面部署一个项目,当然项目非常简单,tomcat1里面有一个index.jsp,一个test.jsp,tomcat2里面有一个index.jsp
tomcat1中的index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body> SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<%
out.println("This is Tomcat Server 111111锛.);
%> <%=(String)session.getAttribute("user")%>
</body>
</html>
tomcat1中的test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<%
session.setAttribute("user","12345");
%> test session;
</body>
</html>
tomcat2中的index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<%
out.println("This is Tomcat Server 222222锛.);
%> <%=(String)session.getAttribute("user")%>
</body>
</html>
两个tomcat的server.xml都需要配置,两个tomcat都需要把那三个包放在tomcat目录的lib目录下面。完了之后就可以分别启动两个tomcat了。
然后进nginx的bin目录下,直接./nginx启动nginx
然后运行http://YourIP/,
会发现基本上是tomcat1-tomcat2-tomcat1-tomcat2,进每个server的频率基本一致。然
后运行http://YourIP/test.jsp,页面出来之后再运行http://YourIP/,可以看到每个tomcat的index.jsp
页面都打印出来了user的值。
至此,试验成功!
由于本人工作比较忙,每次写博客都写的很乱,主要是给自己看。如果大家有什么地方有疑问,或者我写的不对,可以通过评论提出来,我看到后会及时回复,和大家一起交流。
tomcat+nginx+redis集群试验的更多相关文章
- tomcat+nginx+redis集群搭建并解决session共享问题。
1 集群搭建 https://www.cnblogs.com/yjq520/p/7685941.html 2 session共享 https://blog.csdn.net/tuesdayma/art ...
- Nginx+Tomcat+Memcached 实现集群部署时Session共享
Nginx+Tomcat+Memcached 实现集群部署时Session共享 一.简介 我们系统经常要保存用户登录信息,有Cookie和Session机制,Cookie客户端保存用户信息,Sessi ...
- tomcat+nginx+redis实现均衡负载、session共享(一)
在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新.但这可能会出现一些状况: 1.用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一) ...
- 【转载】tomcat+nginx+redis实现均衡负载、session共享(一)
http://www.cnblogs.com/zhrxidian/p/5432886.html 在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新.但这可能会出现一 ...
- (转)tomcat+nginx+redis实现均衡负载、session共享(一)
在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新.但这可能会出现一些状况: 1.用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一) ...
- Spring-Session实现Session共享Redis集群方式配置教程
循序渐进,由易到难,这样才更有乐趣! 概述 本篇开始继续上一篇的内容基础上进行,本篇主要介绍Spring-Session实现配置使用Redis集群,会有两种配置方式,一种是Redis-Cluster, ...
- 05.haproxy+mysql负载均衡 整合 redis集群+ssm
本篇重点讲解haproxy+mysql负载均衡,搭建完成后与之前搭建的redis+ssm进行整合 (注:这里用到了两台mysql数据库,分别安装两台虚拟机上,已经成功实现主主复制,如果有需要,请查看我 ...
- Redis集群架构
Redis集群概述 集群的核心意义只有一个:保证一个节点出现了问题之后,其他的节点可以继续提供服务使用. Redis基础部分讲解过主从配置:对于主从配置可以有两类:一主二从,层级关系.开发者一主二从是 ...
- redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用
目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...
随机推荐
- hdu 4747 Mex( 线段树? 不,区间处理就行(dp?))
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- 【bfs+优先队列】POJ2312-Battle City
[思路] 题目中的“可以沿直线发射打破砖墙”可能会迷惑到很多人,实际上可以等价理解为“通过砖墙的时间为2个单位”,这样题目就迎刃而解了.第一次碰到时可能不能很好把握,第二次基本就可以当作水题了. [错 ...
- [NOIp2016提高组]天天爱跑步
题目大意: 有一棵n个点的树,每个点上有一个摄像头会在第w[i]秒拍照. 有m个人再树上跑,第i个人沿着s[i]到t[i]的路径跑,每秒钟跑一条边. 跑到t[i]的下一秒,人就会消失. 问每个摄像头会 ...
- Problem F: 加密程序2
#include<stdio.h> int main() { int i; ]; while(gets(a)!=NULL) { ;a[i]!='\0';i++) if('A'<=a[ ...
- Educational Codeforces Round 9 E. Thief in a Shop dp fft
E. Thief in a Shop 题目连接: http://www.codeforces.com/contest/632/problem/E Description A thief made hi ...
- PHP 自定义字符串中的变量名解析
PHP 自定义字符串中的变量名解析 这样一个需求:页面的 title 可以在后台自定义,自定义内容中可能包含变量,变量用 {$var} 表示, 其中 $var 为变量名 将 title 字段存入数 ...
- 莫名其妙的float:left; 不能使元素紧贴父级的坑
这是项目中遇到的一个CSS的坑,做个记录,主要的原因还是浮动后脱离文档流,两个浮动的元素处于同一文档流中会相互影响位置的问题: 先上代码吧: 效果预览地址:浮动不能靠左的情况; 原本红色模块应该处于蓝 ...
- iOS-Runtime、对象模型、消息转发
Objective-C只是在C语言层面上加了些关键字和语法.真正让Objective-C如此强大的是它的运行时.它很小但却很强大.它的核心是消息分发. Message 执行一个方法,有些语言.编译器会 ...
- Unity3d-Socket之龙一编年史network.dll分析(1)
今天闲着无聊,看到群里的老大共享了反编译的工具,就下载下来玩下. 说道反编译我个人不太推崇反编译,感觉不道德,毕竟是人家的代码,但是又回想一下,我们拿代码看是抱着学习的态度又有何不可,所谓既是民族的也 ...
- ExtJS初学笔记---Ext.Msg.alert无效果
最近开始学ExtJS,书上的第一个例子是: 1 2 3 Ext.onReady(function(){ Ext.Msg.alert('Hello.', 'Hello'); }); 这个是Ext ...