目录
1、概念介绍
Tomcat 组件
HTTP 请求过程
Tomcat 目录结构
Tomcat 命令
配置文件说明
2、安装环境
安装JDK
安装Tomcat
创建管理用户
3、搭建虚拟主机
1、概念介绍
端口:8080
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器, 按照 Sun 提供的技术规范,实现了对 Servlet 和 Java Server Page(JSP)的支持。使用 HTTP 协议与客户端(通常是浏览器)进行通信。Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选,因为 Tomcat 技术先进、性能稳定,成为目前比较流行的 Web 应用服务器。Tomcat 是应用(java)服务器,它只是一个 servlet 容器,是 Apache 的扩展,但它是独立运行的。由于 Tomcat 本身也内含了一个 HTTP 服务器,它也可以被视作一个单独的 Web 服务器。
Tomcat 和 apache、nginx 等 Web 服务器一样,具有处理 HTML 页面的功能。不过,Tomcat 处理静态 HTML 的能力不如 Apache 和 nginx 服务器。
Web serever 只能完成静态资源的请求;Servlet 容器能够进行动态资源的请求;
Servlet
Servlet(Server Applet)是 Java Servlet 的简称,称为小服务程序或服务连接器,用 Java 编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web 内容。
Servlet 架构,在软件里面位置如下:
1、客户端发送请求至服务器端;
2、服务器将请求信息发送至 Servlet;
3、Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
4、服务器将响应返回给客户端。
Tomcat 组件
Tomcat 主要组件:服务器 Server,服务 Service,连接器 Connector、容器 Container。连接器 Connector 和容器 Container 是 Tomcat 的核心。
Tomcat 组件 | 说明 |
Server | Tomcat 中最顶层的容器是 ,代表着整个服务器,一个Server 可以包含至少一个 Service,用于具体提供服务。 |
Connector | 用于处理连接相关的事情,并提供 Socket 与 Request 和 Response 相关的转化; |
Container | 用于封装和管理 Servlet,以及具体处理 Request 请求。 |
Tomcat 还有其它重要的组件,如安全组件 security、logger 日志组件、session、 mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务。
Connector
一个 Connecter 将在某个指定的端口上侦听客户请求,接收浏览器发过来的tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据, 然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理 Engine(Container 中的一部分),从 Engine 出获得响应并返回客户。 一个服务可以有多个连接,如同时提供 Http 和 Https 链接,也可以提供向相同协议不同端口的连接
Tomcat 中有两个经典的 Connector,一个直接侦听来自 Browser 的 HTTP 请求,另外一个来自其他的 WebServer 请求。HTTP/1.1 Connector 在端口 8080 处侦听来自客户 Browser 的 HTTP 请求,AJP/1.3 Connector 在端口 8009 处侦听其他 Web Server 的 Servlet/JSP 请求。
http 协议访问端(默认为 8080),负责建立 HTTP 连接。在通过浏览器访问 Tomcat服务器的 Web 应用时,使用的就是这个连接器。
AJP 协议访问端口(默认为 8009 端口),负责和其他的 HTTP 服务器建立连接。在把 Tomcat 与其他 HTTP 服务器集成时,就需要用到这个连接器。
Container
Container 用于封装和管理 Servlet,以及具体处理 Request 请求,在 Container 内部包含了 4 个子容器
① Engine:引擎,用来管理多个站点,一个 Service 最多只能有一个 Engine;
Engine 用来接收并处理从 Connector 发来的请求,并将处理结果返回 Connector。 一个 Engine 可以包含一个或多个 Host。
Engine 下可以配置多个虚拟主机 Virtual Host,每个虚拟主机都有一个域名,当Engine 获得一个请求时,它把该请求匹配到某个 Host 上,然后把该请求交给该 Host 来处理。Engine 有一个默认虚拟主机,当请求无法匹配到任何一个 Host 上的时候,将交给该默认 Host 来处理。
② Host:代表一个 Virtual Host,虚拟主机。
每个虚拟主机和某个网络域名 Domain Name 相匹配,每个虚拟主机下都可以部署一个或者多个 Web App,每个 Web App 对应于一个 Context,有一个 Context path。
当 Host 获得一个请求时,将把该请求匹配到某个 Context 上,然后把该请求交给该 Context 来处理。匹配的方法是“最长匹配”,所以一个 path=""的 Context 将成为该 Host 的默认 Context,所有无法和其它 Context 的路径名匹配的请求都将最终和该默认 Context 匹配。
③ Context:一个 Context 对应于一个 Web Application。
一个 Web Application 由 一 个 或 者 多 个 Servlet 组 成 。 Context 在 创 建 的 时 候 将 根 据 配 置 文 件 $CATALINA_HOME/conf/web.xml
和 $WEBAPP_HOME/WEB-INF/web.xml
载入 Servlet 类,当 Context 获得请求时,将在自己的映射表(mapping table)中寻找相匹配的 Servlet 类,如果找到,则执行该类,获得请求的回应,并返回。
④ Wrapper:每一 Wrapper 封装着一个 Servlet。
Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了。
HTTP 请求过程
Tomcat Server 处理一个 HTTP 请求的过程
① 用户点击网页内容,请求被发送到本机端口 8080,被在那里监听的 Coyote HTTP/1.1 Connector 获得。
② Connector 把该请求交给它所在的 Service 的 Engine 来处理,并等待 Engine 的回应。
③ Engine 获得请求 localhost/test/index.jsp,匹配所有的虚拟主机 Host。
④ Engine 匹配到名为 localhost 的 Host(即使匹配不到也把请求交给该 Host 处理,因为该 Host 被定义为该 Engine 的默认主机),名为 localhost 的 Host 获得请求/test/index.jsp,匹配它所拥有的所有的 Context。Host 匹配到路径为/test 的 Context (如果匹配不到就把该请求交给路径名为 path=””的 Context 去处理)
⑤ path=“/test”的 Context 获得请求/index.jsp,在它的 mapping table 中寻找出对应的 Servlet。Context 匹配到 URL PATTERN 为*.jsp 的 Servlet,对应于 JspServlet 类。
⑥ 构造 HttpServletRequest 对象和 HttpServletResponse 对象,作为参数调用JspServlet 的 doGet()或 doPost().执行业务逻辑、数据存储等程序。
⑦ Context 把执行完之后的 HttpServletResponse 对象返回给 Host。
⑧ Host 把 HttpServletResponse 对象返回给 Engine。
⑨ Engine 把 HttpServletResponse 对象返回 Connector。
⑩ Connector 把 HttpServletResponse 对象返回给客户 Browser。
Tomcat 目录结构
|---bin:存放启动和关闭 tomcat 执行脚本;
|---conf :存放 Tomcat 服务器的各种全局配置文件,其中最重要的是server.xml 和 web.xml;
|---lib: 存放 Tomcat 运行需要的库文件(jar),包含 Tomcat 使用的 jar 文件。unix 平台此目录下的任何文件都被加到 Tomcat 的 classpath 中;
|---logs:存放 Tomcat 执行时的 LOG 文件;
|---webapps:Tomcat 的主要 Web 发布目录,默认情况下把 Web 应用文件放于此目录,即供外界访问的 web 资源的存放目录;
|--- webapps/ROOT:tomcat 的家目录
|--- webapps/ROOT/ index.jsp:Tomcat 的默认首页文件
|---work:存放 jsp 编译后产生的 class 文件或 servlet 文件存放
|---temp:存放 Tomcat 运行时所产生的临时文件
Tomcat 命令
bat 为 windows 下的脚本(批处理) ;sh 为 Linux 下的脚本,Shell
catalina.sh一个最关键的脚本,其他的启动脚本如 startup,shutdown.sh,都是使用了不同的参数调用了该脚本,startup 以 start 参数调用了 catalina 脚本, shutdown 使用 stop 调用了 catalina 脚本!
配置文件说明
server.xml文件:该文件用于配置和server相关的信息,比如tomcat启动的端口号、
配置 host 主机、配置 Context
web.xml 文件:部署描述文件,web.xml 文件有两部分:Servlet 类定义和 Servlet 映射定义。
这个 web.xml 中描述了一些默认的 servlet,部署每个 webapp 时,都会调用这个文件。
这个文件中也注册了很多 MIME 类型,即文档类型。这些 MIME 类型是客户端与
服务器之间说明文档类型的,如用户请求一个 html 网页,那么服务器会告诉客户
端浏览器响应的文档是 text/html 类型的,这就是一个 MIME 类型。客户端浏览器
通过这个 MIME 类型就知道如何处理它了。当然是在浏览器中显示这个 html 文件
了。但如果服务器响应的是一个 exe 文件,那么浏览器就不可能显示它,而是应该
弹出下载窗口才对。MIME 就是用来说明文档的内容是什么类型的!
tomcat-users.xml 文件:配置 tomcat 的用户密码与权限。
context.xml:每个 webapp 都可以使用的配置文件,它通常由专用的配置文件
context.xml 来定义,其存放位置为 WEB-INF/目录中;此文件为所有的 webapps 提
供默认配置;例如 context.xml 里设置 tomcat 数据源,用来连接数据库。
catalina.policy:当使用-security 选项启动 tomcat 时,用于为 tomcat 设置安全策略;
catalina.properties:Java 属性的定义文件,用于设定类加载器路径,以及一些与JVM 调优相关参数;
logging.properties:日志系统相关的配置;
2、安装环境
① 下载Tomcat:Apache Tomcat® - Apache Tomcat 8 Software Downloads
② 下载mysql-connector-java:https://dev.mysql.com/downloads/
③ 下载JDK:技术资源 | Oracle 中国
安装JDK
# 解压 jdk
tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
# 配置 JDK 环境变量
vim /etc/profile # 在文件最后加入一下行
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
# 使环境变量生效
source /etc/profile
安装Tomcat
# 解压软件包
tar -zxvf apache-tomcat-8.5.42.tar.gz -C /usr/local/
# 更改目录名称
mv /usr/local/apache-tomcat-8.5.98/ /usr/local/tomcat
注意:Tomcat 有两种安装方式,一种是直接解压就可以使用的二进制文件,第二种是编译安装,我们这里采用了第一种方法,下载的 tomcat 软件直接解压就可以执行的二进制文件,因为在官方默认下载的便是使用第一种方法安装。
Tomcat 服务启动脚本
#!/bin/bash
# description:The Apache Tomcat Server/JSP container
JAVA_HOME=/usr/local/jdk1.8.0_171
CATALINA_HOME=/usr/local/tomcat
# tomcat start file
start_tomcat=$CATALINA_HOME/bin/startup.sh
# tomcat stop file
stop_tomcat=$CATALINA_HOME/bin/shutdown.sh
start(){
echo -n "Starting tomcat..."
${start_tomcat}
}
stop(){
echo -n "Shutting down tomcat..."
${stop_tomcat}
echo "Tomcat stop ok."
}
# See how we were called
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 5
start
;;
*)
echo "Usage:$0{start|stop|restart}"
esac
# 启动脚本添加执行权限
chmod +x /etc/init.d/tomcat
Tomcat 系统服务文件
vim /lib/systemd/system/tomcat.service
[Unit]
Description=tomcat
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=/usr/local/jdk1.8.0_171
Environment=CATALINA_HOME=/usr/local/tomcat
ExecStart=/usr/local/tomcat/bin/startup.sh start
ExecStop=/usr/local/tomcat/bin/shutdown.sh stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 重载 service 文件
systemctl daemon-reload
# 启动 tomcat
systemctl start tomcat
# 添加开机自启动
systemctl enable tomcat
ps -ef | grep tomcat
创建管理用户
# 修改 tomcat-users.xml 配置文件
vim /usr/local/tomcat/conf/tomcat-users.xml
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="123456"
roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>
</tomcat-users>
角色 | 说明 |
manager-gui | Allows access to the html interface |
manager-script | Allows access to the plain text interface |
manager-jmx | Allows access to the JMX proxy interface |
manager-status | Allows access to the read-only status pages |
admin-gui | 允许访问 HTML GUI |
admin-script | 允许访问文本接口 |
tomcat8 以上还要增加以下配置
vim /usr/local/tomcat/conf/Catalina/localhost/manager.xml
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="^.*$" />
重启服务重新点击Manager App -> 输入admin 123456
3、搭建虚拟主机
搭建基于域名的虚拟主机:server.xml 是 Tomcat 的主配置文件(全局),服务器设置的,例如端口设置,路径设置。
# 修改 server.xml 配置文件
vim /usr/local/tomcat/conf/server.xml
# 在engine标签里添加
<Host name="www.test.com" appBase="/www/html">
<Context path="" docBase="/www/html/web1" />
</Host>
<Host name="www.test.cn" appBase="/www/html">
<Context path="" docBase="/www/html/web2" />
</Host>
Host 元素|子标签 | 说明 |
name | 指定虚拟主机的名称,那么使用对应的 ip 将无法访问,如果需要使用 ip 来访问,需要把 host 的 name 属性改成 ip 即可。 |
appBase | 指定应用程序(网站)的根目录,这里可以存放多个程序(网站),一般是相对路径,相对于 tomcat 的安装目录。 |
<Context path=""> | 为虚拟目录,如果是空,表示直接就是/,如果是如 path="aa",那么访问的时候就是 site:8080/aa |
<Context docBase=""> | 为实际目录,可以是绝对路径,如果是相对路径就是基于appBase |
# 创建测试网页
mkdir -p /www/html/{web1,web2}
echo "test.com web1" > /www/html/web1/index.html
echo "test.cn web2" > /www/html/web2/index.html
# 修改 hosts
vim /etc/hosts
192.168.1.11 www.test.com
192.168.1.11 www.test.cn
# windows 客户端修改 hosts
C:\Windows\System32\drivers\etc
192.168.1.11 www.test.com
192.168.1.11 www.test.cn
# 重启 tomcat
systemctl restart tomcat