nginx+tomcat 实现动态页面访问及负载均衡
- 实验环境:
- 主机角色:
- server1 192.168.43.10 nginx memcache
- server3 192.168.43.3 memcached tomcat
- server4 192.168.43.4 memcached tomcat
- 软件下载:http://www.nginx.org
- http://code.google.com/p/memcached-session-manager/
- 或者在下面连接下载,从其中找到所需要的安装包,所做实验所需的所有安装包都在其中。
链接:https://pan.baidu.com/s/1JrHj8v_1K2J-l2zZ1JSpbQ
提取码:1234
apache-tomcat-7.0.37.tar.gz
jdk-8u121-linux-x64.rpm
msm.tar
nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
-
== nginx安装==(server1)
nginx安装 -
tomcat安装(server3&server4)
- 先安装jdk
yum install -y jdk-8u121-linux-x64.rpm
- 安装tomcat
tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
- 为了方便重命名一下
[root@server3 mnt]# cd /usr/local
[root@server3 local]# ls
apache-tomcat-7.0.37 etc include lib64 sbin src
bin games lib libexec share
[root@server3 local]# mv apache-tomcat-7.0.37/ tomcat
[root@server3 local]# ls
bin etc games include lib lib64 libexec sbin share src tomcat
- 开启tomcat
cd /usr/local/tomcat/bin
sh startup.sh
开启sh shutdown
关闭
- 在浏览器分别访问
192.168.43.3:8080
,192.168.43.4:8080
,出现下面页面表示安装并启动成功
- nginx 的配置
- 在server1上
[root@server1 ~]# cd /usr/local/openresty/nginx/conf/
[root@server1 conf]# vim nginx.conf
- 重载服务
[root@server1 ~]#/usr/local/openresty/nginx/sbin/nginx/ -s reload
- 在server3&server4中
cd /usr/local/tomcat/webapps/ROOT
vim test.jsp
写入一个动态测试页面
[root@server3 ROOT]# cat 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>
- 在浏览器进行访问测试
nginx+tomcat+memcached实现交叉存储
nginx实现负载均衡和粘滞
-
sticky模块实现session粘滞
-
在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:
-
ip hash,根据客户端的IP,将请求分配到不同的服务器上;
-
cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者,
-
注意:cookie需要浏览器支持,且有时候会泄露数据
Sticky工作原理 : -
Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route。
1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
2.后端服务器处理完请求,将响应数据返回给nginx。
3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值
4.客户端接收请求,并保存带route的cookie。
5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。
- 实现方法:
- 在server1上对openresty,重新编译。增加sticky模块
- yum install -y unzip
- unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
./congfigure --add-moudle=/mnt/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
添加模块
[root@server1 ~]# cd /openresty
[root@server1 openresty]# ls
openresty-1.17.8.2 openresty-1.17.8.2.tar.gz
[root@server1 openresty]# cd openresty-1.17.8.2/
[root@server1 openresty-1.17.8.2]# ls
build configure Makefile README.markdown util
bundle COPYRIGHT patches README-windows.txt
[root@server1 openresty-1.17.8.2]# ./congfigure --add-module=/mnt/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
gmake
- 热部署
[root@server1 openresty-1.17.8.2]# cd /usr/local/openresty/nginx/sbin/
[root@server1 sbin]# ls
nginx
[root@server1 sbin]# mv nginx nginx.old##备份旧版本
[root@server1 sbin]# cd /openresty
[root@server1 openresty]# cd openresty-1.17.8.2/build/nginx-1.17.8/objs/
[root@server1 objs]# ls
addon Makefile nginx.8 ngx_auto_headers.h ngx_modules.o
autoconf.err nginx ngx_auto_config.h ngx_modules.c src
[root@server1 objs]# cp nginx /usr/local/openresty/nginx/sbin/
##将添加模块后的nginx复制过去
-
对nginx配置粘滞,避免请求来回跳,信息丢失
-
vim /usr/local/openresty/nginx/conf/nginx.conf
[root@server1 conf]# /usr/local/openresty/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test is successful
[root@server1 conf]# /usr/local/openresty/nginx/sbin/nginx -s reload
- 在浏览器访问测试,出现粘滞,不发生跳转
交叉存储
- Tomcat-1 (T1) 将session存储在memcached-2 (T2)上。只有当M2不可用时,T1才将session存 储在memcached-1上(M1是T1 failoverNode)。
目的:当T1和M1同时崩 溃时也不会丢失session会话,避免单点故障。 - session的序列化方案官方推荐的有4种:
- java serialization
- msm-kryo-serializer
- msm-javolution-serializer
- msm-xstream-serializer
其中性能最好的序列化方案是Kryo,此实验我们采用kryo方式。
- 在server3和server4中:
- 把下面包放置到
/usr/local/tomcat/lib
目录中
[root@server3 jar]# 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
minlog-1.2.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar
[root@server3 jar]# cp * /usr/local/tomcat/lib
[root@server3 jar]# cd /usr/local/tomcat/lib
-
这些包可从上面我的连接中下载msm.tar包,并解压得到
-
vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.91:11211,n2:192.168.0.92:11211"
failoverNodes="n1"##server4中此处写n2
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
- server3中
-
server4中
-
改变配置之后重启tomcat
/usr/local/tomcat/bin/shutdown.sh 关闭tomcat
/usr/local/tomcat/bin/startup.sh 启动tomcat
- memcached安装 (server3&server4)
yum install memcached -y
service memcached start
- 测试:在浏览器中
-
关闭server4的tomcat
-
sh shutdown .sh
-
server3中
-
查看日志,发现数据都在server3上
-
cat /usr/local/tomcat/logs/catalina.out