Tomcat是Apache软件基金会属下Jakarta项目开发的Servlet容器,提供了作为Web服务器的一些特有功能。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。但是,不能将Tomcat和Apache HTTP服务器混淆,Apache HTTP服务器是用C语言实现的HTTPWeb服务器。


tomcat原理图

首先看一下tomcat内部原理图

tomcat原理图

在图中显示connector和container是核心组件,接下来说明一下这辆组件的核心作用

  • connector组件的作用
  1. 接收客户端的连接
  2. 加工处理客户端请求
  • container组件的作用
  1. 处理请求的容器

  2. 责任链设计模式

  3. Contain下容器从大到小分别为Engine,Host,Context,Wrapper,从左到右容器的关系是一对多的关系


tomcat处理http流程图

上图为tomcat处理http的请求流程图,下面解析一下处理的过程

  1. 客户端发送请求,然后被端口为8080,协议是HTTP/1.1的coyote的连接器监听到

  2. connector将请求发送到下属的container处理,并且等待回应

  3. container根据请求的域名,匹配对应的host,然后将请求交给对应的host处理

  4. context根据请求的path路径,寻找到对应的工程,然后将请求交给context

  5. context中根据请求找到相应的servlet类,交由其处理

  6. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用相应的servlet类的doGet和doPost方法

  7. context把执行完之后的HttpServletResponse对象返回给host

  8. host把HttpServletResponse对象返回给engine

  9. engine把HttpServletResponse对象返回给connector

  10. HttpServletResponse对象返回给客户端


上图为tomcat内部文件图,我们来解析一下这些文件夹的用处:

  • bin:tomcat下的各种命令
  • conf:各种配置文件,典型的有server.xml,是tomcat的体系结构,在tomcat启动时构建tomcat容器
  • lib:tomcat和工程需要的jar包
  • logs:存放tomcat运行时的各种日志文件,比图catalina文件里时控制台输出的信息
  • temp:用户运行tomcat时产生的临时文件,删去无影响
  • webapps:存放工程文件,在该文件夹下的ROOT文件夹存放的是各种静态文件,可以ip+端口/文件名称直接访问
  • work:tomcat运行时编译后的文件

tomcat的配置

端口修改
1
2
3
4
5
6
7
8
9
10
<!-- 端口号的修改,配置文件是在tomcat下的conf/server.xml -->

<!-- 用于关闭tomcat时需要用到的端口 -->
<Server port="8005" shutdown="SHUTDOWN">

<!-- 使用http协议请求使用的端口, -->
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

<!-- 使用AJP协议请求使用的端口 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
内存信息修改
1
2
3
4
5
6
7
8
#内存信息可以配置在tomcat下的bin/catalina.sh中,写在第二行

# -server可以在多个cpu下性能得到更好的发挥
# -Xms256m java heap的初始大小,一般为物理内存的1/64
# -Xmx512m java heap的最大值,不要超过物理内存
# -XX:MetaspaceSize=128m 初始元空间大小,默认为21m
# -XX:MaxMetaspaceSize=256m 最大的元空间大小
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
热部署:不重启tomcat的情况下,将应用部署到tomcat中
  1. 直接将war包放入webapps中,就能直接访问
1
2
3
4
5
6
7
<!-- 在tomcat下的conf/server.xml下,在<Host></Host>代码块中加入 -->

<!-- debug="0" 是调制信息,数字越大,输出越详细 -->
<!-- docBase="user" 可以放绝对路径,表示应用的路径,如果放相对路径表示在webapps下的user应用 -->
<!-- path="/" 表示域名后面跟的路径 -->
<!-- reloadable="true" 加载新增或改变的class文件 -->
<Context docBase="user" path="/" debug="0" reloadable="true" />