###在上一篇文章tomcat配置的基础上
Nginx+tomcat+memcached
使用nginx作为前端服务器来实现tomcat负载均衡及高可用,同时基于jsp的动态特征,我们将引入memcache来保持网页在连接过程中的session保持,利用memcached把多个tomcat的session集中管理
图解:
说明:
客户端请求时nginx通过负载调度算法将请求调度至某一后端服务器;tomcat 把会话通过组播的方式复制到集群各节点;所有节点共享会话;
当memcached有两个时可以采用交叉存储,可以更好的避免单点故障
实验环境
主机 | |
---|---|
server1(nginx+tomcat+memcached) | 172.25.5.1 |
server2(tomcat+memcached) | 172.25.5.2 |
rhel6.5 selinux disable iptables stop
一.sticky(粘至)+nginx1.10实现后端服务器数据同步
1.给server1和server2的tomcat的发布目录下建立一个可以建立存储用户的test.jsp后面有内容
[root@server1 mnt]# cp test.jsp /usr/local/tomcat/webapps/
[root@server1 mnt]# scp test.jsp [email protected]:/usr/local/tomcat/
2.安装nginx1.10.1版本(更好的兼容sticky模块)
[root@server1 sbin]# cd /usr/local/openresty/nginx/sbin/
[root@server1 sbin]# ./nginx -s stop ##关掉openresty的nginx
[root@server1 mnt]# tar axf nginx-sticky-module-ng.tar.gz ##解压sticky模块
[root@server1 mnt]# cd nginx-sticky-module-ng
[root@server1 nginx-sticky-module-ng]# ls
basic.t docs ngx_http_sticky_misc.h README.md
Changelog.txt LICENSE ngx_http_sticky_module.c
config ngx_http_sticky_misc.c patches
[root@server1 nginx-sticky-module-ng]# cd ..
[root@server1 mnt]#
[root@server1 mnt]# tar zxf nginx-1.10.1.tar.gz
[root@server1 mnt]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# vim src/core/ng ###修改版本号
[root@server1 nginx-1.10.1]# vim auto/cc/gcc ###注释debug日至
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/mnt/nginx-sticky-module-ng ##编译时添加sticky模块
[root@server1 nginx-1.10.1]# make && make install
[root@server1 nginx-1.10.1]# cp /usr/local/openresty/nginx/conf/nginx.conf /usr/local/lnmp/nginx/conf/nginx.conf 拷贝openresty的nginx的
配置文件
3.编辑配置文件
[root@server1 nginx-1.10.1]# cd /usr/local/lnmp/nginx/conf/
[root@server1 conf]# vim nginx.conf
http {
upstream tomcat {
#此处不填写算法,默认使用轮叫算法roundrobin
sticky; ##添加sticky模块
server 172.25.5.1:8080;
server 172.25.5.2:8080;
}
[root@server1 conf]# cd ..
[root@server1 nginx]# cd sbin/
[root@server1 sbin]# ./nginx -t
[root@server1 sbin]# ./nginx
测试
在网页上http://172.25.5.1:/test.jsp添加用户时不管后端那台服务器,添加的信息不会丢失
但是这种万一台服务器崩了,前面的数据就没了,所以我们要配置Nginx+tomcat+memcached实现负载均衡及session(交叉存储)
二. nginx+tomcat+memcached负载均衡以及session共享
server1:
[root@server1 mnt]# cd /usr/local/tomcat/logs/
[root@server1 logs]# > catalina.out ##清空前面添加的数据
[root@server1 tomcat]# cd lib/
[root@server1 lib]# cp /mnt/jar/* . ##将jar所以包放进ltomcat的lib目录下
[root@server1 tomcat]# cd conf/
[root@server1 conf]# vim context.xml ##编辑在文章的最后添加
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.5.1:11211,n2:172.25.5.2:11211"
failoverNodes="n1" 此处为n1
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@server1 conf]# scp context.xml [email protected]:/usr/local/tomcat/conf/ ##给server2发送过去
[root@server1 mnt]# cd jar/
[root@server1 jar]# scp * [email protected]:/usr/local/tomcat/lib/ 在将jar里面的软件包给server2的tomcat的lib目录发送过去
[root@server1 mnt]# cd /usr/local/tomcat/bin/
[root@server1 bin]# /etc/init.d/memcached start ##开启memcache
[root@server1 bin]# ./shutdown.sh ###重新启动shutdown
[root@server1 bin]# ./startup.sh
server2:
[root@server2 webapps]# cd /usr/local/tomcat/bin/
[root@server2 bin]# yum install -y memcached ##下载memcache
[root@server2 bin]# /etc/init.d/memcached start ##开启memcache
[root@server2 bin]# cd ..
[root@server2 tomcat]# cd conf/
[root@server2 conf]# vim context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.5.1:11211,n2:172.25.5.2:11211"
failoverNodes="n2" ##修改为n2
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@server2 tomcat]# cd lib/ ##查看lib下面的东西是否齐全
[root@server2 bin]# ./shutdown.sh
[root@server2 bin]# ./startup.sh
测试:
###在网页上http://172.25.5.1:/test.jsp
#建立用户,如果其中一台tomcat挂了
#另外一台tomcat主机会自动存储数据
#####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>