一、Java基础

1.1 后台应用架构

1.1.1 单体架构

单体架构(Monolithic Architecture)是一种传统的软件架构模式,把所有的功能都放在同一个应用里,将整个应用部署在一台服务器上。在单体架构中,所有的功能模块都被打包在一起(比如Java实现就打包成jar包或war包部署),共享同一个代码库和数据库。
       优点:

  • 开发简单:由于整个应用程序是一个单一的实体,因此开发过程相对简单,开发人员可以更容易地理解和管理代码。
  • 调试和测试容易:由于整个应用程序在同一个环境下运行,因此调试和测试过程相对容易。
  • 部署简单:将整个应用程序作为一个单元进行部署,只需将单个代码库和数据库进行部署。
  • 性能较好:由于应用程序内部通信没有网络延迟,因此性能通常较好。

缺点:

  • 可扩展性差:由于所有功能模块都耦合在一起,当应用程序需要扩展时,必须扩展整个应用程序,而不仅仅是某个特定的模块。
  • 维护困难:随着应用程序规模的增长,代码库会变得庞大且复杂,导致维护困难。
  • 技术栈限制:由于整个应用程序使用相同的技术栈,因此难以使用不同的技术栈开发特定模块。
  • 可靠性差:由于整个应用程序是一个单一的实体,当某个模块出现问题时,整个应用程序可能会崩溃。

1.1.2 微服务

微服务架构风格的开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。

1.2 Java

1.2.1 Java的工作原理

Java的工作原理涉及到四个主要方面:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口。

1.2.1.1 Java编程语言

Java编程语言是Java开发中的核心部分。通过这种编程语言,开发者可以创建各种类、方法和变量等元素来实现功能。Java编程语言采用面向对象的编程方式,使用类来组织和管理相关的数据和功能,并提供了丰富的类库供开发者使用。

1.2.1.2 Java类文件格式

Java类文件格式是Java源代码编译后生成的中间形式。Java编译器(Javac)将Java源代码编译成一种称为“字节码”的格式,然后将其存储在独立的.class文件中。这个字节码格式具有跨平台的特性,可以在所有支持Java虚拟机的平台上运行。这使得Java编程在不同的操作系统和硬件上都能够稳定地运行。

1.2.1.3 Java虚拟机(JVM)

Java虚拟机是Java工作原理中最核心的组成部分。它是一个抽象的计算机,为Java程序提供了运行环境。Java虚拟机通过解释字节码并在内存中执行转换(通过JVM的解释器转换为操作系统所能识别的机器码)来运行Java应用程序。当Java应用程序需要执行时,Java虚拟机会在内存中创建一个Java进程,并开始解释和执行应用程序的字节码。Java虚拟机还提供了一些其他功能,如垃圾回收和线程管理等。

1.2.1.4 Java应用程序接口

Java应用程序接口(API)是Java工作原理的最后一个组成部分。它包含了各种Java库和工具,可以帮助开发人员快速地实现常见的功能。Java API包括标准库、扩展库和第三方库。标准库包含了Java核心构建块,如集合、输入/输出、网络、并发等。扩展库则提供了更多的类和接口,可以增强Java程序的功能。第三方库则由其他开发者提供,可以用于特定的应用程序开发中。

总结:当编辑并运行一个Java程序时,需要同时涉及到这四种方面。首先,使用文本编辑软件或集成开发环境在Java源文件中定义不同的类,并通过调用这些类中的方法访问资源系统。然后,源文件被编译成一种二进制字节码,存储在.class文件中。接着,通过运行与操作系统平台环境相对应的Java虚拟机来运行.class文件,并执行转换产生的机器码,调用其中实现的方法来满足程序的Java API调用。

Tomcat基础_tomcat

1.2.2 JDK

