nginx + tomcat + memcache 实现会话保持

关于tomcat

Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。
Tomcat是一个轻量级应用服务器。
java程序写的网站用tomcat+jdk来运行。
tomcat是一个中间件,真正起作用的,解析java脚本的是jdk。
jdk(java development kit)是整个java的核心,它包含了java运行环境和一堆java相关的工具以及java基础库。
最主流的jdk为sun公司发布的jdk,除此之外,其实IBM公司也有发布JDK,CentOS上也可以用yum安装openjdk。

这里写图片描述

环境:
server6  172.25.44.6   nginx调取器,Tomcat客户端,memcached服务器  
server1  172.25.44.1   tomcat 客户端,memcached 服务器

#

#搭建Java环境
[root@server6 ~]# nginx   #打开nginx
[root@server6 ~]# /etc/init.d/php-fpm start  
        Starting php-fpm  done
[root@server6 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
[root@server6 ~]# cd /usr/local/
[root@server6 local]# ln -s jdk1.7.0_79/  java
[root@server6 local]# vim /etc/profile  
        export JAVA_HOME=/usr/local/java  #设置JAVA的根目录
        export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
        export PATH=$PATH:$JAVA_HOME/bin
[root@server6 local]# source /etc/profile  #将java.sh脚本导入到环境变量,使其生效
[root@server6 local]# echo  $PATH   #在控制台显示PATH环境变量的值,即查看PATH在系统中的路径
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/lnmp/local/mysql/bin:/usr/local/lnmp/nginx/sbin:/usr/local/lnmp/php/bin:/usr/local/java/bin
[root@server6 local]# echo $CLASSPATH
.:/usr/local/java/lib:/usr/local/java/jre/lib
[root@server6 local]# which java
/usr/local/java/bin/java
[root@server6 local]# cd
[root@server6 ~]# vim test.java              ^
        public class test
        {
                public static void main(String[] args)
                {
                        system.out.println("Hello world!");
                }
        }
[root@server6 ~]# javac test.java   #检测语法错误
[root@server6 ~]# java test   #执行脚本
            Hello World!



#安装配置Tomcat
[root@server6 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@server6 ~]# cd /usr/local/
[root@server6 local]# ln -s apache-tomcat-7.0.37/  tomcat
[root@server6 local]# cd tomcat/
[root@server6 tomcat]# bin/startup.sh  #启动tomcat
        Using CATALINA_BASE:   /usr/local/tomcat
        Using CATALINA_HOME:   /usr/local/tomcat
        Using CATALINA_TMPDIR: /usr/local/tomcat/temp
        Using JRE_HOME:        /usr/local/java
        Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
        Tomcat started.
[root@server6 tomcat]# cd logs/
[root@server6 logs]# cat catalina.out    #看有没有成功启动的日志
[root@server6 tomcat]# cd webapps/ROOT/
[root@server6 ROOT]# vim test.jsp   #编写test.jsp脚本

        Serve2  The time is: <%=new java.util.Date() %>

[root@server6 ROOT]# cd /usr/local/lnmp/nginx/
[root@server6 nginx]# vim conf/nginx.conf
         43         location / {
         44             root   html;
         46             index  index.php index.html index.htm;
         47         }

        #反向代理
         60        location ~ \.jsp$ {
         61            proxy_pass   http://127.0.0.1:8080;
         62        }

[root@server6 nginx]# nginx -s reload
#启动成功后打开浏览器输入http://IP:8080 显示以下界面说明tomcat已经配置启动成功。

这里写图片描述

#显示显示test.jsp脚本界面

这里写图片描述

#显示index.jsp脚本界面(默认脚本,不需要配置)

这里写图片描述

#为了界面更好看,可以进行以下操作
[root@server6 ROOT]# cd /usr/local/lnmp/nginx/
[root@server6 nginx]# vim conf/nginx.conf
         43         location / {
         44             #root   html;   #注释掉此行
         45             root /usr/local/tomcat/webapps/ROOT;  #添加此目录为默认目录
         46             index  index.php index.html index.htm;
         47         }

这里写图片描述

#配置server1:
[root@server1 ~]# tar zxf jdk-7u79-linux-x64.tar.gz  -C /usr/local/
[root@server1 ~]#tar zxf apache-tomcat-7.0.37.tar.gz  -C  /usr/local/
[root@server1 ~]# vim /etc/profile

        export JAVA_HOME=/usr/local/java
        export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
        export PATH=$PATH:$JAVA_HOME/bin

[root@server1 ~]# source /etc/profile
[root@server1 local]# ln -s jdk1.7.0_79/ java
[root@server1 local]# ln -s apache-tomcat-7.0.37/ tomcat
[root@server1 local]# cd tomcat/
[root@server1 tomcat]# bin/startup.sh 
        Using CATALINA_BASE:   /usr/local/tomcat
        Using CATALINA_HOME:   /usr/local/tomcat
        Using CATALINA_TMPDIR: /usr/local/tomcat/temp
        Using JRE_HOME:        /usr/local/java
        Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
        Tomcat started.
[root@server1 tomcat]# cd webapps/ROOT/
[root@server1 ROOT]# vim test.jsp

    Serve1  The time is: <%=new java.util.Date() %>




#把server1和server6建立联系
[root@server6 ROOT]# cd /usr/local/lnmp/nginx/
[root@server6 nginx]# vim conf/nginx.conf
        #HTTP的核心模块
        17 http {

        ##负载均衡
         18         upstream tomcat{
         19         server 172.25.44.1:8080;
         20         server 172.25.44.6:8080;
         21         }


         22     include       mime.types;
         23     default_type  application/octet-stream;  #把客户默认为应用或文件,使客户不能直接访问
         24 


         64        location ~ \.jsp$ {
         65            proxy_pass   http://tomcat;
         66        }

测试:(实现了负载均衡)

这里写图片描述
这里写图片描述

#配置网页使其可以写入服务器会话缓存中的页面:
[root@server6 ROOT]# vim test.jsp     
            <%@ page contentType="text/html; charset=GBK" %>
            <%@ page import="java.util.*" %>
            <html><head><title>Cluster App Test</title></head>
            <body>
            Server Info:
            <%
            out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
            <%
            out.println("<br> ID " + session.getId()+"<br>");
            String dataName = request.getParameter("dataName");
            if (dataName != null && dataName.length() > 0) {
            String dataValue = request.getParameter("dataValue");
            session.setAttribute(dataName, dataValue);
            }
            out.print("<b>Session list</b>");
            Enumeration e = session.getAttributeNames();
            while (e.hasMoreElements()) {
            String name = (String)e.nextElement();
            String value = session.getAttribute(name).toString();
            out.println( name + " = " + value+"<br>");
            System.out.println( name + " = " + value);
            }
            %>
            <form action="test.jsp" method="POST">
            name:<input type=text size=20 name="dataName">
            <br>
            key:<input type=text size=20 name="dataValue">
            <br>
            <input type=submit>
            </form>
            </body>
            </html>
            [root@server1 ROOT]# vim test.jsp
            <%@ page contentType="text/html; charset=GBK" %>
            <%@ page import="java.util.*" %>
            <html><head><title>Cluster App Test</title></head>
            <body>
            Server Info:
            <%
            out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
            <%
            out.println("<br> ID " + session.getId()+"<br>");
            String dataName = request.getParameter("dataName");
            if (dataName != null && dataName.length() > 0) {
            String dataValue = request.getParameter("dataValue");
            session.setAttribute(dataName, dataValue);
            }
            out.print("<b>Session list</b>");
            Enumeration e = session.getAttributeNames();
            while (e.hasMoreElements()) {
            String name = (String)e.nextElement();
            String value = session.getAttribute(name).toString();
            out.println( name + " = " + value+"<br>");
            System.out.println( name + " = " + value);
            }
            %>
            <form action="test.jsp" method="POST">
            name:<input type=text size=20 name="dataName">
            <br>
            key:<input type=text size=20 name="dataValue">
            <br>
            <input type=submit>
            </form>
            </body>
            </html>
#测试(当添加数据时,会在两个服务器上交替进行缓存):

这里写图片描述
这里写图片描述

#为了不让一直交替变换,执行以下操作(企业中往往是想达到这种效果,使得运行环境更加稳定)
[root@server6 nginx]# vim conf/nginx.conf
17 http {
 18         upstream tomcat{
 19          ip_hash(或sticky);  #这两个算法都可以达到效果
 20         server 172.25.44.1:8080;
 21         server 172.25.44.6:8080;
 22         }
[root@server6 nginx]# nginx -s reload

这里写图片描述

以上部分只是为了搭建用nginx实现tomcat的负载均衡环境,下边正式开始搭建tomcat,实现数据交替缓存,解决了因为一台服务器坏掉而丢失整个服务器上的缓存数据问题

配置tomcat+nginx+memcahe 的组合环境

#需要使用memcached进行缓存其会话
[root@server6 lib]# ls    #下载java包使其支持更精确的数据查看功能
        annotations-api.jar
        asm-3.2.jar
        catalina-ant.jar
        catalina-ha.jar
        catalina.jar
        catalina-tribes.jar
        ecj-4.4.2.jar
        el-api.jar
        jar
        jasper-el.jar
        jasper.jar
        jsp-api.jar
        kryo-1.04.jar
        kryo-serializers-0.10.jar
        memcached-session-manager-1.6.3.jar
        memcached-session-manager-tc6-1.6.3.jar
        memcached-session-manager-tc7-1.6.3.jar
        minlog-1.2.jar
        msm-kryo-serializer-1.6.3.jar
        reflectasm-1.01.jar
        servlet-api.jar
        spymemcached-2.7.3.jar
        tomcat7-websocket.jar
        tomcat-api.jar
        tomcat-coyote.jar
        tomcat-dbcp.jar
        tomcat-i18n-es.jar
        tomcat-i18n-fr.jar
        tomcat-i18n-ja.jar
        tomcat-jdbc.jar
        tomcat-util.jar
        websocket-api.jar
[root@server6 lib]# rm -fr memcached-session-manager-tc6-1.6.3.jar 
[root@server6 lib]# cd /usr/local/tomcat/conf
[root@server6 conf]# vim context.xml #在tomcat中添加memcahed的配置,此处使用的是交叉存储,及默认server6 的访问数据被刷新到server1 的memcached上
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:172.25.44.6:11211,n2:172.25.44.1:11211"
        failoverNodes="n1"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
        />
[root@server6 tomcat]# cd bin/
[root@server6 bin]# ./startup.sh    #重启服务使其生效
        Using CATALINA_BASE:   /usr/local/tomcat
        Using CATALINA_HOME:   /usr/local/tomcat
        Using CATALINA_TMPDIR: /usr/local/tomcat/temp
        Using JRE_HOME:        /usr/local/java
        Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
        Tomcat started.

[root@server6 bin]# cd ..
[root@server6 tomcat]# cd conf/
[root@server6 tomcat]# cd logs/
[root@server6 logs]#cat catalina.out   #查看日志,必须看到以下效果,保证成功启动

            INFO: MemcachedSessionService finished initialization, sticky true, operation timeout 1000, with node ids [n2] and failover node ids [n1]

[root@server6 conf]# yum install memcached  -y
[root@server6 tomcat]# /etc/init.d/memcached start
            Starting memcached:                                        [  OK  ]


[root@server1 lib]# ls
        annotations-api.jar
        asm-3.2.jar
        catalina-ant.jar
        catalina-ha.jar
        catalina.jar
        catalina-tribes.jar
        ecj-4.4.2.jar
        el-api.jar
        jar
        jasper-el.jar
        jasper.jar
        jsp-api.jar
        kryo-1.04.jar
        kryo-serializers-0.10.jar
        memcached-session-manager-1.6.3.jar
        memcached-session-manager-tc6-1.6.3.jar
        memcached-session-manager-tc7-1.6.3.jar
        minlog-1.2.jar
        msm-kryo-serializer-1.6.3.jar
        reflectasm-1.01.jar
        servlet-api.jar
        spymemcached-2.7.3.jar
        tomcat7-websocket.jar
        tomcat-api.jar
        tomcat-coyote.jar
        tomcat-dbcp.jar
        tomcat-i18n-es.jar
        tomcat-i18n-fr.jar
        tomcat-i18n-ja.jar
        tomcat-jdbc.jar
        tomcat-util.jar
        websocket-api.jar
[root@server1 lib]# rm -fr memcached-session-manager-tc6-1.6.3.jar   #不符合版本
[root@server1 lib]# cd /usr/local/tomcat/conf
[root@server1 conf]# vim context.xml 
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:172.25.44.6:11211,n2:172.25.44.1:11211"
        failoverNodes="n2"    #在哪个上,就写哪个服务器的代号
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
        />
[root@server1 tomcat]# cd bin/
[root@server1 bin]# ./startup.sh
        Using CATALINA_BASE:   /usr/local/tomcat
        Using CATALINA_HOME:   /usr/local/tomcat
        Using CATALINA_TMPDIR: /usr/local/tomcat/temp
        Using JRE_HOME:        /usr/local/java
        Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
        Tomcat started.
[root@server1 bin]# cd ..
[root@server1 tomcat]# cd logs/
[root@server1 logs]#cat catalina.out   #必须看到以下效果

        INFO: MemcachedSessionService finished initialization, sticky true, operation timeout 1000, with node ids [n1] and failover node ids [n2]
 [root@server1 conf]# yum install memcached  -y
 [root@server1 tomcat]# /etc/init.d/memcached start
         Starting memcached:                                        [  OK  ]



#如果访问浏览器,测试不到效果(172.25.44.6/test.jsp),即访问空白,执行以下操作
[root@server1 tomcat]# ps
          PID TTY          TIME CMD
         2815 pts/0    00:00:00 bash
         3058 pts/0    00:00:22 java
         8771 pts/0    00:00:00 ps
[root@server1 tomcat]# kill -9 3058
[root@server1 tomcat]# bin/startup.sh 
        Using CATALINA_BASE:   /usr/local/tomcat
        Using CATALINA_HOME:   /usr/local/tomcat
        Using CATALINA_TMPDIR: /usr/local/tomcat/temp
        Using JRE_HOME:        /usr/local/java
        Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
        Tomcat started.

#如果不行,两边都操作一下

[root@server1 tomcat]# bin/shutdown.sh 
        Using CATALINA_BASE:   /usr/local/tomcat
        Using CATALINA_HOME:   /usr/local/tomcat
        Using CATALINA_TMPDIR: /usr/local/tomcat/temp
        Using JRE_HOME:        /usr/local/java
        Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar


测试:(在server1上添加用户,在后端服务器上把server1的memcahed关闭 ,其刷新到server6上的memcahed中)

这里写图片描述
这里写图片描述

#如果两个都关掉,则会出现以下报错

这里写图片描述

#关闭server1的tomcat,数据保持成功,而且实现了数据交替缓存

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/wzt888_/article/details/81676604