首先展现一个图:
这就是Tomcat服务器的内部结构,最顶层的容器是Server,代表着整个服务器,整个 Tomcat 的生命周期由Server 控制,一个 Server 至少包含一个 Service(至于最多可以包含多少个 Service,一是看 Tomcat 本身的配置,二是看服务器的硬件配置是否能承载得了)
Service 又包含两个主要的部分:Connector 和 Container,这两个组件是 Tomcat 的心脏
Connector 用于接受请求并将请求封装成 Request 和 Response
Container 用于封装和管理 Servlet,以及处理具体的 Request 请求
接下来先说一下怎样部署一个项目:使用tomcat部署一个war包:
jar包:JAR包是类的归档文件,JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。
war包:war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西。
首先讲解一下怎样将一个项目打包成war包:
如果是一个maven项目:只需要在pom.xml里面加入:
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>MobilPhone</name>
<groupId>org.example</groupId>
<artifactId>MobilPhone</artifactId>
<version>1.0-SNAPSHOT</version>
然后:
如果这不是一个maven项目:
1:使用快捷键Ctrl+Alt+Shift+s 或者 鼠标点击选中项目名按F4 打开 Project Structure界面
2:选择Artifacts,点击右边+,依次选择Web Application:Archive 和 For ‘myPro:war exploded’
3:[修改名称:可选] 和 注意 war输出的路径
4:点击下图红色箭头所指+图标,选择Directory Content,添加你的WebRoot目录,然后点击OK
5:在主界面选择Build – Build Artifacts,找到刚才需要打包的项目名点击build
部署项目的方式:
1:将项目打出的 war 包直接放到 tomcat/webapps 目录下,那么当 Tomcat 启动时,会自动将 .war 包解压
2:在 conf/context.xml 中进行独立的配置,可以增加如下元素:,启动 Tomcat 后,在浏览器中输入 http://localhost:8080/project/ 就能访问项目了。
3:在 Tomcat 中创建 conf/Catalina/localhost 目录,用项目名新建一个 xml 文件,例如 project.xml,然后在 project.xml 中加上类似于第二种方式的内容:<ContextdocBase="/usr/local/project" reloadbale=“true”>,启动 Tomcat 后,在浏览器中输入http://localhost:8080/project/ 就能访问项目了。
知识点讲解:网上有很多说第二种部署方法不是在 conf/context.xml 中而是在server.xml中的标签下面,下面简单讲解一下:
在tomcat 5.5之前:Context体现在/conf/server.xml中的Host里的元素,它由Context接口定义。每个元素代表了运行在虚拟主机上的单个Web应用。
元素:<Context path="/kaka" docBase="kaka" debug="0" reloadbale="true">
<1>path:即要建立的虚拟目录,,注意是/kaka,它指定访问Web应用的URL入口,如http://localhost:8080/kaka/****。
<2>docBase:为实际目录在硬盘上的位置(应用程序的路径或者是WAR文件存放的路径)。
<3>reloadable:如果这个属性设为true,Tomcat服务器在运行状态下会监视在WEB-INF/classes和Web-INF/lib目录CLASS文件的改变,如果监视到有class文件被更新,服务器自动重新加载Web应用,这样我们可以在不重起tomcat的情况下改变应用程序。
一个Host元素中嵌套任意多的Context元素。每个Context的路径必须是惟一的,由path属性定义。另外,你必须定义一个path=“”的context,这个Context称为该虚拟主机的缺省web应用,用来处理那些不能匹配任何Context的Context路径的请求。
2. 在tomcat 5.5之后:
不推荐在server.xml中进行配置,而是在/conf/context.xml中进行独立的配置。因为server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。
元素:
<Context path="/kaka" docBase="kaka" debug="0" reloadbale="true" privileged="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/kaka.xml</WatchedResource> 监控资源文件,如果web.xml || kaka.xml改变了,则自动重新加载改应用。
<Resource name="jdbc/testSiteds" 表示指定的jndi名称
auth="Container" 表示认证方式,一般为Container
type="javax.sql.DataSource"
maxActive="100" 连接池支持的最大连接数
maxIdle="30" 连接池中最多可空闲maxIdle个连接
maxWait="10000" 连接池中连接用完时,新的请求等待时间,毫秒
username="root" 表示数据库用户名
password="root" 表示数据库用户的密码
driverClassName="com.mysql.jdbc.Driver" 表示JDBC DRIVER
url="jdbc:mysql://localhost:3306/testSite" /> 表示数据库URL地址
</Context>
context.xml的三个作用范围:
在/conf/context.xml里配置。
在/conf/Catalina/${hostName}里添加context.xml,继而进行配置。
在/conf/Catalina/h o s t N a m e 里 添 加 {hostName}里添加hostName里添加{webAppName}.xml,继而进行配置。
给 Tomcat 新增用户,实现输入用户名和密码进入应用管理界面:
打开 conf 目录下的 tomcat-users.xml,添加一行:<user username= "root" password= "root" roles="manager-gui"/>
禁用AJP:
修改conf下的server.xml文件,将AJP服务禁用掉即可
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
禁用前:
禁用后:
禁用后还可以访问
知识讲解:Tomcat HTTP协议与AJP协议
Tomcat在server.xml中配置了两种连接器。
HTTP Connector
拥有这个连接器,Tomcat才能成为一个web服务器,但还额外可处理Servlet和jsp。
AJP Connector
AJP连接器可以通过AJP协议和另一个web容器进行交互。
<!-- Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。AJP连接器可以通过AJP协议和一个web容器进行交互。
Web客户访问Tomcat服务器的两种方式:
AJP13是一个二进制的TCP传输协议,相比HTTP这种纯文本的协议来说,效率和性能更高,也做了很多优化。显然,浏览器并不能直接支持AJP13协议,只支持HTTP协议。所以实际情况是,通过Apache的proxy_ajp模块进行反向代理,暴露成http协议给客户端访问,主要应用场景就是动静分离时,两个服务器之间通信使用。
支持AJP协议的代理服务器可以用这种做法,但是支持AJP代理的服务器非常少,比如目前很火爆的Nginx就没这个模块。因此tomcat的配置大部分都是关闭AJP协议端口的,因为除了Apache之外别的http server几乎都不能反代AJP13协议,没太大用处了