系统环境:rhel6 x64 selinux and iptables disabled
主机角色:
server1: 192.168.122.11 : nginx
server2: 192.168.122.12 : tomcat memcached
server3: 192.168.122.13 : tomcat memcached
Tomcat-1 (T1) 将 session 存储在 memcached-2 (T2)上。只有当 M2 不可用时,T1 才将 session 存储在 memcached-1 上(M1 是 T1 failoverNode)。使用这种配置的好处是,当 T1 和 M1 同时崩溃时也不会丢失 session 会话,避免单点故障。
一、tomcat 安装
首先配置java环境
[root@server2 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/ -C指定解压路径
[root@server2 local]# cd /usr/local/
[root@server2 local]# ln -s jdk1.7.0_79/ java 做连接
[root@server2 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@server2 local]# source /etc/profile 使之生效
测试java环境
[root@server2 ~]# vim test.java 写测试脚本
public class test {
public static void main(String[] args)
{
System.out.println("Hello World");
}
}
[root@server2 ~]# javac test.java 编译
[root@server2 ~]# java test
Hello World
至此,server2上java 环境搭建完毕,server3同理
部署tomcat
[root@server2 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@server2 local]# cd /usr/local/
[root@server2 local]# ln -s apache-tomcat-7.0.37/ tomcat
[root@server2 tomcat]# cd /usr/local/tomcat
[root@server2 tomcat]# bin/startup.sh 开启tomcat,端口默认为8080
[root@server2 tomcat]# netstat -antlp
[root@server2 tomcat]# cd webapps/ROOT/
[root@server2 ROOT]# vim test.jsp
[root@server2 ROOT]# cat test.jsp
The time is: <%=new java.util.Date() %>
server3同上
二、安装nginx
[root@server1 ~]# tar zxf nginx-1.10.1.tar.gz
[root@server1 ~]# tar zxf nginx-sticky-module-ng.tar.gz
注: nginx-sticky-module 为 nginx 的第三方模块,使 nginx 支持 sticky 模式,所谓 sticky 模式就是指同一个用户的访问请求都被发送到同一个 tomcat 实例上处理。
[root@server1 ~]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# vim auto/cc/gcc
#CFLAGS="$CFLAGS -g" 注释掉
[root@server1 nginx-1.10.1]# yum install gcc pcre-devel openssl-devel -y 安装依赖
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-threads --user=nginx --group=nginx --add-module=/root/nginx-sticky-module-ng 安装相关模块
[root@server1 nginx-1.10.1]# make && make install 编译安装
[root@server1 ~]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/sbin/
[root@server1 ~]# useradd -s /sbin/nologin nginx 创建nginx用户
[root@server1 sbin]# cd /usr/sbin
[root@server1 sbin]# nginx 开启nginx
在nginx上部署tomcat负载均衡
修改位置文件
[root@server1 conf]# pwd
/usr/local/lnmp/nginx/conf
[root@server1 conf]# vim nginx.conf
17 http {
18 upstream tomcat { #负载均衡模块
19 sticky;
20 server 192.168.122.12:8080; #后端tomcat
21 server 192.168.122.13:8080;
22 }
23
24 include mime.types;
25 default_type application/octet-stream;
68 location ~ \.jsp$ { #所有jsp页面交给tomcat处理,动静分离
69 proxy_pass http://tomcat;
70 }
[root@server1 logs]# nginx -t 可用来检测语法是否有误
[root@server1 logs]# nginx -s reload
nginx: [error] invalid PID number "" in "/usr/local/lnmp/nginx/logs/nginx.pid"
出错,上网查找解决办法,得如下:
[root@server1 logs]# nginx -c /usr/local/lnmp/nginx/conf/nginx.conf
[root@server1 logs]# nginx -s reload 好了,没有报错
把server2,server3上的测试面稍加修改,实验效果明显
测试:
配置session
server2,3上
session 的序列化方案官方推荐的有 4 种:
1. java serialization
2. msm-kryo-serializer
3. msm-javolution-serializer
4. msm-xstream-serializer
其中性能最好的序列化方案是 Kryo,此实验我们采用 kryo 方式。
把如下软件包放置到/usr/local/tomcat/lib 目录中
kryo-1.03.jar
kryo-serializers-0.8.jar
memcached-2.5.jar
memcached-session-manager-1.5.1.jarmemcached-session-manager-tc7-1.5.1.jar
minlog-1.2.jar
msm-kryo-serializer-1.5.1.jar
reflectasm-0.9.jar
[root@server2 memsoft]# mv * /usr/local/tomcat/lib/
[root@server2 conf]# pwd
/usr/local/tomcat/conf
[root@server2 conf]# vim context.xml
<?xml version='1.0' encoding='utf-8'?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.122.12:11211,n2:192.168.122.13:11211"
failoverNodes="n1" 在 node2(server3) 上此项设置为“n2 (坏了找自己)
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
[root@server2 conf]# yum install -y memcached 安装
[root@server2 conf]# /etc/init.d/memcached start
[root@server2 conf]# 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);
}
%>
server3相同配置
三、测试
访问 http://192.168.122.11/test.jsp,不同的主机访问时会调度到不同的 tomcat 实例上处理来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down 掉当前正在响应的 tomcat 实例,nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉。
注意:测试前必须注意启动顺序 tomcat>memcached>nginx
浏览器访问时:
http://192.168.122.11/test.jsp
此时你 down 掉当前正在响应的 tomcat 实例
[root@server2 ~]# /usr/local/tomcat/bin/shutdown.sh
nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉。
你也可以在终端通过查看日志的方式查看到session信息
[root@server2 ~]#tail -f /usr/local/tomcat/log/catalina.out