[TOC]

1.前言

描述:Apache Tomcat是美国Apache软件基金会的一款轻量级Web应用服务器,该程序实现了对Servlet和JSP的支持。
Tomcat是在Sun公司推出的小型Servlet/JSP调试工具的基础上发展起来的一个优秀的Servlet容器,已成为目前开发企业JavaWeb应用的最佳Servlet容器选择之一。
Tomcat本身完全用java语言编写,所以tomcat的运行需要java的支持,所以要先安装JDK才能运行;

目前是Apache开源软件组织的一个软件项目它的官网 :http://tomcat.apache.org

使用范围:在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选

用途:

  • Tomcat 服务器可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。
  • Tomcat 是apache的一个中间件软件,其可以提供jsp或者php的解析服务。

特点:

  • Tomcat 服务器是一个免费的开放源代码的Web
  • Tomcat 是一个Servlet(独立的进程单独运行的)和JSP容器;
  • Tomcat 由一系列可配置的组件构成保证了扩展性;

Tomcat的组成结构:

  • Tomcat本身由一系列可配置的组件构成,其中核心组件是Servlet容器组件,它是所有其他Tomcat组件的顶层容器。
  • 每个组件都可以在Tomcat安装目录/conf/server.xml文件中进行配置,且每个Tomcat组件在该文件中对应一种配置元素。
    下面用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体系结构图

WeiyiGeek.体系结构图

JavaWeb应用的发布方式:

  • 开放式目录方式:将应用复制到webapp/ROOT目录之中进行部署;
  • 利用war包部署方式:使用 Jar -cvf *.war 打包成为war包,然后采用manager进行部署或者采用IDEA直接部署;

补充:

  • Tomcat处理静态HTML的能力不如Apache服务器。

2.安装

安装环境准备:

安装环境:

Centos7.x 3.10.0-957.12.2.el7.x86_64 
JDK 1.8
Tomcat 8.x

安装操作步骤:

#1.卸载系统自带的openjdk并安装jdk
rm -rf $(which java)
tar xf jdk-7u80-linux-x64.tar
mv jdk1.7.0_80/ /usr/local/java

#2.解压安装Tomcat
tar xf apache-tomcat-8.5.20.tar.gz
mv apache-tomcat-8.5.20 /usr/local/tomcat8

#3.设置JAVA与TOMCAT环境变量
$cat >> /etc/profile.d/javaEnv.sh<<END
#设置java根目录
export JAVA_HOME=/opt/tomcat/jdk8
export JRE_HOME=/opt/tomcat/jdk8/jre
export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar:\$CATALINA_HOME/lib/servlet-api.jar
#Tomcat路径设置
export TOMCAT_HOME=/opt/tomcat/apache-tomcat-8.5.45
export CATALINA_HOME=/opt/tomcat//apache-tomcat-8.5.45
#在PATH环境变量中添加java跟目录的bin子目录
export PATH=\$PATH:\$JAVA_HOME/bin:\$TOMCAT_HOME/bin
END

$. /etc/profile #将java.sh 脚本导入到环境变量,使其生效