1.2.2.1 JDK与JRE的关系
  • JRE:Java Runtime Environment缩写,指Java运行时环境, 包含 JVM + Java核心类库
  • JDK:Java Development Kit,即 Java 语言的软件开发工具包,JDK协议基于 JRL(JavaResearch License) 协议

Tomcat基础_Java_02

1.2.2.2 安装Oracle官方JDK

下载地址:https://www.oracle.com/java/technologies/downloads/,可选择java8或java11版本(目前主流使用的版本)下载。这里采用二进制文件安装。当然也可以用yum或apt安装openjdk,但相对来说,Oracle jDK具有更好的响应能力和JVM性能,更加稳定。

Tomcat基础_tomcat_03

#解压
tar -xf jdk-11.0.22_linux-x64_bin.tar.gz
mv jdk-11.0.22 /usr/local/jdk11
#初始化环境变量
vim /etc/profile.d/jdk.sh
#!/bin/bash
export JAVA_HOME=/usr/local/jdk11
export PATH=$PATH:$JAVA_HOME/bin

source /etc/profile.d/jdk.sh
java -version

Tomcat基础_tomcat_04

二、Tomcat基础功能

2.1 Tomcat介绍

Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML静态资源页面的功能,同时它还是一个 Servlet和JSP容器。

2.2 安装Tomcat

2.2.1 二进制安装Tomcat

也可以采用yum或apt方式安装,这里就用二进制文件方式安装。下载地址:https://tomcat.apache.org/download-80.cgi或https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat

Tomcat基础_Java_05

#下载安装包并解压
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.18/bin/apache-tomcat-10.1.18.tar.gz
tar -xf apache-tomcat-10.1.18.tar.gz
mv apache-tomcat-10.1.18 /usr/local/tomcat
#指定PATH变量
vim /etc/profile.d/tomcat.sh
#!/bin/bash
export TOMCAT_HOME=/usr/local/tomcat
export PATH=$PATH:$TOMCAT_HOME/bin
source /etc/profile.d/tomcat.sh
cd /usr/local/tomcat/bin
#查看Tomcat版本信息
./catalina.sh version
#启动Tomcat服务
sh startup.sh或者./catalina.sh start
#停止Tomcat服务
sh shutdown.sh或者./catalina.sh stop

访问http://tomcat服务器IP:8080,可看到如下界面

Tomcat基础_tomcat_06

Tomcat的核心分为3个部分:

  • Web容器:处理静态页面;
  • JSP容器:把jsp页面翻译成一般的 servlet(早期的Java动态网页技术)再翻译成字节码再执行
  • catalina:是一个servlet容器,用于处理servlet

2.2.2 配置Tomcat自启动的Service文件

生产环境中最好用普通用户启动Tomcat。

useradd -r -s /sbin/nologin tomcat
chown -R tomcat:tomcat /usr/local/tomcat
vim /lib/systemd/system/tomcat.service
[Unit]
Descriptinotallow=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
#添加Java的环境变量,环境变量名及路径随安装JDK时的定义来
Envirnotallow=JAVA_HOME=/usr/local/jdk11
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target

systemctl enable --now tomcat
systemctl status tomcat

2.3 Tomcat的文件结构和目录组成

2.3.1 目录结构

目录

说明

bin

服务启动、停止等相关程序和文件

conf

配置文件

lib

库目录

logs

日志目录

webapps

应用程序的部署目录

work

jsp编译后的结果文件,建议提前预热访问,升级应用后,删除此目录数据才能更新

2.3.2 配置文件和日志

2.3.2.1 配置文件

在tomcat安装目录下的 conf 子目录中,有以下的 tomcat 的配置文件:

文件名

说明

server.xml


主配置文件

web.xml

每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件

context.xml

用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中, 覆盖全局的文件

tomcat-users.xml

用户认证的账号和密码文件

catalina.policy

当使用security选项启动tomcat时,用于为tomcat设置安全策略

catalina.properties

Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数

logging.properties

Tomcat日志系统相关的配置,可以修改日志级别和日志路径等

