tomcat结合nginx
一、tomcat简介及安装
1.tomcat介绍
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。(Tomcat 不太适合高并发,解决方法,增加后端数量)
tomcat 启动前需要配置JDK环境变量,如果没有配置JDK的环境变量,那么tomcat启动的时候就会报错,也就是无法启动。
JDK 是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
2.nginx结合tomcat
Tomcat和Nginx的区别:
tomcat一般做动态解析才会用得到,支持jsp的解析,需要配置JDK支持。
nginx,则一般是做静态,本身不具备动态解析功能,需要配置其他插件或通过其他软件协同才具备动态功能,比如php,tomcat,或者proxypass到win2008的iis服务器做ASP的动态链接等,但nginx在静态上的功能非常强大,也可做访问控制,而且可以做成各种协议负载服务器。
动态静态资源分离:
之前开发web方面的程序时候我们习惯将html、css等资源文件也放置于Tomcat中,用户访问后tomcat需要将请求的这些静态资源文件一并返回给用户。再者如果有多台同业务逻辑的tomcat服务器的话,同样的资源还需要在每个服务器上放一份,同时也增加了tomcat服务器的网络IO。
如果我们只将JSP之类的请求交给tomcat,在代理服务器上存放静态资源,当用户的请求非动态资源的时候,我们完全可以将代理服务器的静态资源直接返回给用户,而不去增大Tomcat的压力,tomcat只需要负责逻辑处理和动态资源的加载就可以了。
同时,Tomcat的高并发性能很弱,所以在处理静态请求的时候,我们就抛给Nginx处理,而Tomcat专门处理动态请求。
Nginx和Tomcat结合方式
1. 将所有静态页面交给nginx,动态请求交给后端tomcat处理。
2. 将所有请求交给后端tomcat服务器处理,只利用Nginx自身的负载均衡功能进行多台tomcat服务器调度流。
3.tomcat 结合Nginx
为了实现tomcat集群之间的session同步:利用memcached实现(MSM工具)。memcached存储session,并把多个tomcat的session集中管理,前端在利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。即通过MSM工具把Tomcat的Session序列化后保存到Memcached里面,从而实现Session共享。
MSM介绍:
MSM是一个高可用的Tomcat Session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,还可使用Memcached存取Session,以实现高可用。
传统tomcat集群,会话复制随着结点数增多,扩展性成为瓶颈。MSM使用memcached完成统一管理tomcat会话,避免tomcat结点间过多会话复制。
MSM利用Value(Tomcat 阀)对Request进行跟踪。Request请求到来时,从memcached加载session,Request请求结束时,将tomcat session更新至memcached,以达到session共享之目的, 支持sticky和non-sticky模式:
sticky : 会话粘连模式(黏性session)。客户端在一台tomcat实例上完成登录后,以后的请求均会根据IP直接绑定到该tomcat实例。
no-sticky:会话非粘连模式(非粘性session)。客户端的请求是随机分发,多台tomcat实例均会收到请求
下面给出一个黏性session模式的设置示例,此实例中安装了2个tomcat以及2个memcached。
交叉存储:Tomcat-1(t1)的首要选择是把session存储在memcached-2 (m2)上(m2是t1的一个普通节点),而m2是运行在另外的一台机器上。只有当m2不可用(宕机或无法访问)时,t1才会把session存储到memcached-1(m1,m1是t1的故障转移节点)上。使用这种配置,即使机器1宕机了session也不会丢失。具体如下图所示:
4.tomcat和jdk软件下载
server5开启原生nginx
关闭server6和server7的apache
server6上安装jdk和tomcat并启动
用负载均衡的方式用nginx结合tomcat
启动tomcat
server7上安装jdk和tomcat并启动
二、修改server5的nginx配置文件
三、客户端访问测试
复制jsp文件到server6和server7下的tomcat的默认发布目录下
四、nginx+tomcat+memcached建立cession共享
交叉式存储框图
在做项目时存储都是另外算,因为存储很重要,而且加上存储后会变得很复杂。除了交叉存储方案,还可以用商用的共享存储,也就是raid存储阵列,自带高可用,冗余机制,但是成本太高。
MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。
Memcache官方网站:Memcache官网
核心优化概述
什么是优化:以更小的资源支持更大负载网站的运行,以小博大。
思路:尽量减少用户等待时间,节省系统资源开销,节省带宽使用。
优化的三方面:Memcache内存缓存技术、静态化技术、mysql优化
>tomcat的cession信息除了在memcache会存储,本机的内存中也有一份存储信息。memcaceh只是临时存储,没有持久化,只是将tomcat的cession信息临时存一份到memcache,以便于tomcat出现故障时,另一台tomcat从中获取信息。使用tomcat的session管理器,默认将sesion信息交叉存储,当出现故障时可以存储在本地的memcache,这两个memcache的地址都需要告知tomcat。交叉存储的好处,是任何一个业务单点出现故障,都可以自动高可用自动冗余,及时整个节点down掉也不影响,除非两个tomcat都坏掉。memcache本身就是临时存储,没有持久化,把tomcat的session信息临时存一份进来,以便于其中一个tomcat故障时,另一个tomcat可以从中获取信息。
关闭server6的tomcat,并修改配置文件信息
server6主机上设置
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.16:11211,n2:172.25.254.17:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
#这里调用的是java的类
/>
因为上面的配置文件调用了java的类,所以复制jar包(java的压缩包)到tomcat的lib库目录下
tc6是针对tomcat的6版本,memecache-session-manager(session管理器)是tomcat的java类可以直接调用,简称MSM,可以把session数据存储到memcahe
安装memcached,并启动
server7主机上进行相设置
启动server6的tomcat,查看日志信息
启动server7的tomcat,查看日志信息
测试:
server2和server3通过tomcat+memcache+MSM自己解决了高可用和sesion共享,但并没有用共享存储,是策略解决的,共享存储会提高成本,所有的session信息都是存储在tomcat内存上,memcache只是临时存储,没有持久化,down掉就没了
安装telnet,查看memcache
telnet命令使用详解
模拟故障:关闭server7的tomcat
启动server7的tomcat,关闭server6的memcache进行测试
关闭server6的tomcat进行测试
现在tomcat的memcahe都在一个节点上,该节点如果down了,会出问题,因为现在不是交叉存储的,交叉存储时,整个节点down掉没有问题
恢复交叉存储
启动server6的memcache
停止server7的memcached
注意:memcache会对重复信息进行剔除,所以tomcat内存从memcache恢复信息时,不会恢复重复信息