nginx+memcache+tomcat 应该是企业级开发中用到的比较多的一套集群web环境,由于本人是从事Java的学习和开发,所以服务器选择了tomcat;配置这样一个环境在我看来首要目的固然是将服务器的压力分散开,用多台服务器来处理大用户的并发,并经过缓存来减小对服务器的请求量,同时一个应用分布在不一样服务器上就须要作session共享。大概的结构我想应该是这样:html
这样一来请求会被分派到这图中5个tomcat下的项目去处理,固然有时候服务器须要处理更大的并发量则须要更多的nginx来做为代理转发并须要更多的tomcat节点(固然也有牛人能把tomcat配到数千并发量,这样也不必定须要太多tomcat)java
我将从windows上给你们讲个人配置过程,至于在linux上其实差不太多,只是在安装memcache和nginx上有差别,对于配置来讲都同样。下面简单来介绍下个人操做步骤(JDK和tomcat部分的安装省略)linux
1、所需环境和软件nginx
Tomcat7,下载连接:http://tomcat.apache.org/ web
Nginx是nginx-1.2.8,apache
下载连接:http://nginx.org/en/download.htmlwindows
Memcached是memcached-1.2.6-win32-bin,下载连接:http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip,浏览器
其余所需jar包,以下列表:缓存
memcached-session-manager-1.6.1,memcached-session-manager-tc6-1.6.1(由于Tomcat版本为6.0)tomcat
javolution-5.4.3.1,msm-javolution-serializer-1.6.1(准备使用javolution序列化方式)
spymemcached-2.7.3(依赖包),以上jar包在http://code.google.com/p/memcached-session-manager/downloads/list中均可以找到,文档http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration中详细介绍了不一样的服务器版本,不一样的jar包需求。
2、Tomcat配置
这里咱们就配置俩tomcat来意思意思。。。。
进入tomcat配置文件context.xml,我设置么配的(具体为何这么配我还真有点说不出123,大体有感受罢了)
也就是红框是咱们须要加的了,这里就是配置session共享,经过memcache来保存session信息。
memcacheNode是你有几个memcache就能够配几个节点,我这里写了两个告诉你们若是你有多个须要配置的节点 用空格断开,前面写节点名。
固然网上有的是把这部分配到server.xml的Engine节点下,我试了若是不在context下配置个人会报错,不知道他们还有哪里和我不同。再就是这里的memcacheNode的IP,我写localhost也有问题,必须写127.0.0.1才能链接到memcache的服务。 若是有人发现我配置上的问题能够帮我一并指出。
而后你们能够去server.xml下找<Engine>节点,在其中添加属性 jvmRoute="tomcat n" n就是第n个tomcat你本身写 后面测试的时候打印sessionId会显示出来如今用的是那个 tomcat。固然server.xml最重要的配置还不是在这,是你须要配置三个端口保证和其余的tomat不会冲突,分别在这里
注意tomcat端口默认都是8080 ,你们作开发习惯了这个端口,都把端口配到808*,可是这样会有问题,好比你要配4个tomcat集群,一个tomcat 要配置3个端口,都在808*上就势必有重复,所以不是很好的决策,因此我是这么定的:分别放在 900* 808* 810*上,而后建议你们在tomcat根目录建一个文件名叫8081-8100-9006 相似这样文本文件提示本身当前这个tomcat的端口配置,如今只有俩服务器,不然服务器多了你一个个开配置文件看太麻烦。
配置完了,还有memcache支持的jar,复制到lib下便可,固然版本尽可能对上或者贴近。
3、nginx的安装
载下来的nginx,个人是1.8,解压完就这样
双击nginx.exe是能够启动nginx的,可是你并不能看见什么反应,由于他在你后台进程里跑,打开任务管理器看服务里面会有nginx的服务开着,就好了。固然我仍是推荐你们用命令模式操做nginx
开启nginx: nginx
关闭nginx: nginx -s stop
重启nginx: nginx -s reload
这里注意nginx的核心配置文件在 conf目录下,有个nginx.conf文件,这里是咱们须要配置的地方。
nginx配置文件结构我不全了解,我就说我知道的几个点。
Nginx配置文件主要分为4部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和location
首先server表明了一个虚拟主机,在这个块中能够配置主机名和location,这两个块也就是咱们要用到的nginx反向代理,将虚拟地址映射到实际的服务器地址。实际的服务器地址咱们配置到一个upstream块中,那么既然咱们作了集群,将大量的请求分派到5个甚至多个tomcat下,那么请求怎么访问它们呢?这里就有请求分配的策略了。upstream模块的负载均衡分配方式 我在网上查了有5种:轮询,权重,ip_hash,url_hash和平均。轮询比较好理解就是从第一个轮流来访问;权重就是在配置这个节点的时候就分配给他一个优先级(有点像线程优先级),ip_hash 每一个请求按照其请求IP的hash结果分配,url_hash 按照url的hash结果分配 平均分配就是按照服务器响应时间来分配,响应时间小的先分配。
讲到这里nginx配置的理论就差很少了,那么来看下配置的细节,下面是个人部分配置:
这里我将两台tomcat加入负载均衡配置中,location指的是server_name后项目名,也就是说咱们访问http://localhost/tonghang 将会定向到 http://127.0.0.1:8081/tonghang 和http://127.0.0.1:8082/tonghang 上。proxy_pass 指定了代理的目标主机IP,这里写的是upstrean块的地址(我不是很懂暂时这么说),由upstream中指定有哪些要映射的IP,固然咱们也能够写到外面,用不少个proxy_pass来映射。
4、memcache安装
windows下安装memcache就是安装一个exe文件,linux下安装可能还须要安装部分依赖库,由于我所在的服务器下就带有memcache,我先在win下配置好后再去linux下直接用的,用起来没有什么问题,因此安装细节就不提了你们能够去看别的技术文章,win下安装就是 来到你解压的memcached.exe所在目录用命令 memcached.exe -d install 便可。启动的话就是执行memcached.exe -d start linux下是memcached -d -uroot 重复开memcache貌似不会出现端口占用的问题应该是它内部作处理了
好了,到这里基本的配置完毕,咱们能够去两个tomcat下部署两个同样web项目(我这里叫tonghag),项目下都有一个index.jsp,内容以下:
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <html> <body> <h2>Hello World!</h2> <% String tmp = (String)session.getAttribute("tmp"); if(tmp == null || tmp == ""){ session.setAttribute("tmp","i am created in tomcat 2 . my id is : "+session.getId()); tmp = (String)session.getAttribute("tmp"); out.println(" null now to created value !"); out.println("<br/>"); out.println(tmp); System.out.println(tmp); }else{ out.println(tmp); System.out.println(tmp); } %> </body> </html>
逻辑就是每当发现请求中没有sessionid就建立session,按道理若是没有配置memcache的session共享,分别访问 http://localhost:8081/tonghang http://lcoalhost:8082/tonghang 会获得不一样的sessionID,若是你经过上述的配置sessionID在一个浏览器上的访问都是同样的。
在测试一下 http://localhost/tonghang 试试看。你会发现也能看当刚才的界面,这就是咱们作了反向代理的结果,并且你还会发现你的两台tomcat的控制台在挨个输出日志,这也就达到了咱们负载均衡的效果,由于我配置了两台tomcat并且权重同样,也就是说访问的概率差很少,而两台tomcat原本就是一台复制一台的,因此几乎是121212的访问(和轮询差很少)。因此你们能够尝试给其中一台配置权限高一点,日志输出分布也就明显了。或者能够试试其余的策略。
ngxin+tomcat+memcache的负载均衡,反向代理和session共享的相关配置介绍完了,单纯这样用是看不出什么实际用途的,须要咱们将其和实际项目联系起来。在项目访问量级相对较大的时候就能看出来了。毕竟那么多企业的项目再用这套架构,也不是徒有虚名嘛。
小弟第一次作集群的配置,其中若是有配置的不对让我误打误撞试出来的,也请指点一下。而且我一直不清楚一个地方就是 我在配置tomcat的context.xml 那个memcacheNode里面我若是只配一个节点就会错,log意思好像是没法链接memcache服务,配俩同样的就好了。这里我一直没明白,有知道怎么回事儿的身边给我留个言吧!