LNMP架构之动态缓存(nginx +tomcat+memcache) 实现session会话保持

关于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。

环境设定

server1172.25.78.1nginx+tomcat+memcache
server2172.25.78.2tomcat+memcache
1.配置tomcat
[root@server1 ~]# ls  # 先获取软件包
apache-tomcat-7.0.37.tar.gz 
jdk-7u79-linux-x64.tar.gz  
[root@server1 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/  # 解压到指定文件夹
[root@server1 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
[root@server1 local]# ln -s apache-tomcat-7.0.37  tomcat
[root@server1 local]# ln -s  jdk1.7.0_79 java
[root@server1 local]# vim /etc/profile 
79 export JAVA_HOME=/usr/local/java  # 设置JAVA的根目录 
80 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib 
81 export PATH=$PATH:$JAVA_HOME/bin 
[root@server1 local]# source /etc/profile  # 刷新环境变量,使其生效
[root@server1 local]# java  # 按Tab键,有东西就说明加载成功
java            javadoc         javah           java-rmi.cgi    javac           
javafxpackager  javap           javaws 
[root@server1 local]# cd
[root@server1 ~]# vim test.java
public class test{    
    public static void main(String[] args){        
        System.out.println("hello world");    
    }
}
[root@server1 ~]# javac test.java  # 检测语法错误
[root@server1 ~]# java test  # 执行脚本
hello world
[root@server1 ~]# yum install -y memcached
[root@server1 ~]# /etc/init.d/memcached start
[root@server1 ~]# cd /usr/local/tomcat/
[root@server1 tomcat]# cd bin/
[root@server1 bin]# ./startup.sh  # 启动tomcat
[root@server1 bin]# netstat -antlp | grep java

在这里插入图片描述

[root@server1 bin]# cd /usr/local/openresty/nginx/conf/
[root@server1 conf]# vim nginx.conf
         # 反向代理 
         location ~ \.jsp$ { 
             proxy_pass   http://127.0.0.1:8080; 
         }

在这里插入图片描述

[root@server1 conf]# cd ../sbin
[root@server1 sbin]# ./nginx -s reload
[root@server1 sbin]# cd /usr/local/tomcat/webapps/ROOT/
[root@server1 ROOT]# vim test.jsp
Server1  The time is: <%=new java.util.Date() %>
# 启动成功后打开浏览器,显示以下界面说明tomcat已经配置启动成功

在这里插入图片描述

# 显示test.jsp脚本界面

在这里插入图片描述

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

在这里插入图片描述

# 为了界面更好看,可以进行以下操作
[root@server1 conf]#  cd /usr/local/openresty/nginx/
[root@server1 nginx]# vim conf/nginx.conf 
         location / { 
             #root   html; 
             root /usr/local/tomcat/webapps/ROOT 
             index  index.html index.htm; 
         }

在这里插入图片描述

[root@server1 nginx]# sbin/nginx -s reload
# 再次访问index.jsp脚本界面

在这里插入图片描述

2.实现负载均衡
为了实现负载均衡,我们还需要开启另外一台服务器
[root@server2 ~]# ls
apache-tomcat-7.0.37.tar.gz  
jdk-7u79-linux-x64.tar.gz
[root@server2 ~]# tar zxf jdk-7u79-linux-x64.tar.gz  -C /usr/local/
[root@server2 ~]# tar zxf apache-tomcat-7.0.37.tar.gz  -C  /usr/local/
[root@server2 ~]# vim /etc/profile
 79 export JAVA_HOME=/usr/local/java 
 80 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib 
 81 export PATH=$PATH:$JAVA_HOME/bin

在这里插入图片描述

[root@server2 ~]# source /etc/profile[
root@server2 ~]# cd /usr/local/
[root@server2 local]# ln -s jdk1.7.0_79/ java
[root@server2 local]# ln -s apache-tomcat-7.0.37/ tomcat
[root@server2 local]# cd tomcat/
[root@server2 tomcat]# bin/startup.sh 
[root@server2 tomcat]# cd webapps/ROOT/
[root@server2 ROOT]# vim test.jsp
Server2  The time is: <%=new java.util.Date() %>

[root@server1 nginx]# pwd
/usr/local/openresty/nginx
[root@server1 nginx]#  vim conf/nginx.conf 
18     upstream  tomcat{ 
19         server 172.25.78.1:8080; 
20         server 172.25.78.2:8080; 
21     } 
76         location ~ \.jsp$ { 
77             proxy_pass   http://tomcat; 
78         }

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

[root@server1 nginx]# sbin/nginx -s reload
# 浏览器测试,实现了负载均衡

在这里插入图片描述

在这里插入图片描述

# 重新编写测试文件:
[root@server1 ~]# cd /usr/local/tomcat/webapps/ROOT/
[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); 
 } 15 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>

在这里插入图片描述

# 浏览器刷新

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
多次实验发现,存储信息是交替进行的,这样不方便 用户来使用,我们现在来改善这个问题

# Nginx的新版本不支持sticky这个模块,所以我们需要重新编译旧版本的nginx

[root@server1 ~]# /usr/local/openresty/nginx/sbin/nginx -s stop  # 关闭新版本的nginx
[root@server1 ~]# tar zxf nginx-1.10.1.tar.gz
[root@server1 ~]# tar zxf nginx-sticky-module-ng.tar.gz 
[root@server1 ~]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# cd src/core/nginx.h   # 隐藏版本号
14 #define NGINX_VER          "nginx/"
[root@server1 nginx-1.10.1]# vim auto/cc/gcc  # 关闭debug日志
178 # debug
179 # CFLAGS="$CFLAGS -g"
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/root/nginx-sticky-module-ng
[root@server1 nginx-1.10.1]# make && make install  
[root@server1 nginx-1.10.1]# cd /usr/local/lnmp/nginx/conf
[root@server1 conf]# vim nginx.conf
     upstream  tomcat{ 
         sticky;# 同一个用户的访问请求都被发送到同一个 tomcat 实例上处理 
         server 172.25.78.1:8080; 
         server 172.25.78.2:8080; 
     } 

             root /usr/local/tomcat/webapps/ROOT;   # 修改默认目录
             # root   html;  
	# 用nginx做tomcat的反向代理
         location ~ \.jsp$ { 
             proxy_pass   http://tomcat; 
         } 	