2.3.2.2 日志文件
2.3.2.2.1 Tomcat日志文件说明

tomcat有五类日志:catalina、localhost、manager、admin、host-manager。

  • catalina.out

catalina.out即标准输出和标准出错,所有输出到这两个位置的都会进入catalina.out,这里包含tomcat 运行自己输出的日志以及应用里向console输出的日志。默认这个日志文件是不会进行自动切割的,需要借助其他工具进行切割(注意:catalina.out文件如果过大会受影响)

  • catalina.YYYY-MM-DD.log

catalina.{yyyy-MM-dd}.log是tomcat自己运行的一些日志,这些日志还会输出到catalina.out,但是应用向console输出的日志不会输出到catalina.{yyyy-MM-dd}.log,它是tomcat的启动和暂停时的运行日志,注意,它和catalina.out是里面的内容是不一样的。

  • localhost.YYYY-MM-DD.log

localhost.{yyyy-MM-dd}.log主要是应用初始化(listener,filter,servlet)未处理的异常最后被tomcat捕获而输出的日志,它也是包含tomcat的启动和暂停时的运行日志,但它没有catalina.YYYY-MM-DD.log日志全。 它只是记录了部分日志。

  • localhost_access_log.YYYY-MM-DD.txt

这个是访问tomcat的日志,请求时间和资源,状态码都有记录。

  • host-manager.YYYY-MM-DD.log

这个是放tomcat的自带的manager项目的日志信息的,未看到有什么重要的日志信息。

  • manager.YYYY-MM-DD.log

这个是tomcat manager项目专有的日志文件。

2.3.2.2.2 Tomcat访问日志格式

格式样式为%h %l %u %t "%r" %s %b。类似于如下格式(查看localhost_access_log.YYYY-MM-DD.txt):

192.168.131.1 - - [31/Jan/2024:11:25:57 +0800] "GET /examples/ HTTP/1.1" 403 865
客户端地址 用户验证 用户账号 时间请求 方式+URL 响应码 文件大小

