Tomcat详细配置、优化、负载均衡

简介

Tomcat本身完全用java语言编写,要先安装JDK,才能运行。目前是Apache开源软件组织的一个软件项目,它的官网 http://tomcat.apache.org

Tomcat类加载默认使用的是双亲委托模型-子类优先

一、目录结构

1、Tomcat 的目录层次结构

  • bin: 存放启动和关闭等 Tomcat 的脚本文件、环境变量,catalina可以设置JDK、JRE 路径和Tomcat 内存。
  • conf: 存放 Tomcat 服务器的各种配置文件,catalina目录下可以设置默认加载的项目。catalina文件可以设置tomcat服务器内存大小。context.xml可以用来配置数据源之类的东西。logging文件记录tomcat服务器运行的日志记录。server.xml可以设置域名、端口号、IP、请求的编码、默认加载的项目。web.xml可以设置tomcat服务器支持的文件类型。
  • lib: 存放 Tomcat 服务器支撑的jar包,可以做多项目的jar优化。
  • logs: 存放 Tomcat 的日志文件。
  • temp: 存放 Tomcat 运行时产生的临时文件,对Tomcat 没有影响。
  • webapps:web应用虽在目录,即供外界访问的web资源的存放目录,支持以war包、Jar包、普通文件夹三种形式发布应用。
  • work: Tomcat 的工作目录, Catalina 就在这目录中,用来存放Tomcat运行时编译后的文件。清空work目录,重启Tomcat,可以达到清除Tomcat服务器缓存的目的。
  • 文件LICENSE、NOTICE、RELEASE-NOTES、RUNNING.txtTomcat服务器的一些签证,运行,注意的信息,比如JDK版本、变量及作用。

2、JavaWeb应用的组成结构

webapps\aoolication______Web应用所在目录
|----html、jsp、css、js等文件,根目录下的文件外界可以直接访问
|----WEB-INF目录:目录下的文件外界无法直接访问,由web服务器负责调用 
    |---------classes目录(java类)
    |---------lib目录(java类运行所需的jar包)
    |---------web.xml(web应用的配置文件)

3、Tomcat的组成结构

<!-- 代表整个Servlet容器组件,是最顶层元素,可以包含一个或多个<Service>元素 -->
<Server port="8005" shutdown="SHUTDOWN">
        <!-- 包含一个<Engine>元素以及一个或多个<Connector>元素,这些<Connector>共享一个<Engine> -->
        <Service name="Catalina"> 
            <!-- 代表和客户程序实际交互的组件,负责接收客户请求,以及向客户返回响应 -->
            <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
            <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
            <!-- 它处理在同一个<Service>中所有<Connector>接收到的客户请求 -->
            <Engine name="Catalina" defaultHost="localhost">
                <!-- 在一个<Engine>中可以包含多个<Host>,它代表一个虚拟主机(即一个服务器程序可以部署在多个有不同IP的服务器主机上),它可以包含一个或多个应用 -->
                <Realm className="org.apache.catalina.realm.LockOutRealm">
                    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
                </Realm>
                <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
                    <!-- 应用映射 -->
                    <Context path="/myapp"docBase="/home/myapp"></Context>
                    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
                </Host>
           </Engine>
      </Service>
</Server>

4、Tomcat体系结构

5、项目虚拟目录的映射方式

Tomcat6开始,Tomcat支持自动映射,即Tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚拟目录,换句话说,只需把web 应用放在webapps目录下,不需要配置Context,外界可以直接访问,但是如果你不想讲项目放在webapps下,而是放在其他地方,还是需要配置Context,比如我的tomcat/home路径下,我的项目在D盘,则需要在Host下增加如下虚拟目录映射语句

<Context path="/myapp"docBase="/home/myapp"></Context>

6、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应用

7、修改项目为默认路径

方式一:

在Tomcat默认安装后,tomcat的主目录是webapps/root目录,所以如果想改变tomcat的主目录的话可以如下所做:

/conf/server.xml文件的<Host></Host> 之间加入代码

<Context path="" docBase="/home/myapp" reloadable="true" debug="0"></Context>

方式二:

将tomcat安装目录下的ROOT下的所有文件删除,换成自己项目的文件。

二、常用配置

1、Context元素的属性

  • path: 指定访问该 Web 应用的URL入口
  • docBase: 指定 Web 应用的文件路径,可以写绝对路径,也可以写相对于appBase属性的相对路径
  • className:指定实现Context组件的Java类的名字,这个类必须实现org.apache.catalina.Contex接口,该属性默认值为org.apache.catalina.core.StandardContext(不建议大家改动)
  • reloadable:如果为 trueTomcat服务器在运行状态下回监视在WEB-INF/classesWEB-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

