Tomcat安装、配置、优化及负载均衡详解
http://www.javashuo.com/article/p-tpsevaku-bb.html
1、常见JavaWeb服务器css
一、WebLogic:是BEA公司的产品、WebSphereAS:是IBM公司的产品、JBossAS:红帽公司的产品,能够自行了解 二、Tomcat服务器: Sun公司在推出的小型Servlet/JSP调试工具的基础上发展起来的一个优秀的Servlet容器,Tomcat自己彻底用java语言编写,因此tomcat的运行须要java的支持,因此要先安装JDK,才能运行。目前是Apache开源软件组织的一个软件项目,它的官网 http://tomcat.apache.org。获得了广大开源代码志愿者的大力支持,且能够和目前大部分的主流Web服务器(IIS、Apache服务器)一块儿工做,它运行稳定、可靠且高效。已成为目前开发企业JavaWeb应用的最佳Servlet容器选择之一。目前最新版本8.0
2、Tomcat的目录结构及经常使用配置
一、Tomcat的目录层次结构
bin: 存放启动和关闭Tomcat的脚本文件
conf: 存放Tomcat服务器的各类配置文件
lib: 存放tomcat服务器支撑的jar包
logs: 存放Tomcat的日志文件
temp: 存放Tomcat运行时产生的临时文件
webapps:web应用虽在目录,即供外界访问的web资源的存放目录
work: Tomcat的工做目录
二、JavaWeb应用的组成结构
mail---------------------------Web应用所在目录
|----html、jsp、css、js等文件,根目录下的文件外界能够直接访问
|----WEB-INF目录
|---------classes目录(java类)
|---------lib目录(java类运行所需的jar包)
|---------web.xml(web应用的配置文件)
WEB-INF 这个目录下的文件外界没法直接访问,由web服务器负责调用
三、JavaWeb应用的发布
开放式目录方式:
打包war方式: 使用 Jar -cvf *.war .
四、Tomcat的组成结构
Tomcat自己由一系列可配置的组件构成,其中核心组件是Servlet容器组件,它是全部其余Tomcat组件的顶层容器。每一个组件均可以在Tomcat安装目录/conf/server.xml文件中进行配置,每一个Tomcat组件在server.xml文件中对应一种配置元素。下面用XML的形式展现各类Tomcat组件之间的关系
复制代码
<Server>表明整个Servlet容器组件,是最顶层元素,能够包含一个或多个<Service>元素
<Service>包含一个<Engine>元素以及一个或多个<Connector>元素,这些<Connector>共享一个<Engine>
<Connector/>表明和客户程序实际交互的组件,负责接收客户请求,以及向客户返回响应
<Engine>每一个<Service>元素只能包含一个<Engine>元素,它处理在同一个<Service>中全部<Connector>接收到的客户请求
<Host>在一个<Engine>中能够包含多个<Host>,它表明一个虚拟主机(即一个服务器程序能够部署在多个有不一样IP的服务器主机上),它能够包含一个或多个应用
<Context>使用最频繁的元素,表明了运行在虚拟主机上的单个web应用
</Host>
</Engine>
</Service>
</Server>
复制代码
五、Tomcat体系结构html
六、虚拟目录的映射方式 从Tomcat6开始,Tomcat支持自动映射,即tomcat服务器会自动管理webapps目录下的全部web应用,并把它映射成虚拟目录,换句话说,只需把web应用放在webapps目录下,不须要配置Context,外界能够直接访问 可是若是你不想讲项目放在webapps下,而是放在其余地方,仍是须要配置Context,好比个人tomcat在C盘,个人项目在D盘,则须要在Host下增长以下虚拟目录映射语句
<Contextpath="/myapp"docBase="D:/work/myapp"></Context>
七、Context元素配置java
tomcat在加载一个web应用时,会一次按照如下五种方式查找web应用中的<Context>元素,优先级一次下降,直到找到为止 1):到Tomcat安装目录/conf/Context.xml文件中查找<Context>元素。 2):到Tomcat安装目录/conf/[enginename]/[hostname]/context.xml.default文件中查找<Context>元素。 [enginename]:表示<Engine>的name属性 [hostname]:表示<Host>d的那么属性 3):到Tomcat安装目录/conf/[enginename]/[hostname]/[contextpath].xml文件中查找<Context>元素 [contextpath]:表示单个Web应用的URL入口 4):到Web应用的META-INF/context.xml文件中查找<Context>元素 5):到Tomcat安装目录/conf/server.xml文件中查找<Context>元素。只适用于单个Web应用 八、将项目部署为Tomcat默认应用 即访问 http://localhost:8080 时出来的是tomcat自带的欢迎页面,改成登陆到本身的项目主页 方法一: 在Tomcat默认安装后,tomcat的主目录是webapps/root目录,因此若是想改变tomcat的主目录的话能够以下所作: 在/conf/server.xml文件的<Host></Host>之间加入代码
<Contextpath=""docBase="C:\tomcat7\webapps\myapp"reloadable="true"debug="0"></Context>
<!--
docBase改成本身须要的项目路径
若是创建了Apache和tomcat集群,Apache server 的默认端口是80 ,IE访问的方法只需输入:http://localhost,就能够自动定位到xx工程下面去
-->
方法二:web
将tomcat安装目录下的ROOT下的全部文件删除,换成本身项目的文件,此法有点暴力 方法三: Tomcat5.0如下版本在C:/Tomcat/conf/Catalina/localhost目录下会自动生成了一个ROOT.Xml,可是5.0以上版本再也不生成此文件,因此能够新建个ROOT.xml,在里面加入以下代码:
<?Xml version='1.0' encoding='utf-8'?>
<ContextcrossContext="true"docBase="C:\tomcat7\webapps\myapp"path=""reloadable="true">
</Context>
<!--可是我本身在7.0版本上测试好像未成功,你们能够本身试试-->
九、Context元素的属性apache
path: 指定访问该Web应用的URL入口 docBase: 指定Web应用的文件路径,能够写绝对路径,也能够写相对于appBase属性的相对路径 className:指定实现Context组件的Java类的名字,这个类必须实现org.apache.catalina.Contex接口,该属性默认值为org.apache.catalina.core.StandardContext(不建议你们改动) reloadable:若是为true,Tomcat服务器在运行状态下回监视在WEB-INF/classes和WEB-INF/lib目录下的class文件的改动,以及监视Web应用的WEB-INF/web.xml文件的改动,若是检测到有更新,服务器会自动更新加载web应用。其默认值为false。在开发和调试阶段,将其改成true,通常像Eclipse等开发环境都会默认改成true。在正式发布阶段,应将其该为false,能够下降Tomcat的运行负荷,提升Tomcat的运行性能 在通常状况下,<Context>元素都会使用默认的标准Context组件,即className属性采用默认值org.apache.catalina.core.StandardContext,它除了拥有上面介绍到的属性外,还有自身专有的属性: cachingAllowed:是否容许启用静态资源(HTML、图片、声音等)的缓存。默认值为true。 cacheMaxSize:设置静态资源缓存的最大值,单位为K。 workDir:指定Web应用的工做目录。 uppackWAR:若是为true,会把war文件展开为开放目录后再运行。为false,直接运行war文件。默认值为true。 十、web.xml文件 该文件必须放在/WEB-INF目录下,可是从7.0版本开始,Tomcat能够不使用web.xml文件,而是使用注解方式。
3、Tomcat的优化
一、内存使用配置
Tomcat是依赖于JVM的,因此Tomcat的使用内存配置实质上是JVM的内存配置
在/bin目录下的catalina.bat能够直接经过Tomcat设置JVM内存参数,windows下
打开catalina.bat文件,在大概中间的位置,找到
set "JAVA_OPTS=%JAVA_OPT% -server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true"
经过内存设置充分利用服务器内存
-server: 模式启动应用慢,可是极大程度提升运行性能
-Xms2048m -Xmx2048m: 设置的是堆内存
java8开始,PermSize被MetaspaceSize代替,MetaspaceSize共享heap,不会再有java.lang.OutOfMemoryError:PermGen space,能够不设置
Headless=true: 适用于Linux系统,与图形操做有关,如生成验证码含义是当前的是无显示器的服务器,应用中若是获取系统显示有关的参数会抛出异常,windows系统可不用设置
可经过jmap -heap process_id查看设置是否成功windows
二、最大链接数配置(并发能力) 在/conf/server.xml里进行配置 在<Connector>属性中 将protocol属性改成 "org.apache.coyote.http11.Http11NioProtocol",NIO模型的效率更高 加入 maxThreads="500" //当前能够同时处理的最大用户访问数 minSpareThreads="100" //最小空闲线程链接数,用于优化线程池 maxSpareThreads="200" acceptCount="200" //当全部的线程以分配,仍然容许链接进来,可是出于等待状态的用户数。等待线程数+工做线程数=总的可最大链接数,若是超过此数,新的链接将不会被接受,就会产生一个http错误 enableLookups="false"//是否容许DNS反查,若是为true,request.getRemoteHost会执行DNS查找,反向解析ip对应域名或主机名,当没有这样须要的时候,能够将这个功能关闭,在必定程度上提升了Tomcat服务器的性能
4、负载均衡配置
负载均衡是提升应用负载量和容错的有效手段,能够结合Nginxs与Tomcat实现,Nginx是一款性能优异的反向代理服务器
一、负载均衡配置实现
反向代理原理示意图:缓存
负载均衡示意图: 负载均衡策略: Nginx 提供轮询(round robin)、用户IP哈希(client IP)和指定权重 3 种方式 二、负载均衡时Session的处理策略 Session是Tomcat服务器上的内存空间,若是一个用户发出多个请求,却发到了多个tomcat服务器中,那么就会出现Session不一样步的问题 解决方案1:将一个用户的请求锁定到某一台服务器上,简单,可是缺少容错性,一旦某个服务器发生故障,Session可能丢失,(可是服务器发生故障是一个低几率事件,若是一个服务器常常挂掉,要么是硬件有问题,要么是应用有问题) 可使用用户IP哈希实现 解决方案2:Session复制策略,基于网络的广播策略,一个节点Session变化,其余节点同步复制,具备容错性,但节点多或复制量大时对网络负荷大,使网络效率低下,甚至阻塞 ① 在/conf/server.xml文件中开启Session复制的选项,将<Cluster>注释去掉,7.0默认值以配置好,须要接收器<Receiver>绑定内网(通常服务器都有两块网卡)网卡地址,修改端口>。 ② 在应用中指定应用是在分布式部署之下,在web.xml中添加<distributable/>选项 解决方案3:额外建立一个共享的空间用来存放Session,全部服务器共享一个Session memcached缓存共享方案基本原理 粘性Session与非粘性Session方式: 须要一些工具jar包,官网有目录和下载链接 在/conf/context.xml中进行配置,全局有效 三、集群环境中应用代码应注意的问题 ① 传递Session须要实体类序列化支持,实现可序列化接口,设置版本号 ② 获取用户IP地址方法的变化,获取真实客户端ip而不是Nginx代理地址 ③ 动静分离结构的预规划, 通常高并发的网站上,资源类的文件,如js,css,图片一般是由静态服务器处理,Nginx处理静态文件效率就很是高,而tomcat处理静态文件是它很大的一个弱势,tomcat只负责动态请求的处理。那么编码的时候就要考虑静态资源最后可能要被拿出去,地址会有变化,因此在开发的时候应该规划访问地址,保持最大灵活性。