环境: redhat6.5
所需软件: nginx tomcat memcached
安装包:
nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz
apache-tomcat-7.0.37.tar.gz
jdk-7u79-linux-x64.tar.gz
nginx-1.10.1.tar.gz
memcached.x86_64
安装包下载:
http://www.nginx.org
http://code.google.com/p/memcached-session-manager/
机器:
因为是在自己电脑上模拟的,开了两台虚拟机
server1: 172.25.12.1 nginx memcached tomcat
server2: 172.25.12.2 memcached tomcat
安装:
1.安装memcahed:
yum install memcached -y
/etc/init.d/memcached start
memcached 默认开启11211 端口:
netstat -anple | grep :11211
2.tomcat安装与配置:
tomcat的安装需要java环境,所以先配置java环境
tar zxf jdk-7u79-linux-x64.tar.gz
mv jdk1.7.0_79/ /usr/local/
cd /usr/local/
ln -s jdk1.7.0_79/ java
配置java环境变量
vim /etc/profile
在里面添加下面几行
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/binsource /etc/profile
JAVA_HOME 后跟上面jdk解压目录
我将解压包移到/usr/local下 并创建了名为java的软连接,所以写/usr/local/java
查看路径:
echo $JAVA_HOME
echo $CLASSPATH
echo $PATH
which java
which javac
环境配好之后就开始安装tomcat:
tar zxf apache-tomcat-7.0.37.tar.gz
mv apache-tomcat-7.0.37 /usr/local/
cd /usr/local/
ln -s apache-tomcat-7.0.37/ tomcat
ll
cd tomcat/
在网上下载下面几个包,放到lib下(不用解压):
启动tomcat:
bin/startup.sh
查看8080端口,tomcat默认占用8080端口:
netstat -anplt | grep :8080
tomcat默认发布目录:
webapps/ROOT/
cd /usr/local/tomcat/webapps/ROOT/
vim test.jsp
在浏览器访问 localhost:8080/test.jsp 测试tomcat
出现以下界面就说明安装成功:
配置tomcat:
vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.12.1:11211,n2:172.25.12.2:11211"
failoverNodes="n1" ##在server2 上设置为n2
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
两个节点:
n1:172.25.12.1:11211
n2:172.25.12.2:11211
代表两个memcache服务
T1代表 server1 上的tomcat
T2代表 server2 上的tomcat
M1代表 server1 上的 memcache
M2代表 server2 上的 memcache
T1的session存到M2上
T2的session存到M1上
当T1出问题后,T2接管T1的工作,从M2里读取T1的工作数据
当M2出问题,T1就把缓存存到M1上
避免单点故障
3.nginx的安装与配置:
ginx-sticky-module 为 nginx 的第三方模块,使 nginx 支持 sticky 模式,所谓 sticky 模式就是指同一个用户的访问请求都被发送到同一个 tomcat 实例上处理。
解压nginx的第三方模块sticky并获取它的解压路径:
tar zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz
cd nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d
pwd
解压并安装nginx(源码编译):
tar zxf nginx-1.10.1.tar.gz
cd nginx-1.10.1
cd auto/cc
vim gcc
将debug注释掉,提高编译速度
178 # debug
179 #CFLAGS="$CFLAGS -g"
./configure 编译 后跟参数
安装目录
–prefix=/usr/local/lnmp/nginx
默认模块
–with-http_ssl_module
–with-http_stub_status_module
添加模块(sticky模块,后跟第三方模块解压路径)
–add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d
编译时要在解压目录里执行 ./configure 与相关参数
make
make install
安装完毕.
跳到nginx配置文件目录:
cd /usr/local/lnmp/nginx/conf/
编辑配置文件:
vim nginx.conf
18 http {
##在Http下添加策略 test 这个策略是调用tomcat(tomcat默认端口为8080)
19 upstream test{
20 sticky;
21 server 172.25.12.2:8080;
22 server 172.25.12.1:8080;
23 }
##在server下添加 jsp 页面处理策略 只要是jsp页面,就跳到 test策略
##tomcat善于处理动态页面,将所有jsp页面全部交给tomcat去处理,实现动静分离
70 location ~ \.jsp$ {
71 proxy_pass http://test;
72 }
##添加server策略 当访问 www.test.org 时跳到test策略
157 server {
158 listen 80;
159 server_name www.test.org;
160
161 location / {
162 proxy_pass http://test;
163 }
164 }
检测nginx配置文件有没有差错
nginx -t
重启nginx
nginx -s reload
测试:
测试界面:
写到tomcat发布目录下,每个节点都要写
/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>
打开浏览器访问 http://www.test.org/test.jsp
不同的主机访问时会调度到不同的 tomcat 实例上处理
来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down 掉当前正在响应的 tomcat 实例,nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉。
在访问 http://www.test.org/test.jsp 时,会调用 nginx ,通过配置文件里写的策略,去进行相关的访问.
注意:
如果访问不到 www.test.org 看有没有在本地 /etc/hosts 文件里加域名解析
格式:
ip domain1,domian2 ...
此处ip为有装有nginx服务器的ip domain 写 www.test.org