一、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调用。
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) 协议
1.2.2.2 安装Oracle官方JDK
下载地址:https://www.oracle.com/java/technologies/downloads/,可选择java8或java11版本(目前主流使用的版本)下载。这里采用二进制文件安装。当然也可以用yum或apt安装openjdk,但相对来说,Oracle jDK具有更好的响应能力和JVM性能,更加稳定。
#解压
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基础功能
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
#下载安装包并解压
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的核心分为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格式。
利用jq工具(需事先安装)解析json格式。
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内部组成
名称 | 说明 |
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处理请求的过程
- 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1 Connector获得此请求。
- Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
- Engine获得请求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host
- Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理
- localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
- Host匹配到路径为/test的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对象返回给浏览器端
三、Tomcat常见配置解析
3.1 基于Web方式的 Server Status和Manager APP管理
打开浏览器可以访问tomcat管理的默认管理页面,点击下图两个按钮都会出现下面提示403的错误提示
默认的管理页面被禁用,启用方法为修改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按钮进入管理虚拟主机的页面
默认Host Manager 管理页被禁用,会出现下面提示(后续还有manager-gui的错误与之类似,就不截图了)
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"按钮
3.2.2 允许远程主机访问
但通过远程访问地址仍无法访问Host Manager管理页面,出现类似错误
#根据上述提示找到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>
无需重启服务,直接访问,输入前面的用户和密码,即可登录成功
3.2.3 创建新的虚拟主机
#创建虚拟主机前,必须先创建相关目录,否则创建虚拟机不成功。之后物理机做好hosts解析便于测试
mkdir -p /data/1st/ROOT
echo 'www.2nd.org' > /data/1st/ROOT/index.html
chown -R tomcat.tomcat /data/1st
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头信息为相应的值。
vim conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxParameterCount="1000" Server="wxd Server" />
systemctl restart tomcat
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部署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';
写博客时,上传的图片存放路径如下:
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