简介
什么是jdk
Java是一种面向对象的语言,Java通过JVM的方式实现了一次编译到处运行的功能。即通过 源码XXX.java-->javac编译器-->字节码XXX.class-->JVM-->机器语言(依赖于不同平台)-->执行
这样子来运行java语言。
JRE(Java Runtime Environment)
是包含了JVM和其他一些简单功能的JAVA运行环境,它适用于只运行java程序时。
JDK(Java Development Kit)
比JRE包含了更多东西,它除了能作为JAVA运行环境,还提供了很多用于开发的工具,所以它适用于开发程序时使用。
JAVA SE是java开发标准版,里面有JDK,Java EE是企业版,本质上ee只是比se多提供了几个类库而已。
什么是tomcat
Tomcat 类似与一个apache的扩展型,属于apache软件基金会的核心项目,属于开源的轻量级Web应用服务器,是开发和调试JSP程序的首选,主要针对Jave语言开发的网页代码进行解析,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常做为一个Servlet和JSP容器单独运行在后端。
可以这样认为,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。比如apache可以通过cgi接口直接调取Tomcat中的程序。
部署安装
安装jdk
有2个方法,一是直接通过yum install java java-devel
来安装,喜欢折腾的朋友可以按以下方法:
打开 jdk-8u231-linux-x64.tar.gz ,下载需要oracle的账号。下载到机器上面之后,运行:
1 | tar zvxf jdk-8u231-linux-x64.tar.gz -C /usr/local |
注:建议还是使用tar包方式进行安装。
安装tomcat
打开 http://tomcat.apache.org/ tomcat官网,选择对应的版本,我这边选择是8.5版本:
1 | tar zxvf apache-tomcat-8.5.47.tar.gz -C /usr/local/ |
这样就安装完成了。可以通过 /usr/local/tomcat/bin/shutdown.sh && /usr/local/tomcat/bin/startup.sh
来重启tomcat了。
如果想通过systemctl来管理,可以将tomcat配置为系统服务:
1 | [Unit] |
tomcat配置
目录结构
主要的目录结构如下:
- bin:存放Windows或Linux平台上启动和关闭Tomcat的脚本文件
- conf:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml
- lib:存放Tomcat运行需要的库文件
- logs:存放Tomcat执行时的LOG文件
- webapps:存放web程序的根目录
- work:存放jsp编译后产生的class文件
conf配置文件作用说明:
- catalina.policy:权限控制配置文件
- catalina.properties:Tomcat属性配置文件
- context.xml:上下文配置文件
- logging.properties:日志log相关配置文件
- server.xml:主配置文件
- Tomcat-users.xml:manager-gui管理用户配置文件
- web.xml:Tomcat的servlet、servlet-mapping、filter、MIME等相关配置
bin目录下有很多脚本文件,有.sh脚本,也有.bat脚本:
- catalina.sh类似于SysV服务管理脚本,支持stop、start和configtest,但不支持restart和reload,如
catalina.sh start
。 - startup.sh等价于
catalina.sh start
。 - shudown.sh等价于
catalina.sh stop
。 - configtest.sh等价于
catalina.sh configtest
。 - daemon.sh是通过指定各种PATH参数将tomcat以daemon的方式运行,要指定的参数path较多。catalina.sh执行start也是在后台运行tomcat的,所以没有必要使用此脚本来实现daemon模式的tomcat。
tomcat模块化
对于tomcat来说,它高度模块化,通过各个组件实现各种功能。它的体系结构如下图所示:
其中:
- server是顶级类,一个server算是一个tomcat实例,在此层次中可定义tomcat服务的监听端口。
- service是server下的子组件,用于封装绑定connector和containor,并为它们提供一个名称属性。有了service就可以提供相关的服务,如监听TCP连接请求、处理http请求。注意server是管理整个tomcat实例的层次,它和提供服务没有关系。
- connector是连接器,定义http协议(默认)以及该协议的监听端口。连接器用于接收客户端请求并将containor处理的数据返回给客户端。
- containor称为容器,它和connector连接器进行绑定。该容器内有4个子容器,包括:
engine容器、host容器、context容器、Wrapper容器
。容器用于分析、处理请求,并构建响应给connector以发送给客户端。它和connector是tomcat的心脏组件。- engine容器定义servlet引擎,用于定义引擎的名称、默认的虚拟主机。引擎用于分析http请求并将请求转发给对应的虚拟主机。
- host容器用于定义虚拟主机。
- context容器用于定义webapp,一个context定义一个webapp。它是真正管理servlet容器的层次。
- wrapper容器对应的是真正的servlet容器,一个wrapper代表一个servlet,它负责管理一个Servlet,包括的Servlet的装载、初始化、执行以及资源回收。Wrapper是最底层的容器,一个context只能包含一个wrapper。在配置文件中,无法配置该容器的属性。
一个server可以有多个service。一个service可以有多个connector和唯一的containor。containor是容器类,从containor层次开始,真正进入servlet容器相关的过程。它包含了唯一的engine容器,engine容器中包含了一个或多个host容器,host容器中包含了一个或多个context容器,context容器中包含了唯一的wrapper。它们的组织结构大致如下:
1 | <server> |
server.xml主配置文件
安装完成之后,默认的server.xml配置如下:
1 | [root@localhost tmp]# cat /usr/local/tomcat/conf/server.xml |sed -n '/<!--/,/-->/!p' |dos2unix |grep -v "^$" |
具体的含义如下:
- 顶级元素server定义的是一个tomcat实例。默认监听在localhost:8005端口以接收shutdown命令。要启用多个tomcat实例,将它们监听在不同的端口即可。这个端口的定义为管理员提供一个关闭实例的便捷途径,可以直接telnet至此端口使用SHUTDOWN命令关闭此实例。
- 顶级元素service定义了service就能提供服务了。service组件中封装connector和container,它同时也表示将此service中的connector和container绑定起来,即由它们组成一个service向外提供服务。默认不做修改。
- 连接器connector用于接收客户端发送的请求并返回响应给客户端。一个service中可以有多个connector。其实就是定义服务端口。
engine
容器用于从connector组件处接收已建立的TCP连接,还用于接收客户端发送的http请求并分析请求,然后按照分析的结果将相关参数传递给匹配出的虚拟主机。engine还用于指定默认的虚拟主机。host
容器定义虚拟主机,由于tomcat主要是作为servlet容器的,所以为每个webapp指定了它们的根目录appBase。context
容器主要是根据path和docBase获取一些信息,将结果交给其内的wrapper组件进行处理(它提供wrapper运行的环境,所以它叫上下文context)。一般来说,都采用默认的标准wrapper类,因此在context容器中几乎不会出现wrapper组件。
实例一
在 Host name="localhost"
的配置项的后一行加入以下:
1 | <Context docBase="/web/hello" path="/hello" reloadable="true" /> |
通俗来讲,context是用来定义一个web下面的子项目,docBase是指项目ROOT所在的目录,而path是指该项目访问的路径。配置完成之后,在 /web/hello
目录下新建 index.jsp ,写入如下代码:
1 | <%@ page language="java" %> |
然后重启tomcat,访问:
1 | [root@localhost web]# curl -s http://127.0.01:8090/hello/ |grep hello |
实例二:虚拟主机
如果要定义一个虚拟主机,需要定义一个host,可以在 Host name="localhost"
之前写入以下内容:
1 | <!-- 定义一个在$CATALINA_HOME/webapps下的虚拟主机 --> |
以上配置指的是配置 www.a.com
这个域名的虚拟主机,定义了这个虚拟主机的root为 CATALINA_HOME/webapps/a
,再定义了2个context,第二个Context跟第一个实例一样的意思,访问 www.a.com/test
,会去 CATALINA_HOME/webapps/xuexi
这个目录下面去资源。Valve后面定义的是日志的名字是xiaofang_access_log.txt
结合上面2个实例,完整的配置如下:
1 |
|
实例三:war包
官方提供了一个sample.war作为tomcat学习初级示例( https://tomcat.apache.org/tomcat-8.5-doc/appdev/sample/sample.war ),下载后只需将其放入webapps下,然后重启tomcat,tomcat会自动展开war归档。测试访问下:
1 | [root@localhost webapps]# curl -s http://127.0.01:8090/sample/hello.jsp |grep JSP |