在这里插入图片描述
在这里插入图片描述

[root@server1 conf]# cd ../sbin/
[root@server1 sbin]# ./nginx   # 开启nginx
# 刷新网页

在这里插入图片描述
在这里插入图片描述

当你正在使用的服务挂掉时,这时这台服务上的所有存储信息都会丢失,这是非常不方便的,而session共享存储就是干这个事情的,把两台服务的信息交错存储,即server1上的信息存储到server2上的memcached上,只有当 server2 不可用时,server1 才将 session 存储在 server1的memcached上,这样,server1和 server2同时崩溃时也不会丢失 session 会话,避免单点故障。

3.session共享
# 我们接下来用session共享来实现这个功能

在这里插入图片描述

# 什么是session
  Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会
话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对
象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 
页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被
放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,
如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。注意 会话状态仅在支
持 cookie 的浏览器中保留。      
   Session 的作用就是它在 Web服务器上保持用户的状态信息供在任何时间从任何设备上的页
面进行访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像 Pad 或
手机这样的浏览器设备。

注:实际上存储功能需要数据库才能实现,我们这里先了解一下,没有用到数据库,即数据没有被存储,但是可以日志可以查看到效果

[root@server1 lib]# pwd
/usr/local/tomcat/lib
[root@server1 lib]# rm -fr memcached-session-manager-tc6-1.6.3.jar  # 因为我们的tomcat是7版本的,所以6版本的我们用不上,删除即可,否则可能影响

# Jdk一定要用原生的,从官网去下载
[root@server1 lib]# ls    # 这些jar包的自己获取,有些是系统自带,有的是需要自己从外界下载
annotations-api.jar
asm-3.2.jar
catalina-ant.jar
catalina-ha.jar
catalina.jar
catalina-tribes.jar
ecj-4.2.1.jar
el-api.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-tc7-1.6.3.jar
minlog-1.2.jarmsm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jarservlet-api.jar
spymemcached-2.7.3.jartomcat-api.jar
tomcat-coyote.jartomcat-dbcp.jar
tomcat-i18n-es.jar
tomcat-i18n-fr.jar
tomcat-i18n-ja.jar
tomcat-jdbc.jar
tomcat-util.jar
[root@server1 lib]# cd /usr/local/tomcat/conf/
[root@server1 conf]# vim context.xml  
34 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
35 memcachedNodes="n1:172.25.78.1:11211,n2:172.25.78.2:11211" 
36 failoverNodes="n2" 
37 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 
38 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
39 />

在这里插入图片描述

[root@server1 conf]# cd ..
[root@server1 tomcat]# bin/shutdown.sh
[root@server1 tomcat]# bin/startup.sh 
[root@server1 tomcat]# > logs/catalina.out

[root@server2 lib]# ls   
annotations-api.jar
asm-3.2.jar
catalina-ant.jar
catalina-ha.jar
catalina.jar
catalina-tribes.jar
ecj-4.2.1.jar
el-api.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-tc7-1.6.3.jar
minlog-1.2.jarmsm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jarservlet-api.jar
spymemcached-2.7.3.jartomcat-api.jar
tomcat-coyote.jartomcat-dbcp.jar
tomcat-i18n-es.jar
tomcat-i18n-fr.jar
tomcat-i18n-ja.jar
tomcat-jdbc.jar
tomcat-util.jar
[root@server2 lib]# cd /usr/local/tomcat/conf/
[root@server2 conf]# vim context.xml  
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
  memcachedNodes="n1:172.25.78.1:11211,n2:172.25.78.2:11211" 
  failoverNodes="n2" 
  requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 
  transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
  />

在这里插入图片描述

[root@server2 conf]# cd ..
[root@server2 tomcat]# bin/shutdown.sh
[root@server2 tomcat]# bin/startup.sh 
[root@server2 tomcat]# > logs/catalina.out
[root@server2 tomcat]# yum install -y memcached
[root@server2 tomcat]# /etc/init.d/memcached start
# 浏览器测试

在这里插入图片描述

[root@server1 tomcat]# bin/shutdown.sh   # 模拟server1挂掉
# 浏览器上继续进行存储

在这里插入图片描述

[root@server2 tomcat]# cat logs/catalina.out  # 查看日志,发现数据确实存储到了server2上

在这里插入图片描述

# 如果访问浏览器,测试不到效果(172.25.78.1/test.jsp),即访问空白,执行以下操作
[root@server2 tomcat]# ps

在这里插入图片描述

[root@server2 tomcat]# kill -9 1992 
# 如果还是不行,就两边的都操作,但是,前提是你所有的服务配置都正确且正常
4.关闭所有服务
[root@server1 tomcat]# pwd
/usr/local/tomcat
[root@server1 tomcat]# bin/shutdown.sh 
[root@server1 tomcat]# /usr/local/lnmp/nginx/sbin/nginx -s stop
[root@server1 tomcat]# /etc/init.d/memcached stop  

[root@server2 tomcat]# pwd
/usr/local/tomcat
[root@server2 tomcat]# bin/shutdown.sh
[root@server2 tomcat]# /etc/init.d/memcached stop
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值