nginx + tomcat + memcached 负载均衡动静分离技术

来源:互联网 发布:ubuntu分区工具 编辑:程序博客网 时间:2024/06/15 04:09

环境: 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

原创粉丝点击