- 浏览: 16658 次
- 性别:
- 来自: 西安
文章分类
最新评论
最近闲的蛋疼,顺便研究下apache+tomcat+memcache,顺便记录一下。
准备工作
- apache http://httpd.apache.org/download.cgi(推荐大家选择2.2.2版本,否则还需要装apr,apr-util等)
- tomcat http://tomcat.apache.org/download-60.cgi
- mod_jk http://archive.apache.org/dist/jakarta/tomcat-connectors/jk/source/jk-1.2.15/jakarta-tomcat-connectors-1.2.15-src.tar.gz
- memcache http://memcached.org/
- xmemcache http://code.google.com/p/xmemcached/downloads/detail?name=xmemcached-1.3.8-bin-with-dependencies.tar.gz&can=2&q=
安装工作
1.apache
# tar xzvf httpd-2.22.tar.gz
# cd httpd-2.22
# ./configure --prefix=/usr/local/apache --enable-so
# make
# make install
2.mod_jk
# tar xzvf jakarta-tomcat-connectors-1.2.15-src.tar.gz
# cd jakarta-tomcat-connectors-1.2.15-src/jk/native
# ./configure --with-apxs=/usr/test/apache/bin/apxs
# make
# cp ./apache-2.0/mod_jk.so /usr/test/apache/modules/
3.memcache
这个有点多 详见http://yu-zhang430.iteye.com/admin/blogs/1601197
配置工作
# cd /usr/test/apache/conf/ 在httpd.conf最后添加一句
Include conf/jk.conf
# touch jk.conf 在jk.conf写入以下配置
LoadModule jk_module modules/mod_jk.so
JkWorkersFIle conf/workers.properties
JkLogFile conf/jk.log
JkMount /*.jsp balancer//这里负责负载均衡
JkMount /jkstatus.jsp jkstatus//这里负责显示状态
#touch jk.log
#touch workers.properties 在workers.properties写入以下配置
worker.list=balancer,jkstatus
worker.tomcat1.host=localhost
worker.tomcat1.port=8009
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1//设置负载的比重
worker.tomcat2.host=localhost
worker.tomcat2.port=8029
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1//设置负载的比重
注:这里填的port不是tomcat的端口,曾经我填为8080和8081,测试一直不成功,这里的port是2个tomcat的AJP13的端口
worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1,tomcat2
worker.balancer.sticky_session=0这里设置session是否粘帖 0为不粘帖
worker.jkstatus.type=status
到此位置负载均衡完毕。下来我们用Memcached来完成Session同步。
1.修改web.xml添加filter
<filter> <filter-name>session</filter-name> <filter-class>com.filter.SessionFilter</filter-class> </filter> <filter-mapping> <filter-name>session</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.添加filter
package com.filter; import java.io.IOException; import java.util.UUID; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet Filter implementation class sessionFilter */ public class SessionFilter implements Filter { private int timout=36000000; @Override public void destroy() { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)servletRequest; HttpServletResponse response=(HttpServletResponse)servletResponse; Cookie[] cookies=request.getCookies();//获取cookie String sessionId=""; if(cookies!=null&&cookies.length>0) { for(Cookie item:cookies) { if(item.getName().equals("sessionId")) { sessionId=item.getValue();//如果Cookie存在sessionId 重新计时 item.setMaxAge(timout); } } } if(cookies==null||sessionId.equals("")) { sessionId=UUID.randomUUID().toString(); Cookie cookie=new Cookie("sessionId", sessionId); cookie.setMaxAge(timout); response.addCookie(cookie);//如果Cookie不存在,创建cookie,生成sessionId添加到Cookie } //MyRequestWrapper装饰了httpservletrequest,我们重写一些request的方法 filterChain.doFilter(new MyRequestWrapper(sessionId,request), servletResponse); } @Override public void init(FilterConfig arg0) throws ServletException { } }
3.MyRequestWarpper.java
package com.filter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpSession; public class MyRequestWrapper extends HttpServletRequestWrapper { private String sessionId; public MyRequestWrapper(String sessionId,HttpServletRequest request) { super(request); this.sessionId=sessionId; } @Override public HttpSession getSession() { return new HttpSessionWrapper(sessionId, super.getSession());//重写getSession方法 } @Override public HttpSession getSession(boolean create) { return new HttpSessionWrapper(sessionId, super.getSession(create)); } }
3.HttpsessionWrapper.java
package com.filter; import java.util.Enumeration; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionContext; @SuppressWarnings({"deprecation","rawtypes","static-access"}) public class HttpSessionWrapper implements HttpSession { private String sid = "";//sessionId public static Map map = null;//session private int timeout=1800; private HttpSession session; public HttpSessionWrapper(String sid,HttpSession session) { this.session = session; this.sid = sid; this.map = MyMemcachedCinent.getInstance().getSession(sid,timeout); } public Object getAttribute(String arg0) { return this.map.get(arg0); } public Enumeration getAttributeNames() { return (new Enumerator(this.map.keySet(), true)); } public void invalidate() { this.map.clear(); MyMemcachedCinent.getInstance().removeSession(this.sid); } public void removeAttribute(String arg0) { this.map.remove(arg0); MyMemcachedCinent.getInstance().saveSession(this.sid,timeout, this.map); } @SuppressWarnings("unchecked") public void setAttribute(String arg0, Object arg1) { this.map.put(arg0, arg1); MyMemcachedCinent.getInstance().saveSession(this.sid,timeout, this.map); } public long getCreationTime() { return session.getCreationTime(); } public String getId() { return session.getId(); } public long getLastAccessedTime() { return session.getLastAccessedTime(); } public int getMaxInactiveInterval() { return session.getMaxInactiveInterval(); } public ServletContext getServletContext() { return session.getServletContext(); } public HttpSessionContext getSessionContext() { return session.getSessionContext(); } public Object getValue(String arg0) { return session.getValue(arg0); } public String[] getValueNames() { return session.getValueNames(); } public boolean isNew() { return session.isNew(); } public void putValue(String arg0, Object arg1) { session.putValue(arg0, arg1); } public void removeValue(String arg0) { session.removeValue(arg0); } public void setMaxInactiveInterval(int arg0) { session.setMaxInactiveInterval(arg0); } }
4.Enumerator.java
package com.filter; import java.util.Collection; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.NoSuchElementException; @SuppressWarnings({"rawtypes"}) public class Enumerator implements Enumeration { private Iterator iterator = null; public Enumerator(Collection collection) { this(collection.iterator()); } public Enumerator(Collection collection, boolean clone) { this(collection.iterator(), clone); } public Enumerator(Iterator iterator) { super(); this.iterator = iterator; } @SuppressWarnings("unchecked") public Enumerator(Iterator iterator, boolean clone) { super(); if (!clone) { this.iterator = iterator; } else { List list = new ArrayList(); while (iterator.hasNext()) { list.add(iterator.next()); } this.iterator = list.iterator(); } } public Enumerator(Map map) { this(map.values().iterator()); } public Enumerator(Map map, boolean clone) { this(map.values().iterator(), clone); } public boolean hasMoreElements() { return (iterator.hasNext()); } public Object nextElement() throws NoSuchElementException { return (iterator.next()); } }
5.MyMemcachedCinent
package com.filter; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeoutException; import net.rubyeye.xmemcached.MemcachedClient; import net.rubyeye.xmemcached.MemcachedClientBuilder; import net.rubyeye.xmemcached.XMemcachedClientBuilder; import net.rubyeye.xmemcached.exception.MemcachedException; import net.rubyeye.xmemcached.utils.AddrUtil; @SuppressWarnings({"rawtypes"}) public class MyMemcachedCinent { private static MyMemcachedCinent myMemcachedCinent; private MemcachedClient client; /** * 初始类的时候启动memcached */ private MyMemcachedCinent(){ MemcachedClientBuilder builder=new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:11211")); try { client=builder.build(); } catch (IOException e) { e.printStackTrace(); } } /** * MyMemcachedCinent单例 * @author zhangyu DateTime 2012-8-14 上午9:22:51 * @return */ public static synchronized MyMemcachedCinent getInstance() { if(myMemcachedCinent==null) { myMemcachedCinent= new MyMemcachedCinent(); } return myMemcachedCinent; } /** * 获取session * @author zhangyu DateTime 2012-8-14 上午9:18:19 * @param sid * @param timeout * @return */ public Map getSession(String sid,int timeout) { Map map=null; try { map = client.get(sid); if(map==null) { map=new HashMap(); client.set(sid, timeout, map); } } catch (TimeoutException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (MemcachedException e) { e.printStackTrace(); } return map; } /** * 添加Session或者更新Session * @author zhangyu DateTime 2012-8-14 上午9:18:32 * @param id * @param timeout * @param session */ public void saveSession(String id,int timeout, Map session) { try { client.set(id,timeout, session); } catch (TimeoutException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (MemcachedException e) { e.printStackTrace(); } } /** * 删除Session * @author zhangyu DateTime 2012-8-14 上午9:19:00 * @param id */ public void removeSession(String id) { try { client.delete(id); } catch (TimeoutException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (MemcachedException e) { e.printStackTrace(); } } }
大功告成,session是通过Cookie和memcache保存的,如果要更保险点,可以判断下用户的cookie有木有北禁用,吧sessionId拼接到url里
相关推荐
本人是UBUNTU 的操作系统,但是全部是用源码安装的,可能有些细节不一样,但总体应该没问题, 我两台虚拟机上,成功共享session ...apache+tomcat+memcached 集群 session 共享会话,apache负载均衡
apache+tomcat+memcached经试验是可以正确使用的。
apache 集群tomcat,session管理使用memcached,可部署javaweb,javaee的项目. 压缩包包含安装配置文档,apache no ssl 32bit 64bit,memcached 32bit 64bit安装文件以及tomcat所需要的jar,以及主要apache的配置文件. ...
nginx+apache+mysql+php+memcached+squid搭建门户网站
里面有tomcat7配置文件和memcached session共享所需jar包.httpd配置文件。和一些文档,我已经测试过了,能够使用,适用系统为windows
windows下Apache2.4+Memcached1.4+Tomcat7集群环境 搭建说明。 部署后的部署包另有上传,参见http://download.csdn.net/detail/ahcstone/9246701 开包即用,方便验证
tomcat + apache + memcached 集群jar包
windows下Apache2.4+Memcached1.4+Tomcat7集群环境 搭建后的部署包,开包即用,方便验证
它的优点是协议简单,内置内存存储,并且他的分布式算法是在客户端完成的,不需要服务器端进行通信,我们当时在做项目的时候因为考虑到项目的高可用性高扩展性,因此在服务器部署方面采用了apache+jk+tomcat这种负载...
Nginx+tomcat集群Memcached+Session复制 高性能高并发服务器架构 基于nginx的tomcat负载均衡和集群 实现多服务器负载均衡 系统性能优化 数据库 Nginx+Squid负载均衡 配置好的集群 总共三十个文档">Apache+Tomcat+...
tomcat7集群lib中需要添加的jar包
分别到两个tomcat下,直接双击D:\server\apache-tomcat-6.0.39_1\bin\startup.bat启动tomcat1 D:\server\apache-tomcat-6.0.39_2\bin\startup.bat启动tomcat2 出现以下页面表示启动成功 在浏览器中输入 ...
1.2添加memcached如下依赖的jar包到tomcat8.x/lib/: asm-5.1.jar couchbase-client-1.4.12.jar javolution-5.5.1.jar kryo-4.0.0.jar kryo-serializers-0.38.jar memcached-session-manager-2.0.0.jar memcached...
NULL 博文链接:https://yulinyyb001.iteye.com/blog/1308609
详细描述apache或nginx+tomcat部署方式,同时描述memcached和keepalived部署方法,以及相关脚本。
tomcat服务器+memcached缓存session共享集群,软件包中包含各种序列化策略,已测试通过。
本文主要总结了在Ubuntu10下常用Java Web应用软件的安装,特别是LNMJ Web(Linux+Nginx+Mysql+Java Tomcat)架构和LAMJ Web(Linux+Apache+Mysql+Java Tomcat)架构下的软件安装。为进一步配置和实现LNMJ和LAMJ架构(负载...
jdk加tomcat加 apache 加memcached加mysql安装配置手册.docx