在实际项目中,因为用户的访问量很大的缘由,每每须要同时开启多个服务器才能知足实际需求。可是同时开启多个服务又该怎么管理他们呢?怎样实现session共享呢?下面就来说一讲如何使用tomcat+nginx搭建服务器集群以及如何实现session共享。css
环境:html
apache-tomcat-6.0.29+apache-tomcat-6.0.29+jdk1.6+win7(因为本身只是作了一个demo,j就没有用到服务器系统了)java
1.首先咱们准备两个tomcat(tomcat1,tomcat2),并将端口修改成不同。个人tomcat1是8089,tomcat2是9089。修改端口的位置在tomcat文件的conf->server.xml文件的位置:nginx
2.为了后面区分咱们到底访问的是哪一个tomcat,因此这里咱们修改一下tomcat首页的信息,在tomcat1文件夹下webapps->ROOT->index.html,在最前面我加上了<span style="color:red">this is tomcat one</span>,一样在tomcat2下添加<span style="color:red">this is tomcat two</span>。web
3.接下来咱们开始准备nginx。nginx也是一个服务器,这里咱们主要是用来作代理和负载均衡的。当咱们下载完nginx直接解压就能够用。要运行nginx能够直接点击nginx.exe,也可使用命令的模式:start nginx启动nginx,nginx -s stop中止nginx。apache
4.启动nginx后,咱们在浏览器输入127.0.0.1,出现以下界面就表明nginx已近启动了:浏览器
5.接下来咱们来配置nginx来作代理服务器和负载均衡:tomcat
打开nginx文件下的conf->nginx.conf文件,在hettp中添加服务器
upstream 127.0.0.1{//这个127.0.0.1能够随便取个名字 server 127.0.0.1:8088 weight=1; #服务器A server 127.0.0.1:9088 weight=1; #服务器B }
在server中的location添加:session
proxy_pass http://127.0.0.1; #访问js,图片等须要作代理
其余的如今不用配置,配置完了以下:
说明:
1)server后的ip即便tomcat的ip,weight表示权重,weight越大,对应服务器被访问的几率越大,如果相等,几个服务器轮流被访问;
2)proxy_pass 后的http必须加上;
这是咱们启动tomcat1,tomcat2,nginx,在浏览器中输入127.0.0.1,而后刷新,这时咱们会看到tomcat1和tomcat2的页面交替显示,这就表示nginx已经负载了两个tomcat,能够将请求转发到不一样的tomcat。
6.下面咱们就来解决session的问题了
这里须要将如下jar包放到tomcat的lib文件里面
这些jar包我已上传,下载地址:http://files.cnblogs.com/mouseIT/nginx%2Cmemcached%EF%BC%8Ctomcat%E9%9B%86%E7%BE%A4%E7%9A%84jar%E5%8C%85.rar
而后在tomcat的context.xml中添加如下数据:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:127.0.0.1:11211" sticky="false" sessionBackupAsync="false" lockingMode="auto" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory" />
以下:
为了实现session共享,这里咱们还须要使用的memcached。
将下下来的memcached直接解压,点击memcached.exe。这是只有一个窗口,什么都看不见,回车后输入命令stats,看见以下表示正常:
为了测试,咱们建一个web项目,记得要在web.xml的web-app中添加<distributable/> 这样服务器才知道这是分布式的。
同时咱们创建默认的登录页面,内容以下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> this is tomcat one Server Info: <% String path = request.getContextPath(); out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%> <% out.println("<br> ID " + session.getId()+"<br>"); // 若是有新的 Session 属性设置 String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.println("<b>Session 列表</b><br>"); System.out.println("============================"); 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="<%=path%>/login.jsp" method="POST"> 名称:<input type="text" size=20 name="dataName"> <br> 值:<input type="text" size=20 name="dataValue"> <br> <input type="submit"> </form> </body> </html>
这个是在网上收的,具体的原理我就再也不阐述了。
而后咱们依次启动memcached->tomcat->nginx。注意必定要最早启动memcached,否则启动tomcat时会出错。
而后咱们访问127.0.0.1/tomcat下的web项目名
进入主页面后,咱们输入名称和值,而后点击提交(这时注意tomcat的窗口),我输入的是abc,123,点击提交后,tomcat1出现以下:
而后咱们刷新浏览器,观察tomcat2的窗口,也会出现上面的数据:
这就表示tomcat2得到了session的数据,tomcat1,tomcat2实现了session共享。
今天总结的这些只是一个简单的应用,还有不少的细节没有说。这些也是我才学会的。之后还有什么好的东西会继续和你们分享,你们共同探讨!