2、web.xml文件

该文件必须放在/WEB-INF目录下,但是从7.0版本开始,Tomcat可以不使用web.xml文件,而是使用注解方式。

@WebServlet("/helloServlet") //注释定义
public class HelloServlet extends HttpServlet{}

TOMCAT中web.xml文件和java项目中WEB-INF目录下的web.xml文件的区别:
加载顺序:
1、tomcat conf目录下;
2、项目目录下的;
  tomcat config目录下的为服务器全局作用域,一般用来配置全局设置、数据源等,而项目目录下的为局部作用域。
  在tomcat 的web.xml是可以设置session的;

三、Tomcat 优化

1、内存使用配置

  • Tomcat 是依赖于 JVM 的,所以 Tomcat 的使用内存配置实质上是 JVM 的内存配置

-在 /bin 目录下的 catalina.sh 可以直接通过 Tomcat 设置 JVM 内存参数

set "JAVA_OPTS=%JAVA_OPT% -server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true"

-通过内存设置充分利用服务器内存

  • -server : 模式启动应用慢,但是极大程度提高运行性能

  • -Xms2048m -Xmx2048m : 设置的是堆内存

  • java8 开始, PermSizeMetaspaceSize 代替, MetaspaceSize 共享 heap ,不会再有 java.lang.OutOfMemoryError:PermGen space ,可以不设置.

  • Headless=true : 适用于Linux系统,与图形操作有关,如生成验证码含义是当前的是无显示器的服务器,应用中如果获取系统显示有关的参数会抛出异常, windows 系统可不用设置.

-可通过 jmap -heap process_id 查看设置是否成功

2、最大连接数配置(并发能力)

  • /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服务器的性能

四、负载均衡配置

​ 负载均衡是提高应用负载量和容错的有效手段,可以结合 NginxsTomcat 实现, Nginx 是一款性能优异的反向代理服务器。

1、负载均衡配置实现

反向代理原理示意图:

负载均衡示意图:

负载均衡策略:

  • Nginx 提供轮询(round robin)
  • 用户IP哈希(client IP)
  • 指定权重

2、负载均衡时Session的处理策略

问题:

` Session ` 是 ` Tomcat ` 服务器上的内存空间,如果一个用户发出多个请求,却发到了多个 ` tomcat ` 服务器中,那么就会出现 ` Session ` 不同步的问题。

解决方案1:请求锁定

将一个用户的请求锁定到某一台服务器上,简单,但是缺乏容错性,一旦某个服务器发生故障, ` Session ` 可能丢失,(但是服务器发生故障是一个低概率事件,如果一个服务器经常挂掉,要么是硬件有问题,要么是应用有问题)。

可以使用用户IP哈希实现

解决方案2:Session复制

` Session ` 复制策略,基于网络的广播策略,一个节点 ` Session ` 变化,其他节点同步复制,具有容错性,但节点多或复制量大时对网络负荷大,使网络效率低下,甚至阻塞
  • ① 在 /conf/server.xml 文件中开启 Session 复制的选项,将 <Cluster> 注释去掉,7.0默认值以配置好,需要接收器 <Receiver> 绑定内网(一般服务器都有两块网卡)网卡地址,修改端口>。

  • ② 在应用中指定应用是在分布式部署之下,在 web.xml 中添加 <distributable/> 选项

解决方案3:共享Session

额外创建一个共享的空间用来存放 ` Session ` ,所有服务器共享一个 ` Session ` 

`  memcached ` 缓存共享方案基本原理

粘性 ` Session ` 与非粘性 ` Session ` 方式:

需要一些工具 jar 包,官网有目录和下载连接,在 /conf/context.xml 中进行配置,全局有效。

3、集群环境中应用代码应注意的问题

  • ① 传递 Session 需要实体类序列化支持,实现可序列化接口,设置版本号

  • ② 获取用户IP地址方法的变化,获取真实客户端ip而不是 Nginx 代理地址

  • ③ 动静分离结构的预规划,

    /一般高并发的网站上,资源类的文件,如 jscss ,图片通常是由静态服务器处理, Nginx 处理静态文件效率就非常高,而 Tomcat 处理静态文件是它很大的一个弱势, Tomcat 只负责动态请求的处理。那么编码的时候就要考虑静态资源最后可能要被拿出去,地址会有变化,所以在开发的时候应该规划访问地址,保持最大灵活性。

本文地址:Tomcat详细配置、优化、负载均衡

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容