zoukankan      html  css  js  c++  java
  • 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集群试验

    2014-08-01 15:10:06本站整理浏览(1432)
     
     

    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的值。

    至此,试验成功!


    由于本人工作比较忙,每次写博客都写的很乱,主要是给自己看。如果大家有什么地方有疑问,或者我写的不对,可以通过评论提出来,我看到后会及时回复,和大家一起交流。

  • 相关阅读:
    1022. 从根到叶的二进制数之和
    140. 单词拆分 II
    1640. 能否连接形成数组
    184. 部门工资最高的员工
    数据显示在视图中
    表单验证
    下拉框选中
    全选/全不选
    全选、全部选、反选、提交
    表单-放大缩小
  • 原文地址:https://www.cnblogs.com/zhengah/p/4626301.html
Copyright © 2011-2022 走看看