目录结构
Tomcat是一款纯绿色安装的软件,从官网下载下来以后解压即可使用,期目录结构如下图所示
- bin: tomcat服务器的可执行文件和脚本文件
- conf: tomcat的配置信息文件
- lib: tomcat的依赖jar包
- log: tomcat的日志信息
- temp: tomcat的临时文件
- webapps:存放web应用的目录,web应用会部署到该目录下
- work: 存放jsp编译后产生的字节码文件
当服务器上没有部署任何项目时,启动服务器默认访问的是webapps下的ROOT文件夹下的index.jsp文件
整体架构
HTTP服务器
浏览器发送给服务端的是一个http格式的需求,http服务器收到这个请求后,需要调用服务端程序来处理,所谓的服务端程序就是我们写的java类,一般来说,不同的请求需要不同的Java类来处理
- 图1表示服务器直接调用具体业务类,此时他们是耦合的
- 图2 HTTP服务器不直接调用业务类,而是将请求分发给Servlet容器来处理,容器再通过Servlet接口来调用业务类处理。正是因为Servlet接口和Servlet容器的出现,使得HTTP服务器和业务类实现了解耦。我们把Servlet接口和Servlet容器这一整套规范称作Servlet规范。Tomcat按照Servlet规范实现了Servlet容器,同时它也具有HTTP服务器的功能。所以这也是为什么Java程序员只需要实现一个Servlet接口就能处理一个请求的原因所在,即我们负责实现,tomcat负责调用。
Servlet容器运行原理
由前面我们知道,Servlet容器解决了HTTP服务器和业务类之间的耦合关系,业务类的具体调用交由自己处理,那么它是如何处理的呢?
当客户请求某个资源时,HTTP服务器会用一个ServletRequest对象把客户的请求信息封装起来,然后调用Servlet容器的service方法;Servlet容器拿到请求信息后,会根据请求的URL和Servlet的映射关系找到对应的Servlet,如果Servlet还没有被加载,就会利用反射机制创建这个Servlet对象,然后调用init()方法来完成初始化,接着调用service()方法来处理请求,最后返回给HTTP服务器一个ServletResponse对象,HTTP服务器会把响应的数据发送给客户端;如下图所示
容器(Catalina)
Tomcat是一个由一系列可配置的组件构成的Web容器,而Catalina是Tomcat的Servlet容器;Catalina是Servlet容器的具体实现,它集成了安全,管理,集群,会话等Servlet容器架构的各个方面;它在Tomcat整体架构中的位置如下图所示
Tomcat的本质是一款Servlet容器,因此Catalina才是Tomcat的核心,其他模块都是为Calina提供支持的。那么Catalina的内部组成又是如何的呢?它的主要结构如下
如上图所示,Catalina负责管理Server,而Server表示整个服务器,Server下面又有多个Service,每个Service包含着多个Connector(连接器组件)和一个容器组件Container。在Tomcat启动的时候,会初始化一个Catalina对象。
各组件的职责如下
相关配置
Tomcat服务器的配置主要集中于conf文件夹下的catalina.policy,Catalina.properties,context.xml,server.xml,tomcat-users.xml以及web.xml中
服务配置
服务配置的相关信息主要都封装在server.xml文件中
Executor(线程池)
默认情况下service并未添加共享线程池配置,如果我们想添加一个,可以在<service>下添加如下配置
相关的属性说明如下
附:我们可以通过JDK提供的JConsole来监控线程变化
Connector(连接器)
Connector用于创建链接器实例。默认情况下,server.xml配置来两个链接器,一个支持HTTP协议,一个支持AJP协议,因此大多数情况下,我们并不需要增减链接器配置,只是根据需要对已有链接器进行优化
相关的属性说明
- port:端口号,用于创建服务端Socket并进行监听,如果属性值设置为0,tomcat会随机分配一个可用端口号给当前连接器用
- protocol:当前连接器支持的访问协议。默认为HTTP/1.1
- connectionTimeOut:连接器接收连接后的等待超时时间,单位毫秒,-1表示不超时
- redirectPort:当前connector不支持SSL请求,当需要SSL传输时指定的一个端口
- executor:指定共享线程池的名称
- URIEncoding:用于指定URI的字符编码,Tomcat8以上默认是UTF-8
关于protocol配置的简单补充
Engine(引擎)
Engine作为Servlet引擎的顶级元素,内部可以嵌入Cluster,Listener,Value和Hosts
属性说明
- name:用于指定Engine的名称,默认为Catalina。该名称会影响部分文件的存储路径
- defaultHost:默认使用的虚拟主机名称,当客户端请求指向的主机无效时,将交由默认的虚拟主机处理,默认为localhost
Host(主机)
Host元素用于配置一个虚拟主机,它支持很多嵌套原色
属性说明
- name:当前Host通用的网络名称,必须与DNS(域名)服务器上的注册信息一致
- appBase:当前Host应用的基础目录,当前部署的项目应都在该目录下,默认为webapps
- unpackWARs:设置为true,Host启动时会将war包解压,false则不解压
- autoDeploy:控制tomcat是否在运行时定期监测并自动部署新增或变更的web应用
Context
用来配置一个web应用,默认配置如下
属性描述
- docBase:Web应用目录或者War包的部署路径,可以是绝对路径也可以是Host/appBase的相对路径
- path:Web应用的Context路径,如果我们Host名为localhost,则web应用的访问跟路径为http://localhost:8080/myApp/
管理配置
Tomcat作为一个服务器软件,本身对外提供了虚拟主机管理和对部署的所有web应用的管理,如下图所示
这两个模块都默认添加了访问权限控制,当你点击某个按钮时都需要你输入用户名和密码登入,所以想要访问该页面,必须在conf/tomcat-users.xml中配置并分配对应的角色
Host Manager
配置如下:
其中
- admin-gui:用于控制页面访问权限
- admin-script:用于控制以简单文本的形式访问
Manager
配置如下
服务器安全
Tomcat 作为一个运行我们项目的服务器,如何保证其安全是我们必须要关注的问题,通常我们会从配置安全,应用安全以及传输安全这三个方面同时加强系统的安全性。
配置安全
- 删除webapps下的目录
- 注释或删除tomcat-users.xml文件内的所有用户权限
- 配置异常页面
- 更改关闭tomcat指令或禁用:Tomcat的server.xml中定义了可以直接关闭tomcat实例的管理端口。可以通过telnet连接上端口以后,输入SHUTDOWN(默认关闭指令)即可关闭tomcat实例(注意,此时虽然实例关闭了但是进程依然存在),由与默认的端口和指令都很简单,所以我们可以通过一下方式修改或禁用
应用安全
在大部分web应用中,特别是一些后台应用系统,都会实现自己的安全管理模块或者说是权限模块,用于控制应用系统的安全访问,基本包含两个部分:认证(登入/单点登入)和授权(功能权限和数据权限)两个部分。对于当前的业务系统,可以自己做一套适用于自己系统的安全管理模块,也可以用一些功能完善的安全模块,将其集成到我们的系统中来,如Spring-security,shiro等
传输安全
HTTPS介绍
至此,仅剩调优部分的知识了,有时间再更新