tomcat安装与配置(入门级)

简介

什么是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
2
3
4
5
6
7
8
9
10
		tar zvxf jdk-8u231-linux-x64.tar.gz -C /usr/local
ln -s jdk1.8.0_231 java

# 在/etc/profile/jdk.sh加入:
echo "export JAVA_HOME=/usr/local/java/" >/etc/profile.d/jdk.sh
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >>/etc/profile.d/jdk.sh
echo "export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar" >>/etc/profile.d/jdk.sh

source /etc/profile.d/jdk.sh
java -version #检查是否配置成功

注:建议还是使用tar包方式进行安装。

安装tomcat

打开 http://tomcat.apache.org/ tomcat官网,选择对应的版本,我这边选择是8.5版本:

1
2
3
4
5
6
7
tar zxvf apache-tomcat-8.5.47.tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-8.5.47 /usr/local/tomcat

#配置环境变量
echo "export CATALINA_HOME=/usr/local/tomcat" > /etc/profile.d/tomcat.sh
echo 'export PATH=$CATALINA_HOME/bin:$PATH' >> /etc/profile.d/tomcat.sh
source /etc/profile.d/tomcat.sh

这样就安装完成了。可以通过 /usr/local/tomcat/bin/shutdown.sh && /usr/local/tomcat/bin/startup.sh 来重启tomcat了。

如果想通过systemctl来管理,可以将tomcat配置为系统服务:

/usr/lib/systemd/system/tomcat8.service
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]  
Description=Tomcat8
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking

ExecStart=/usr/tomcat/tomcat8/bin/startup.sh
ExecReload=/usr/tomcat/tomcat8/bin/startup.sh
ExecStop=/usr/tomcat/tomcat8/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

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来说,它高度模块化,通过各个组件实现各种功能。它的体系结构如下图所示:

img

其中:

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<server>
<service>
<connector />
<engine>
<host>
<context />
<context />
</host>
<host>
<context />
</host>
</engine>
</service>

<service>
......
</service>
</server>

server.xml主配置文件

安装完成之后,默认的server.xml配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost tmp]# cat /usr/local/tomcat/conf/server.xml  |sed -n '/<!--/,/-->/!p' |dos2unix |grep -v "^$"
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>
</Server>

具体的含义如下:

  1. 顶级元素server定义的是一个tomcat实例。默认监听在localhost:8005端口以接收shutdown命令。要启用多个tomcat实例,将它们监听在不同的端口即可。这个端口的定义为管理员提供一个关闭实例的便捷途径,可以直接telnet至此端口使用SHUTDOWN命令关闭此实例。
  2. 顶级元素service定义了service就能提供服务了。service组件中封装connector和container,它同时也表示将此service中的connector和container绑定起来,即由它们组成一个service向外提供服务。默认不做修改。
  3. 连接器connector用于接收客户端发送的请求并返回响应给客户端。一个service中可以有多个connector。其实就是定义服务端口。
  4. engine容器用于从connector组件处接收已建立的TCP连接,还用于接收客户端发送的http请求并分析请求,然后按照分析的结果将相关参数传递给匹配出的虚拟主机。engine还用于指定默认的虚拟主机。
  5. host容器定义虚拟主机,由于tomcat主要是作为servlet容器的,所以为每个webapp指定了它们的根目录appBase。
  6. 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 ,写入如下代码:

/web/hello/index.jsp
1
2
3
4
5
6
7
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<body>
<% out.println("hello world from /web/hello"); %>
</body>
</html>

然后重启tomcat,访问:

1
2
[root@localhost web]# curl -s http://127.0.01:8090/hello/ |grep hello
hello world from /web/hello

实例二:虚拟主机

如果要定义一个虚拟主机,需要定义一个host,可以在 Host name="localhost" 之前写入以下内容:

1
2
3
4
5
6
7
8
9
<!-- 定义一个在$CATALINA_HOME/webapps下的虚拟主机 -->
<Host name="www.a.com" appBase="webapps/a"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="" reloadable="true" />
<Context path="/test" docBase="xuexi" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="xiaofang_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

以上配置指的是配置 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个实例,完整的配置如下:

/usr/local/tomcat/conf/server.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>

<!-- 定义一个在$CATALINA_HOME/webapps下的虚拟主机 -->
<Host name="www.a.com" appBase="webapps/a"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="" reloadable="true" />
<Context path="/test" docBase="xuexi" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="xiaofang_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/hello" path="/hello" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>
</Server>

实例三:war包

官方提供了一个sample.war作为tomcat学习初级示例( https://tomcat.apache.org/tomcat-8.5-doc/appdev/sample/sample.war ),下载后只需将其放入webapps下,然后重启tomcat,tomcat会自动展开war归档。测试访问下:

1
2
3
4
[root@localhost webapps]# curl -s http://127.0.01:8090/sample/hello.jsp |grep JSP
<title>Sample Application JSP Page</title>
<h1>Sample Application JSP Page</h1>
This is the output of a JSP page that is part of the Hello, World

参考资料

Tomcat(二):tomcat配置文件server.xml详解和部署简介

最简tomcat+war包

tomcat访问host-manager出现403问题解决

0%