#4.运行 java -version 或者 javac -version 命令查看java版本
$java -version
java version "1.7.0_65"
Java(TM) SE Runtime Environment (build 1.7.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

#5.查看tomcat的安装情况
catalina.sh version
Using CATALINA_BASE: /opt/tomcat//apache-tomcat-8.5.45
Using CATALINA_HOME: /opt/tomcat//apache-tomcat-8.5.45
Using CATALINA_TMPDIR: /opt/tomcat//apache-tomcat-8.5.45/temp
Using JRE_HOME: /opt/tomcat/jdk8/jre
Using CLASSPATH: /opt/tomcat//apache-tomcat-8.5.45/bin/bootstrap.jar:/opt/tomcat//apache-tomcat-8.5.45/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.45
Server built: Aug 14 2019 22:21:25 UTC
Server number: 8.5.45.0
OS Name: Linux
OS Version: 3.10.0-957.12.2.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_211-b12
JVM Vendor: Oracle Corporation


#6.启动Tomcat
$/usr/local/tomcat7/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat7
Using CATALINA_HOME: /usr/local/tomcat7
Using CATALINA_TMPDIR: /usr/local/tomcat7/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar
Tomcat started.
Tomcat 默认运行在8080端口

$netstat -anpt |grep :8080
tcp 0 0 :::8080 :::* LISTEN 3318/java

#7.关闭Tomcat浏览器访问测试 http://IP:端口
/usr/local/tomcat7/bin/shutdown.sh

WeiyiGeek.


tomcat命令
$ tree /opt/tomcat/apache-tomcat-8.5.45/bin
├── bootstrap.jar
├── catalina.bat #windows下的启动停止文件
├── catalina.sh #Linux下启动停止文件
├── catalina-tasks.xml
├── ciphers.bat
├── ciphers.sh
├── commons-daemon.jar
├── commons-daemon-native.tar.gz
├── configtest.bat
├── configtest.sh
├── daemon.sh #守护进程方式
├── digest.bat
├── digest.sh
├── setclasspath.bat
├── setclasspath.sh
├── shutdown.bat #停止tomcat
├── shutdown.sh
├── startup.bat #启动tomcat
├── startup.sh
├── tomcat-juli.jar
├── tomcat-native.tar.gz
├── tool-wrapper.bat
├── tool-wrapper.sh
├── version.bat
└── version.sh #版本信息

3.配置

(1)虚拟目录的映射方式
从Tomcat6开始支持自动映射,即tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚拟目录,换句话说只需把web应用放在webapps目录下,不需要配置Context,外界可以直接访问

#如果是放入非webapps目录下是放在其他地方,还是需要配置Context
#比如我的tomcat在C盘,我的项目在D盘,则需要在Host下增加如下虚拟目录映射语句。
<Context path="/myapp" docBase="D:/work/myapp"></Context>

(2)Context元素配置
tomcat在加载一个web应用时,会一次按照以下五种方式查找web应用中的元素,优先级异常降低直到找到为止

  • 1.到Tomcat安装目录/conf/Context.xml文件中查找元素。
    1. 到Tomcat安装录/conf/[enginename]/[hostname]/context.xml.default文件中查找元素。
      [enginename]:表示的name属性
      [hostname]:表示d的那么属性
  • 3.到Tomcat安装目录/conf/[enginename]/[hostname]/[contextpath].xml文件中查找元素

    [contextpath]:表示单个Web应用的URL入口
  • 4.到Web应用的META-INF/context.xml文件中查找元素

  • 5.到Tomcat安装目录/conf/server.xml文件中查找元素。只适用于单个Web应用



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


4.部署

(1)将项目部署为Tomcat默认应用
即访问 http://localhost:8080 时出来的是tomcat自带的欢迎页面,改为登录到自己的项目主页。

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

在/conf/server.xml文件的之间加入代码

<Context path="" docBase="C:\tomcat7\webapps\myapp" reloadable="true" debug="0"></Context>
<!--
docBase改为自己需要的项目路径
如果建立了Apache和tomcat集群,Apache server 的默认端口是80 ,IE访问的方法只需输入:http://localhost,就可以自动定位到xx工程下面去
-->


方法二:
将tomcat安装目录下的ROOT下的所有文件删除,换成自己项目的文件,此法有点暴力。


方法三:
Tomcat5.0以下版本在C:/Tomcat/conf/Catalina/localhost目录下会自动生成了一个ROOT.Xml,但是5.0以上版本不再生成此文件。

所以可以新建个ROOT.xml,在里面加入如下代码:

<!--但是我自己在7.0版本上测试好像未成功,推荐方式1-->
<?Xml version='1.0' encoding='utf-8'?>
<Context crossContext="true" docBase="C:\tomcat7\webapps\myapp" path="" reloadable="true">
</Context>

Context元素的属性解释

  • 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:Tomcat可以降低Tomcat的运行负荷,提高Tomcat的运行性能
  • 素都会使用默认的标准Context组件,即className属性采用默认值org.apache.catalina.core.StandardContext,它除了拥有上面介绍到的属性外,还有自身专有的属性:
    • cachingAllowed:是否允许启用静态资源(HTML、图片、声音等)的缓存。默认值为true。
    • cacheMaxSize:设置静态资源缓存的最大值,单位为K。
    • workDir:指定Web应用的工作目录。
    • uppackWAR:默认值为true会把war文件展开为开放目录后再运行;为false时候直接运行war文件。


负载均衡配置

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

1.负载均衡配置实现
反向代理原理示意图
WeiyiGeek.反向代理原理示意图

负载均衡示意图:
WeiyiGeek.

负载均衡策略:

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


2.负载均衡时Session的处理策略
描述:Session是Tomcat服务器上的内存空间,如果一个用户发出多个请求,却发到了多个tomcat服务器中,那么就会出现Session不同步的问题;

解决方案1

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

解决方案2

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

解决方案3

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


3.memcached缓存共享方案基本原理
粘性Session与非粘性Session方式:需要一些工具jar包,官网有目录和下载连接在/conf/context.xml中进行配置,全局有效。
WeiyiGeek.

注意事项:

  • 集群环境中应用代码应注意的问题传递Session需要实体类序列化支持,实现可序列化接口,设置版本号。
  • 获取用户IP地址方法的变化,获取真实客户端ip而不是Nginx代理地址。
  • 动静分离结构的预规划。一般高并发的网站上,资源类的文件,如js,css,图片通常是由静态服务器处理,Nginx处理静态文件效率就非常高,而tomcat处理静态文件是它很大的一个弱势,tomcat只负责动态请求的处理。
  • 编码的时候就要考虑静态资源最后可能要被拿出去,地址会有变化,所以在开发的时候应该规划访问地址,保持最大灵活性。