具体样式说明如下(参考https://tomcat.apache.org/tomcat-10.1-doc/config/valve.html#Access_Logging):

* %a - Remote IP address // 这是记录访问者的IP
* %A - Local IP address // 这是记录本地服务器的IP
* %b - Bytes sent, excluding HTTP headers, or '-' if zero // 发送信息的字节数,不包括http头,如果字节数为0的话,显示为-
* %B - Bytes sent, excluding HTTP headers // 发送信息的字节数,不包括http头。
* %h - Remote host name (or IP address if resolveHosts is false) // 远程主机名(如果连接器的enableLookups为false,则为IP地址)。例如我的日志里是192.168.131.1
* %H - Request protocol //访问者的协议,这里是HTTP/1.1
* %l - Remote logical username from identd (always returns '-') // 远程逻辑用户 (可能这样翻译:记录浏览者进行身份验证时提供的名字)(通常返回 '-')
* %m - Request method (GET, POST, etc.) // 访问的方式,是GET还是POST
* %p - Local port on which this request was received // 本地接收访问的端口
* %q - Query string (prepended with a '?' if it exists) // 比如你访问的是aaa.jsp?bbb=ccc,那么这里就显示?bbb=ccc,就是querystring的意思
* %r - First line of the request (method and request URI) //请求报文的第一行(方法和URI)
* %s - HTTP status code of the response // http的响应状态码
* %S - User session ID // 用户的session ID,这个session ID大家可以另外查一下详细的解释,反正每次都会生成不同的session ID
* %t - Date and time, in Common Log Format // 请求时间
* %u - Remote user that was authenticated (if any), else '-' // 得到了验证的访问者,否则为"-"
* %U - Requested URL path // 访问的URL地址,我这里是/rightmainima/leftbott4.swf
* %v - Local server name // 服务器名称,可能就是你url里面写的那个吧,我这里是localhost
* %D - Time taken to process the request, in millis // 请求消耗的时间,以毫秒记
* %T - Time taken to process the request, in seconds //请求消耗的时间,以秒记
There is also support to write information from the cookie, incoming header, the Session or something else in the ServletRequest.
It is modeled after the apache syntax:
* %{xxx}i for incoming headers
* %{xxx}c for a specific cookie
* %{xxx}r xxx is an attribute in the ServletRequest
* %{xxx}s xxx is an attribute in the HttpSession

要想修改Tomcat的访问日志格式,则修改server.xml中的pattern字段。

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
 prefix="localhost_access_log" suffix=".txt"
 pattern="%h %l %u %t "%r" %s %b" />
说明:"在html 中表示双引号"符号

此外Tomcat可实现json格式的访问日志。实现方式如下:

vim server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
#注意是一行,不换行
pattern="
{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
 <!--    pattern="%h %l %u %t "%r" %s %b" /> -->

systemctl restart tomcat

刷新Tomcat页面访问,再看localhost_access_log.YYYY_MM_DD.txt就发现日志变成了json格式。

Tomcat基础_Java_07

利用jq工具(需事先安装)解析json格式。

Tomcat基础_tomcat_08

2.3.3 组件

2.3.3.1 组件分层和分类
  • 顶级组件:Server,代表整个Tomcat容器,一台主机可以启动多tomcat实例,需要确保端口不要产生冲突
  • 服务类组件:Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine
  • 连接器组件:Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口 8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。
  • 容器类:Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件, 内部配置如何运行应用程序。
  • 内嵌类:可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组 件内分别定义。
  • 集群类组件:listener、cluster
2.3.3.2 Tomcat内部组成

Tomcat基础_Java_09

名称

说明

Server

服务器,Tomcat运行的进程实例,一个Server中可以有多个Service,但通常就一个

Service

服务,用来组织Engine和Connector的对应关系,一个Service中只有一个Engine

Connector

连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine

Engine

即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector

Host

即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分

Context

应用的上下文,配置特定url路径映射和目录的映射关系:url=> directory

2.3.3.3 对核心组件的补充说明
  • Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个
  • 创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
  • 每个Service中,是Engine和其连接器Connector的关联配置。可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
  • Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host Engine对请求头做了分析,将请求发送给相应的虚拟主机 如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机 Engine上的缺省虚拟主机可以修改
  • Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配
  • Context 定义应用程序单独的路径映射和配置

在server.xml中即可看到多个组件的关系。

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
     <Host name="localhost"  appBase="webapps" unpackWARs="true"
autoDeploy="true">
         <Context >
         <Context />
     </Host>
    </Engine>
  </Service>
</Server>
2.3.3.4 Tomcat处理请求的过程
  1. 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1 Connector获得此请求。
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
  3. Engine获得请求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host
  4. Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理
  5. localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
  6. Host匹配到路径为/test的Context
  7. path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet
  8. Context匹配到URL PATTERN为 *.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
  9. Context把执行完了之后的HttpServletResponse对象返回给Host
  10. Host把HttpServletResponse对象返回给Engine
  11. Engine把HttpServletResponse对象返回给Connector
  12. Connector把HttpServletResponse对象返回给浏览器端

三、Tomcat常见配置解析

3.1 基于Web方式的 Server Status和Manager APP管理

打开浏览器可以访问tomcat管理的默认管理页面,点击下图两个按钮都会出现下面提示403的错误提示

Tomcat基础_Java_10

Tomcat基础_Java_11

Tomcat基础_Java_12

默认的管理页面被禁用,启用方法为修改webapps/manager/META-INF/context.xml

<Context antiResourceLocking="false" privileged="true" >
  <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
                   sameSiteCookies="strict" />
  #允许除本机之外的其它地址访问(这里是允许192.168.131.x网段机器可访问)
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
           allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.131\.\d+" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

       同样还需要修改tomcat-users.xml,后面会提到。

3.2 基于Web方式的Host Manager虚拟主机管理

可以通过tomcat的管理页面点下面Host Manager按钮进入管理虚拟主机的页面

Tomcat基础_Java_13

默认Host Manager 管理页被禁用,会出现下面提示(后续还有manager-gui的错误与之类似,就不截图了)

Tomcat基础_Java_14

3.2.1 允许本机访问

#根据上述提示找到tomcat-users.xml添加角色
cd /usr/local/tomcat
vim conf/tomcat-users.xml
#定义角色
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
#设置用户名/密码,并将用户加入对应的角色
<user username="admin" password="123456" roles="manager-gui,admin-gui"/>

systemctl restart tomcat

重启Tomcat后,点击"Host Manager"按钮

Tomcat基础_Java_15

Tomcat基础_Java_16

3.2.2 允许远程主机访问

但通过远程访问地址仍无法访问Host Manager管理页面,出现类似错误

Tomcat基础_tomcat_17

#根据上述提示找到context.xml,添加允许访问的主机网段
vim webapps/host-manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
  <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
                   sameSiteCookies="strict" />
#允许除本机之外的其它地址访问(这里是允许192.168.131.x网段机器可访问)
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.131\.\d+" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

无需重启服务,直接访问,输入前面的用户和密码,即可登录成功

Tomcat基础_tomcat_18

Tomcat基础_Java_19

3.2.3 创建新的虚拟主机

#创建虚拟主机前,必须先创建相关目录,否则创建虚拟机不成功。之后物理机做好hosts解析便于测试
mkdir -p /data/1st/ROOT
echo 'www.2nd.org' > /data/1st/ROOT/index.html
chown -R tomcat.tomcat /data/1st

Tomcat基础_tomcat_20

Tomcat基础_tomcat_21

Tomcat基础_Java_22

3.3 8005端口的安全配置管理

在conf/server.xml 有以下内容

<Server port="8005" shutdown="SHUTDOWN">

8005是Tomcat的管理端口,默认监听在127.0.0.1上。用普通用户telnet之后无需验证就可发送SHUTDOWN (大小写敏感)这个字符串,Tomcat接收到后就会关闭此Server。

此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现(但仍有爆破的可能)。或者port修改成 0,这样启动Tomcat时8005会换成随机端口(但还能用端口扫描工具能扫到)。如果port设为-1将关闭此功能,这样安全隐患解决的就更彻底一些。注意:-2不支持,因为会关掉8080端口。

3.4 显示指定的http服务器版本信息

默认不显示Tomcat的http的Server头信息, 可以指定Tomcat的http的Server头信息为相应的值。

Tomcat基础_tomcat_23

vim conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxParameterCount="1000" Server="wxd Server" />

systemctl restart tomcat

Tomcat基础_Java_24

3.5 Context配置

3.5.1 Context配置方式

Context作用:

  • 路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能。
  • 应用独立配置,例如单独配置应用日志、单独配置应用访问控制。
#映射指定路径
<Context path="/test" docBase="/data/test" reloadable="true" />
#映射站点的根目录
<Context path="/" docBase="/data/website" reloadable="true" />

说明:

  • path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先级更高。
  • docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)。
  • reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB 应用重新加载。生产环境中,建议使用false来禁用。

Tomcat的配置文件server.xml中修改如下,重启Tomcat生效。

<Host name="node1.wang,org" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">
      <Context path="/test" docBase="/data/test" reloadable="true" />
</Host>

mkdir -p /data/test
echo 1st test.org > /data/test/index.html

测试访问http://node1.wang.org:8080/test/   

Tomcat基础_tomcat_25

四、Tomcat部署Java应用

4.1 Tomcat的目录结构说明

在Tomcat中部署主站应用程序和其他应用程序,和之前WEB服务程序不同。以下以部署nginx和tomcat它们的安装目录在/usr/local下进行说明。

如果是nginx,要部署discuz应用,假设网站根目录为/usr/local/nginx/html,则将discuz解压缩文件到/usr/local/nginx/html/discuz下(也可放到根目录之外的其它目录)。

如果是Tomcat,要部署wordpress应用,它有个默认的网站根目录为/usr/local/tomcat/webapps/ROOT(数据存放目录),对于wordpress的解压缩文件,可以放到/usr/local/tomcat/webapps/ROOT目录下,也可放到/usr/local/tomcat/webapps、wordpress或不在Tomcat安装目录的其它自定义目录。

4.2 多虚拟主机配置说明

  • name:必须是主机名,用主机名来匹配。
  • appBase:当前主机的网页根目录,是相对于Tomcat安装路径的,也可以使用绝对路径。
  • unpackWARs:是否自动解压war格式。
  • autoDeploy:热部署,自动加载并运行应用。

4.3 部署案例

4.3.1 基于Java的博客系统Jpress

JPress 是一个使用Java开发的类似WordPress的产品的建站神器,目前已有超过10万+网站使用 JPress 搭建,其中包括多个政府机构,200+上市公司,中科院、红十字会等。

官方网站: http://www.jpress.cn/

注意:Jpress 程序需要使用Java8才能正常运行,Tomcat需配置Tomcat9.x;Jpress 程序的Bug,必须部署到网站根目录下才能正常使用。

#将jpress的war包上传至网站根目录目录并授权
mv jpress-v5.0.9.war /usr/local/tomcat/webapps/ROOT.war
chown -R tomcat.tomcat /usr/local/tomcat/webapps
#在server.xml中的Engine内添加虚拟主机
<Host name="www.myjpress.org"  appBase="webapps" unpackWARs="true" autoDeploy="true">
</Host>
systemctl restart tomcat
#准备数据库&用户授权
apt -y install mysql-server
mysql
mysql> create database jpress;
#Mysql 8.0需要指定插件
mysql> create user jpress@'localhost' identified with mysql_native_password by '123456';
mysql>grant all on jpress.* to jpress@'localhost';

Tomcat基础_tomcat_26

Tomcat基础_tomcat_27

Tomcat基础_tomcat_28

Tomcat基础_tomcat_29

      写博客时,上传的图片存放路径如下:

Tomcat基础_Java_30

4.3.2 基于Jar包的博客系统Halo

Halo 是一款现代化的基于JAVA实现的博客/CMS系统。具体参考https://docs.halo.run/getting-started/install/jar-file。注意需要jdk17的环境。

#下载包
wget https://dl.halo.run/release/halo-2.12.0.jar -O halo.jar
#创建工作目录
mkdir ~/.halo2 && cd ~/.halo2
vim application.yml
server:
  # 运行端口
  port: 8090
spring:
  # 数据库配置,支持 MySQL、MariaDB、PostgreSQL、H2 Database,具体配置方式可以参考下面的数据库配置
  r2dbc:
    url: r2dbc:pool:mysql://192.168.131.11:3306/halo2
    username: admin
    password: 123456
  sql:
    init:
      mode: always
      # 需要配合 r2dbc 的配置进行改动
      platform: mysql
halo:
  caches:
    page:
      # 是否禁用页面缓存
      disabled: true
  # 工作目录位置
  work-dir: /root/.halo2
  # 外部访问地址
  external-url: http://www.myhalo.org:8090
  # 附件映射配置,通常用于迁移场景
  attachment:
    resource-mappings:
      - pathPattern: /upload/**
        locations:
          - migrate-from-1.x

#创建数据库并授权
mysql>create database halo2;
#Mysql 8.0需要指定插件
mysql> create user halo2@'localhost' identified with mysql_native_password by '123456';
mysql>grant all on halo2.* to halo2@'localhost';
#测试运行Halo
java -jar halo.jar

Tomcat基础_Java_31