环境

运行环境:Windows 10 | Apache Tomcat 9.0.34 | Java 1.8.0 | 博客记录时间:2020-4-23 08:59:27

下载 Tomcat

首先进入到 Tomcat官网 ,这里我们以 版本9 进行举例 (目前最新版本为10)。

9.0.34

Binary Distributions

这里我们直接点击 zip 下载,下载完之后文件目录如下:

  • apache-tomcat-9.0.34
    • bin - 运行文件,Windows环境下的.bat和Linux环境下的.sh
    • conf - 常用到的一些配置文件
    • lib - 一些 Java 的 Jar 包
    • logs - 日志
    • temp - 临时文件
    • webapps - 默认虚拟主机的默认项目根目录
    • work - 项目部署后的缓存文件目录

除了以前的文件夹外还有一些文件,如 README.md 文件

官网:Please see the README file for packaging information. It explains what every distribution contains.

运行 Tomcat

我们可以看到 webapps 目录下有5个初始项目:

  • webapps
    • docs
    • examples
    • host-manager
    • manager
    • ROOT

Tomcat 中 bin 和 lib 文件中的 Jar 包说明了需要在 Java 环境下运行

然后我们运行 bin 目录下的 startup.bat 文件,如果出现终端窗口一直在打印日志说明运行成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌────────────────────────────────────────────────────────┐
│Command Prompt
├────────────────────────────────────────────────────────┤
│Server.服务器版本:Apache Tomcat/9.0.34
│服务器构建:Apr 3 2020 2020 12:02:52 UTC
│服务器版本号(:9.0.34.0
│OS Name:Windows 10
│OS.版本:10.0
│架构:amd64
│Java 环境变量: C:\Program Files\Java\jdk1.8.0_251\jre
│JVM 版本:1.8.0_251-b08
│JVM.供应商:Oracle Corporation
│--- 略 ---
└────────────────────────────────────────────────────────┘

打印的内容大致如上,这时候使用浏览器访问 localhost:8080,就能看到 Tomcat 的如下页面:

webapps 目录下的 ROOT 项目

值得注意的是 work 目录中生成了对应项目的文件夹,但内容为空。以及 logs 文件中生成的日志文件,如 catalina.*.log 中的内容就是终端窗口打印的内容。

日志输出乱码问题

当窗口运行时输出的日志出现乱码,如淇℃伅之类的内容说明当前系统的默认字符与 conf 文件夹中 logging.properties 文件中 encoding 属性设置不相同(默认配置为UTF-8)。

解决方法

1
2
3
4
5
6
7
8
┌────────────────────────────────────────────────────────┐
│Command Prompt
├────────────────────────────────────────────────────────┤
│Microsoft Windows [版本 10.0.17763.1039]
│(c) 2018 Microsoft Corporation。保留所有权利。
│C:\Users\Administrator>chcp
│活动代码页: 936
└────────────────────────────────────────────────────────┘

获取当前系统活动代码页,找到对应编码,如下表:

活动代码页 编码
936 简体中文(GBK)
65001 UTF-8Unicode

然后修改 logging.properties 中 encoding = GBK,如下:

1
2
3
4
5
6
7
8
9
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90
1catalina.org.apache.juli.AsyncFileHandler.encoding = GBK

发布项目

1.添加 war 包到 webapps 中

  • webapps
    • FlogShiro.war

2.执行 startup.bat 文件 (如之前在执行状态先执行 shutdown.bat 文件)

打印出日志,并且在webapps中解压war,多出项目文件夹:

  • webapps
    • FlogShiro (解压的项目文件)
    • FlogShiro.war

3.访问网站

localhost:8080/FlogShiro/index.html

默认监听端口为8080,项目名为FlogShiro,展示页面为index.html

具体内容根据实际情况决定

配置

目前我们还没提到 conf 文件夹,以发布项目中的例子查看 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
<!-- 删除注解后内容如下 -->
<?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.AprLifecycleListener" SSLEngine="on" />
<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="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
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>

这里我们值得注意的就是 ServerServiceConnector 以及 Host

  • Server
    • port (服务器监听端口)
    • shutdown (关闭指令)
  • Service
    • name (服务名)
  • Connector
    • port (服务监听端口)
    • protocol (协议类型)
    • connectionTimeout (连接超时)
    • redirectPort (端口重定向)
  • Host
    • name (虚拟主机名称)
    • appBase (项目根目录)
    • unpackWARs (解压War包)
    • autoDeploy (自动部署)

显而易见,以发布项目的例子可以看出名为 localhost 的虚拟主机的根目录为 webapps ,并且配置了解压 war 包,Service监听的端口为 8080

所以当我们访问 localhost:8080 访问到了 webapps 目录下的ROOT,而访问 localhost:8080/FlogShiro 则访问到了指定FlogShiro项目。

虚拟主机

为什么我们访问 localhost127.0.0.1 访问到的东西是一样,因为本机已经做好了IP和域名的本地映射

找到 C:\Windows\System32\drivers\etc 中的hosts文件(C为系统盘)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host

# localhost name resolution is handled within DNS itself.
# 本地主机名称解析是在DNS本身内处理的。
# 127.0.0.1 localhost
# ::1 localhost

你可以按照上面的 example 添加虚拟主机名称,这样Tomcat配置文件夹下server.xml中Host属性name可以使用添加的主机名称。

当然如果你不想在 webapps 中添加项目,你也可以新添加的主机中配置其他文件夹问根目录。

注意:在访问中(具体得看实际情况),webapps 中可能存在一些会发生冲突的项目名,如 manager

相关文档