nginx+tomcat+memcached实现负载均衡和session共享

安装包:

apache-tomcat-7.0.37.tar.gz  
jdk-7u79-linux-x64.tar.gz  

架包:(共9个)

asm-3.2.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.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar

实验环境:

两个节点   
server5(n1)  
server4(n2)
搭建实验环境:
在server5中:
[root@server5 ~]# nginx   #打开nginx
[root@server5 ~]# /etc/init.d/php-fpm start  
Starting php-fpm  done
## -C 表示解压路径
[root@server5 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
[root@server5 ~]# cd /usr/local/
[root@server5 local]# ln -s jdk1.7.0_79/  java
##修改全局变量
[root@server5 local]# 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@server5 local]# source /etc/profile
##查看$PATH的路径
[root@server5 local]# echo $PATH 
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/java/bin:/root/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/nginx/sbin:/usr/local/lnmp/php/bin:/usr/local/java/bin
[root@server5 local]# echo $CLASSPATH
.:/usr/local/java/lib:/usr/local/java/jre/lib
[root@server5 local]# echo $JAVA_HOME
/usr/local/java
[root@server5 local]# which java
/usr/local/java/bin/java
[root@server5 local]# cd
##测试jdk环境
[root@server5 ~]# vim test.java

这里写图片描述

[root@server5 ~]# javac test.java   #检测语法是否正确
##查看文件类型是一个java库文件
[root@server5 ~]# file test.class    
test.class: compiled Java class data, version 51.0
[root@server5 ~]# java test        #执行脚本
Hello World!
[root@server5 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@server5 ~]# cd /usr/local/
[root@server5 local]# ln -s apache-tomcat-7.0.37/  tomcat
[root@server5 local]# cd tomcat/
##开启tomcat
[root@server5 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@server5 tomcat]# cd logs/
[root@server5 logs]# cat catalina.out    #看有没有成功启动的日志

这里写图片描述

##查看tomcat默认端口8080是否开启
[root@server5 logs]# netstat -antlp|grep :8080
tcp        0      0 :::8080                     :::*                        LISTEN      1087/java     

测试:
输入172.25.52.5:8080
这里写图片描述
输入:172.25.52.5/index.php
这里写图片描述
为了使界面更好看,可以进行以下操作

[root@server5 ROOT]# cd /usr/local/lnmp/nginx/
[root@server5 nginx]# vim conf/nginx.conf

这里写图片描述
再次输入:172.25.52.5/index.php
这里写图片描述

[root@server5 tomcat]# cd webapps/ROOT/
[root@server5 ROOT]# vim test.jsp
###################
写入:
The time is: <%=new java.util.Date() %>

测试:
输入:172.25.52.5:8080/test.jsp
这里写图片描述

负载均衡:
在server4上做相同的操作:
[root@server4 ~]# tar zxf jdk-7u79-linux-x64.tar.gz  -C /usr/local/
[root@server4 ~]# tar zxf apache-tomcat-7.0.90.tar.gz  -C /usr/local/
[root@server4 ~]# 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@server4 ~]# source /etc/profile
##制作软链接
[root@server4 ~]# cd /usr/local/
[root@server4 local]# ln -s jdk1.7.0_79/ java
[root@server4 local]# ln -s apache-tomcat-7.0.90/ tomcat
[root@server4 local]# cd tomcat/
##开启tomcat
[root@server4 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@server4 tomcat]# cd webapps/ROOT/
[root@server4 ROOT]# vim test.jsp
####################
写入:
Server4  The time is: <%=new java.util.Date() %>
[root@server5 tomcat]# cd webapps/ROOT/
[root@server5 ROOT]# vim test.jsp
####################
修改:
Server5  The time is: <%=new java.util.Date() %>
#编写配置文件
[root@server5 ROOT]# cd /usr/local/lnmp/nginx/
[root@server5 nginx]# vim conf/nginx.conf

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

[root@server5 nginx]# nginx -s reload

测试:
这里写图片描述
这里写图片描述

Session共享
##重新编写server4与server5测试文件:
##测试文件是相同的
[root@server5 ROOT]# pwd
/usr/local/tomcat/webapps/ROOT
[root@server5 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@server4 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>

测试:
这里写图片描述
查看到server info一直在交替变更
这里写图片描述
这里写图片描述

为了不让一直交替变换,执行以下操作

[root@server5 nginx]# vim conf/nginx.conf
####################
17 http {
 18         upstream tomcat{
 ##也可以添加sticky模块(需要重新编译)
 19          ip_hash;      #哈希
 20         server 172.25.52.4:8080;
 21         server 172.25.52.5:8080;
 22         }
[root@server5 nginx]# nginx -s reload

测试:
虽然server infio没有再变更,但是一旦某个节点出现故障, 那么保存在该节点上的数据便会丢失
这里写图片描述

解决方案:
数据交叉存储

在server5与server4中做以下相同的操作:
##下载jar包并将其放到/usr/local/tomcat/lib 目录中
[root@server5 lib]# ls
asm-3.2.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
memcached-session-manager-tc6-1.6.3.jar
minlog-1.2.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar
[root@server5 lib]# rm -fr memcached-session-manager-tc6-1.6.3.jar 
[root@server5 lib]# cd /usr/local/tomcat/conf
##编写配置文件
[root@server5 conf]# vim context.xml
################### 
添加:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.52.5:11211,n2:172.25.52.4.1:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@server5 tomcat]# cd bin/
[root@server5 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@server5 bin]# cd ..
[root@server5 tomcat]# cd logs/
[root@server5 logs]#cat catalina.out  

这里写图片描述

[root@server5 conf]# yum install memcached  -y
[root@server5 tomcat]# /etc/init.d/memcached start
Starting memcached:                                        [  OK  ]
##下载jar包并将其放到/usr/local/tomcat/lib 目录中
[root@server4 lib]# ls
asm-3.2.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
memcached-session-manager-tc6-1.6.3.jar
minlog-1.2.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar
[root@server4 lib]# rm -fr memcached-session-manager-tc6-1.6.3.jar 
[root@server4 lib]# cd /usr/local/tomcat/conf
##编写配置文件
[root@server4 conf]# vim context.xml 
添加:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.52.5:11211,n2:172.25.52.4:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@server4 tomcat]# cd bin/
[root@server4 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@server4 bin]# cd ..
[root@server4 tomcat]# cd logs/
[root@server4 logs]#cat catalina.out   

这里写图片描述

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

测试:
Server Info 在server5上 即节点server5工作
这里写图片描述
Server5的数据存储在server4上:
这里写图片描述

模拟破坏节点server5:

[root@server5 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

此时Server Info会切换到server4上 即节点server5出现故障 节点server4顶替工作
这里写图片描述
由于是交叉存储,即使节点server5被破坏,但原始数据仍然保存完好在server4上
这里写图片描述

排错:

1.没有sticky模块 怎么办?

[root@server5 nginx-1.10.1]# nginx
nginx: [emerg] unknown directive "sticky" in /usr/local/lnmp/nginx/conf/nginx.conf:20
[root@server5 conf]# killall -9 nginx 
[root@server5 conf]#cd
[root@server5 ~]# ls
nginx-sticky-module-ng.tar.gz 
[root@server5 ~]#tar zxf nginx-sticky-module-ng.tar.gz 
[root@server5 ~]# cd nginx-1.10.1
[root@server5 nginx-1.10.1]# make clean
rm -rf Makefile objs
[root@server5 nginx-1.10.1]# ./configure --help
[root@server5 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@server5 nginx-1.10.1]# make && make install
[root@server5 nginx-1.10.1]# nginx

1.如果在网页上输入172.25.52.58080
                172.25.52.48080
刷不出来 该怎么办?


(1).查看是否有8080端口 
Netstat -antlp
如果没有 就执行 cd /usr/local/tomcat
                bin/startup.sh2).查看进程 将多余的进程杀死
[root@server4 conf]# ps
  PID TTY          TIME CMD
 1089 pts/0    00:00:00 bash
 1857 pts/0    00:00:02 java
 1899 pts/0    00:00:00 ps
[root@server4 conf]# kill -9 1857
[root@server4 conf]# cd ..
[root@server4 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


2.如果 输入http://172.25.52.5/test.jsp 刷不出来 该怎么办?
(1).在两个节点server4和server5上:
[root@server4 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
[root@server4 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

(2)查看两个节点上/usr/local/tomcat/lib中的架包:(总共9个)
asm-3.2.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
spymemcached-2.7.3.jar3)查看两个节点上的文件是否编写正确:
Vim /usr/local/tomcat/webapps/ROOT/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>

vim /usr/local/tomcat/conf/context.xml    
##################
   <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.52.5:11211,n2:172.25.52.4:11211"
failoverNodes="n2"  ##在server5上写n1
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值