你的位置:首页 > ASP.net教程

[ASP.net教程]Nginx + Tomcat + Memcached 集群


 

  1. 一开发环境
  2. 二Nginx  Tomcat 实现负载均衡
  3. 三tomcat  memcached 实现session复制与同步
  4. 四测试
 

Nginx + Tomcat + Memcached 的集群至少要考虑到2个方面的问题:

1. 如何实现负载均衡?

2. 如何实现session复制与同步?

本文搜集了网上相关的材料,将Nginx + Tomcat + Memcached 的集群在window下的搭建过程总结如下。

【java框架源码下载】

一、开发环境

 

1. nginx版本:1.8.0

2. tomcat版本:7.0.55

3. memcached版本:1.4.13

4. session复制同步使用memcache-session-manager最新版本:1.6.3

5. 操作系统:Win7

二、Nginx + Tomcat 实现负载均衡

1. nginx 和 tomcat的下载安装

这里就不多说了,具体可以参见 nginx 和 tomcat 的下载安装

2. nginx配置

打开nginx的主配置文件:D:\nginx-1.8.0\conf\nginx.conf, 主要要修改代理转发服务器ip和端口,weight 为服务器权重,数字越高代表被访问的几率越大:

[html] view plaincopyprint?

  1. upstream local_tomcat {  
  2.    server localhost:18080 weight=1;   
  3.           server localhost:18081 weight=1;   
  4. }   
  5.   
  6.    server {  
  7.        listen       80;  
  8.   
  9.        location / {  
  10.            root   html;  
  11.            index  index.html index.htm;  
  12.            proxy_pass http://local_tomcat;   
  13.        }  
  14.    }  

	upstream local_tomcat {	  server localhost:18080 weight=1;      server localhost:18081 weight=1; 	} 	  server {    listen    80;    location / {      root  html;      index index.html index.htm;      proxy_pass http://local_tomcat;     }  }

 

三、tomcat + memcached 实现session复制与同步

tomcat session复制与同步的问题通常是采用memcached,或者采用nginx_upstream_jvm_route ,他是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。如果tomcat过多不建议session同步,server间相互同步session很耗资源,高并发环境容易引起Session风暴。请根据自己应用情况合理采纳session解决方案。

下文介绍了采用memcached (memcache-session-manager)来管理session

1. memcached 下载安装 (略)

2. 下载相关的jar包

这里有很多jar包需要去下载,各个jar的版本还不能弄错,我这里提供了一整套需要下载的jar包 (已经测试可用),需要下载的请点击 链接 下载。

3. 配置session 共享

好了,把上述jar包放到tomcat/lib 目录下,修改每个tomcat的配置文件tomcat\conf\context.

    a. 配置tomcat

修改tomcat\conf\server.

 

[html] view plaincopyprint?

  1. <Server port="8005" shutdown="SHUTDOWN">  

<Server port="8005" shutdown="SHUTDOWN">
[html] view plaincopyprint?

  1. <Connector port="18080" protocol="HTTP/1.1"  
  2.            connectionTimeout="20000"  
  3.            redirectPort="8443" />  

  <Connector port="18080" protocol="HTTP/1.1"        connectionTimeout="20000"        redirectPort="8443" />
[html] view plaincopyprint?

  1. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />  

  <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
[html] view plaincopyprint?

  1. <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">  

  <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

修改tomcat\conf\context.

 

 

[html] view plaincopyprint?

  1. <Manager    
  2.     className="de.javakaffee.web.msm.MemcachedBackupSessionManager"    
  3.     memcachedNodes="<span attribute-value">color:#FF0000;"><strong>n1:127.0.0.1:11211</strong></span>"    
  4.     sticky="false"    
  5.     sessionBackupAsync="false"    
  6.     lockingMode="uriPattern:/path1|/path2"    
  7.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"    
  8.     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>  

	<Manager 		className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 		memcachedNodes="<span ><strong>n1:127.0.0.1:11211</strong></span>" 		sticky="false" 		sessionBackupAsync="false" 		lockingMode="uriPattern:/path1|/path2" 		requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 		transcoderFactory/>

(注意2个tomcat的配置里面memecachedNodes 的都是 n1:* )

 

    b. 修改应用jsp

我使用的是tomcat自带的examples project,将下面的jsp直接替换D:\nginx-1.8.0\Tomcat\tomcat-node1\webapps\examples\index.html

 

[html] view plaincopyprint?

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ page import="java.text.SimpleDateFormat"%>  
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.   <head>  
  6.     <title>Tomcat集群测试</title>  
  7.   </head>  
  8.   <body>  
  9.     <%  
  10.         out.print("["+request.getLocalAddr()+":" +request.getLocalPort()+"]" + "<br/>session id:" + session.getId());   
  11.     %>  
  12.   </body>  
  13. </html>  

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ page import="java.text.SimpleDateFormat"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <title>Tomcat集群测试</title> </head> <body>  <%		out.print("["+request.getLocalAddr()+":" +request.getLocalPort()+"]" + "<br/>session id:" + session.getId());   %> </body></html>

四、测试

启动nginx、memcached 和 2个tomcat,使用浏览器访问 http://localhost/examples/ ,比较nginx服务器返回的2次页面,发现2次的端口不一样但是session一样代表Nginx + Tomcat + Memcached 的集群搭建成功。