######### nginx+tomcat+memcache ############
实验环境
rhel6.5
3台主机iptables防火墙关闭
实验主机
172.25.8.2 nginx
172.25.8.3 tomcat memcached
172.25.8.4 tomcat memcached
实验原理
nginx在前端接受客户端请求进行负载均衡
Tomcat-1(T1)将session存储在memcached-2(T2)上。只有当M2不可用时,T1才将session存储在memcached-1上(M1是T1的failoverNode故障转移点)。使用这种配置的好处是,当T1 和M1同时崩溃时也不会丢失 session 会话,避免单点故障。
###########安装tomcat###########
在172.25.8.3和172.25.8.4主机上进行安装
1.安装包
apache-tomcat-7.0.37.tar.gz ##tomcat安装包
jdk-7u79-linux-x64.tar.gz ##jdk是java语言的软件开发工具包
2.安装过程
tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local
mv /usr/local/apache-tomcat-7.0.8 /usr/local/tomcat
tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local
mv /usr/local/jdk1.7.0_79 /usr/local/jdk
3.配置环境变量
vim /etc/profile ##在文件末尾添加下列参数。用于设置环境变量必须指定否则tomcat无法启动
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile ##刷新
echo $JAVA_HOME ;echo $PATH ##查看环境变量是否生效
java -version ##命令检查java版本
4.测试
/usr/local/tomcat/bin/startup.sh ##启动脚本。关闭的脚本是此目录下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/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
5.浏览器访问http://172.25.8.3:8080可以看到猫网页
6.直接同步到172.25.8.4主机,完成tomcat的安装
1)scp -r /usr/local/jdk /usr/local/tomcat/ root@172.25.8.4:/usr/local
##将172.25.8.3的jdk和tomcat目录直接发送到172.25.8.4主机
2)scp /etc/profile root@172.25.8.4:/etc/profile ##同步环境变量
souce /etc/profile
3)/usr/local/tomcat/bin/startup.sh ##启动脚本
######## memcached ###########
在172.25.8.3和172.25.8.4主机上进行安装
1.安装并开启
yum install memcached -y
/etc/init.d/memcached star ##开启memcached
######### session的序列化方案设置############
在172.25.8.3和172.25.8.4主机
1.关闭tomcat
/usr/local/tomcat/bin/shundown.sh
2.把如下软件包放置到/usr/local/tomcat/lib 目录中
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
minlog-1.2.jar
spymemcached-2.7.3.jar
2.编辑context.xml ##用于T1-m2,T2-m1之间可以缓存
vim /usr/local/tomcat/conf/context.xml
<Context>
......
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="m1:172.25.8.3:11211,m2:172.25.8.4:11211"
failoverNodes="m1" #在 node2 上此项设置为“m2”
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
3.session的序列化方案介绍官方推荐的有4种
1). java serialization
2). msm-kryo-serializer
3). msm-javolution-serializer
4). msm-xstream-serializer
其中性能最好的序列化方案是 Kryo,这次实验采用 kryo 方式。
############# nginx安装 ######################
在172.25.8.2主机上安装nginx
1.安装包
nginx-1.10.1.tar.gz
nginx-sticky-module-1.0.tar.gz
2.安装过程
1)yum install -y pcre-devel openssl-devel gcc
tar zxf nginx-1.10.1.tar.gz
tar zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz -C nginx-1.10.1
##nginx-sticky-module为nginx的第三方模块,使 nginx 支持sticky模式,所谓sticky模式就是指同一个用户的访问请求都被发送到同一个tomcat实例上处理。
useradd -s /sbin/nologin nginx
cd nginx-1.10.1
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d/ ##./configure过程缺什么补什么
make;make install
/usr/local/nginx/sbin/nginx ##开启ngixn
浏览器访问http//172.25.8.2 ##测试nginx安装是否成功
/usr/local/nginx/sbin/nginx -s stop ##关闭nginx
vim /usr/local/nginx/conf/nginx.conf ##编辑nginx配置文件
http {
upstream www.example.com { ##设置负载均衡模块
sticky; ##sticky模式
server 172.25.8.3:8080;
server 172.25.8.4:8080;
}
server { ##在server段添加location段
location ~ \.jsp$ { ##所有jsp页面交给 tomcat 处理,动静分离
proxy_pass http://www.example.com;
}
######测试 tomacat+memcache 效果######
在172.25.8.3和172.25.8.4主机上
1.##编辑测试网页
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>
2.浏览器访问172.25.8.3:8080/test.jsp和172.25.8.38080/test.jsp可以看到
Server Info: 172.25.8.3 : 8080 ##对应主机
ID BEF1A4C679665595EA5180210933026F-m2 ##memcached的存储位置,T1缓存到m2
Session list 123 = 321 ##已经传的内容
name ##要上传的name
key ##要上传的keynamekey随意编辑
Submit Query ##上传按键
3.效果查看
1)在172.25.8.3主机上查看Tomcat默认生成的日志文件catalina.out
tail -n5 /usr/local/tomcat/logs/catalina.out
返回内容123 = 321 ##172.25.8.3本地储存上传过的123=321记录
2)在172.25.8.4主机上查看由T1-m2的缓存记录
telnet localhost 11211 ##11211是memcached默认端口连接查看本地的缓存记录
get BEF1A4C679665595EA5180210933026F-m2 ##get命令在telnet进入之后使用B..F-m1是刚浏览器中显示的ID
返回内容..省略..123321 ##m2中有缓存记录
quit ##quit命令退出
telnet 172.25.8.4 11211 ##telnet IP 11211也可以进行查看
3)正常模式下T1缓存到m2T2缓存到m1
当m2被关闭之后在浏览器访问会看到已经切换到m1
##########测试nginx负载均衡的效果############
vim /etc.hosts ##在哪个机子测试就编辑/etc.hosts
172.25.8.2 www.example.com
【注意关闭防火强】
小结访问 http://www.example.com/test.jsp
1)不同的主机访问时会调度到不同的tomcat实例上处理
2)来自同一主机的请求会交给同一个tomcat实例处理
3)若down掉当前正在响应的tomcat实例,nginx会自动把用户的请求调度到另一个tomcat 实例上,同时session也没有丢掉。
本文出自 “12148275” 博客,转载请与作者联系!
原文地址:http://12158275.blog.51cto.com/12148275/1910131