SSM项目的部署

Mysql8.0、Tomcat9.0、jdk1.8

单体项目

第一阶段:环境搭建 (JDK, MySQL, Tomcat)

在部署项目之前,服务器必须具备运行环境。

1. 安装 JDK 1.8

SSM 项目通常依赖 JDK 1.8。

  • 检查是否已安装: java -version
  • 安装 (以 CentOS 为例):
bash 复制代码
# 搜索 JDK 1.8
yum list java-1.8*

# 安装 JDK 1.8
yum install java-1.8.0-openjdk-devel.x86_64

# 验证
java -version

或者下载 .tar.gz 包手动解压配置环境变量(JAVA_HOME),这里推荐 yum 安装更便捷。

2. 安装与配置 MySQL 8.0

MySQL 8.0 与 5.7 相比,密码认证插件和驱动配置有所不同,需特别注意。

  • 下载与安装:
bash 复制代码
# 下载 MySQL 源
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 安装源
rpm -ivh mysql80-community-release-el7-3.noarch.rpm

# 安装 MySQL 服务
yum install mysql-community-server

# 启动服务
systemctl start mysqld
  • 初始化配置:
bash 复制代码
# 1. 获取临时密码 (安装后会生成一个临时密码)
grep 'temporary password' /var/log/mysqld.log

# 2. 登录 MySQL
mysql -u root -p
# (输入刚才查到的临时密码)

# 3. 修改 Root 密码 (MySQL 8 要求密码复杂度:大小写+数字+特殊字符)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass@123';

# 4. (重要) 允许远程连接 & 修改加密规则
# 许多旧版 SSM 项目用的 JDBC 驱动较老,可能不支持 caching_sha2_password,建议改为 mysql_native_password
use mysql;
update user set host = '%' where user = 'root';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass@123';
FLUSH PRIVILEGES;
exit;
3. 安装 Tomcat 9.0

Tomcat 是运行 WAR 包的容器。

bash 复制代码
cd /usr/local/
# 下载 (链接可能会变,请以官网为准)
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.98/bin/apache-tomcat-9.0.98.tar.gz

# 解压
tar -zxvf apache-tomcat-9.0.98.tar.gz

# 重命名方便管理
mv apache-tomcat-9.0.98 tomcat9

第二阶段:本地项目配置与打包

在将代码上传到服务器前,必须在本地修改配置以适配服务器环境。

1. 修改数据库配置文件 (jdbc.propertiesapplication.yml)

确保你的 SSM 项目中的数据库连接信息指向服务器的数据库,或者配置为 localhost(因为项目将来运行在服务器上,对项目来说数据库就在本机)。

特别注意 MySQL 8.0 的 JDBC 配置差异:

  • Driver: com.mysql.cj.jdbc.Driver (以前是 com.mysql.jdbc.Driver)
  • URL: 必须加时区 serverTimezone=Asia/Shanghai,否则报错。
properties 复制代码
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/your_db_name?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=YourStrongPass@123
2. 确保 pom.xml 打包方式为 WAR

打开 pom.xml,确保有以下标签:

xml 复制代码
<packaging>war</packaging>
3. 执行 Maven 打包

在项目根目录(也就是有 pom.xml 的目录)执行命令行:

bash 复制代码
# 清理旧文件并打包,跳过测试用例以加快速度
mvn clean package -Dmaven.test.skip=true

执行成功后,在项目的 target 目录下会生成一个 .war 文件(例如 my-ssm-project.war)。


第三阶段:部署到服务器

1. 导入数据库脚本

使用 Navicat 或 SQLyog 远程连接服务器的 MySQL,先运行你的 sql 建表脚本,确保数据库和表结构存在。

2. 上传 WAR 包

使用 FTP 工具(如 Xftp, FileZilla)或 scp 命令将本地 target 目录下的 xxx.war 上传到服务器 Tomcat 的 webapps 目录。

bash 复制代码
# 假设你在本地终端
scp target/my-ssm-project.war root@服务器IP:/usr/local/tomcat9/webapps/
3. 部署策略 (两种方式)
  • 方式 A:保留项目名
    如果不改名,上传后访问路径为:http://服务器IP:8080/my-ssm-project/
  • 方式 B:作为根项目 (ROOT)
    如果你想直接通过 http://服务器IP:8080/ 访问,请将上传的 war 包重命名为 ROOT.war (注意大写),并删除 webapps 下原有的 ROOT 文件夹。

第四阶段:启动与配置 (CLI 操作)

1. 启动 Tomcat
bash 复制代码
cd /usr/local/tomcat9/bin

# 赋予脚本执行权限 (首次需要)
chmod +x *.sh

# 启动
./startup.sh
2. 查看日志 (至关重要)

启动命令执行后,必须看日志确认是否有报错(如数据库连不上、Bean 创建失败)。

bash 复制代码
# 实时查看控制台日志
tail -f /usr/local/tomcat9/logs/catalina.out

Ctrl + C 退出日志查看。

3. 防火墙配置

如果 Tomcat 启动成功(日志显示 Server startup in [xxx] ms),但外部浏览器无法访问,通常是防火墙拦截了 8080 端口。

bash 复制代码
# 开放 8080 端口 (CentOS 7+)
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重载防火墙
firewall-cmd --reload

总结:常用命令速查表

操作 命令/路径
项目打包 mvn clean package -DskipTests
Tomcat 目录 /usr/local/tomcat9/
Web 应用目录 /usr/local/tomcat9/webapps/
启动 Tomcat /usr/local/tomcat9/bin/startup.sh
停止 Tomcat /usr/local/tomcat9/bin/shutdown.sh
查看日志 tail -f /usr/local/tomcat9/logs/catalina.out
查端口占用 `netstat -nlp

常见问题排查

  1. 数据库连接报错: 检查 jdbc.properties 中的密码是否与服务器 MySQL 一致,以及 URL 是否包含时区设置。
  2. 404 Not Found: 确认 WAR 包是否已自动解压(ls webapps 查看是否有对应的文件夹)。如果没解压,说明 Tomcat 没启动成功,请查 catalina.out
  3. 版本不兼容: 如果报错 Unsupported major.minor version 52.0,说明你编译用的 JDK 版本比 Tomcat 运行用的 JDK 版本高(确保服务器也是 JDK 1.8)。

聚合项目(所有模块都在同一Tomcat服务下)

针对 多 WAR 包共存 的详细部署步骤:


第一阶段:本地项目配置与打包 (Maven)

假设你的 Maven 聚合项目结构如下:

text 复制代码
Parent-Project (pom)
 ├── common-module  (jar: 公共工具/实体类)
 ├── service-module (jar: 业务逻辑)
 ├── admin-web      (war: 后台管理系统)  <-- 需要部署
 └── app-api        (war: 手机端接口)    <-- 需要部署
1. 确认 POM 配置

你需要确保 每一个 需要独立部署的子模块(如 admin-webapp-api),其 pom.xml 中都配置了 war 打包方式:

xml 复制代码
<packaging>war</packaging>
2. 避免路径冲突 (代码层面)

虽然它们运行在不同的上下文路径下,但建议检查以下几点:

  • Cookie 覆盖问题: 如果两个项目部署在同域名同端口下,Session Cookie 可能会冲突。通常 Tomcat 会自动处理(Path 不同),但最好确保 application.propertiesweb.xml 里的 Session 配置是默认的。
  • 数据库连接池: 因为是两个独立应用,它们会分别创建各自的连接池。如果应用很多,要注意 MySQL 的最大连接数限制(不要让单个应用占用太多)。
3. 批量打包

父工程 (Parent) 根目录下执行命令,Maven 会自动按顺序打包所有模块。

bash 复制代码
# 在父工程根目录执行
mvn clean package -Dmaven.test.skip=true
4. 收集 WAR 包

打包完成后,分别去各子模块的 target 目录找 war 包:

  • admin-web/target/admin-web-1.0.war
  • app-api/target/app-api-1.0.war

建议在本地把它们重命名为你想要访问的短名字,例如:

  • admin.war
  • api.war

第二阶段:服务器部署操作

1. 上传所有 WAR 包

将重命名好的 war 包全部上传到服务器 Tomcat 的 webapps 目录。

bash 复制代码
# 假设你在本地,使用 scp 上传 (或者用 FileZilla)
scp admin.war root@服务器IP:/usr/local/tomcat9/webapps/
scp api.war root@服务器IP:/usr/local/tomcat9/webapps/
2. 目录结构确认

上传后,服务器的目录结构应该像这样:

text 复制代码
/usr/local/tomcat9/webapps/
├── ROOT/        (默认首页,可选删除)
├── admin.war    (后台系统)
└── api.war      (接口系统)

第三阶段:Tomcat 内存优化 (多应用部署的关键)

这是最重要的一步。

默认的 Tomcat 内存配置很小(通常几十 MB)。当你启动好几个 SSM 项目时,Spring 容器会初始化多次,极易导致 OutOfMemoryError: Java heap space 或者 PermGen/Metaspace 溢出。

你需要修改 Tomcat 的启动参数来增加内存。

1. 创建/编辑 setenv.sh

在 Tomcat 的 bin 目录下创建 setenv.sh 文件(Linux 下 Tomcat 启动时会自动读取这个文件,优于直接改 catalina.sh)。

bash 复制代码
cd /usr/local/tomcat9/bin
vi setenv.sh
2. 写入内存配置

i 进入编辑,写入以下内容(根据你的服务器内存调整,以下假设服务器有 4G 内存):

bash 复制代码
# JVM 内存设置
# -Xms: 初始堆内存 (建议 512m 或 1024m)
# -Xmx: 最大堆内存 (建议 1024m 或 2048m)
# -XX:MetaspaceSize: 元空间 (存放 Class 信息,SSM 类很多,这个要大)
export JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"

Esc,输入 :wq 保存退出。

3. 赋予执行权限
bash 复制代码
chmod +x setenv.sh

第四阶段:启动与验证

1. 启动 Tomcat
bash 复制代码
cd /usr/local/tomcat9/bin
./startup.sh
2. 观察日志 (核心步骤)

因为是多个项目同时启动,日志会混在一起,必须仔细看有没有报错。

bash 复制代码
tail -f /usr/local/tomcat9/logs/catalina.out

你会看到类似这样的日志流:

  1. Deploying web application archive [.../admin.war] -> Spring 容器初始化 -> 完成。
  2. Deploying web application archive [.../api.war] -> Spring 容器初始化 -> 完成。
  3. Server startup in [xxxx] ms
3. 访问测试

这种部署方式,访问路径是 IP:8080/文件名

  • 后台系统: http://服务器IP:8080/admin/
  • 接口系统: http://服务器IP:8080/api/

进阶:如何修改访问路径(可选)

如果你不想改 war 包的名字(比如 war 包叫 admin-1.0-SNAPSHOT.war),但想通过 /admin 访问,或者你想把其中一个作为根目录(/)。

你需要修改 /usr/local/tomcat9/conf/server.xml,在 <Host> 标签内添加 <Context> 配置:

xml 复制代码
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

    <Context path="" docBase="admin" reloadable="false" />

    <Context path="/api" docBase="api-v1" reloadable="false" />

</Host>

注意:如果不配置 server.xml,Tomcat 默认就是用文件名作为路径。


总结流程图

  1. Maven 父工程 -> mvn clean package
  2. 获取产物 -> 拿到 admin.war, api.war, mobile.war
  3. 上传 -> 全部扔进服务器 /tomcat9/webapps/
  4. 配置内存 -> bin/setenv.sh (增加 Heap 和 Metaspace)
  5. 启动 -> startup.sh
  6. 访问 -> IP:8080/admin, IP:8080/api

聚合项目(所有模块分别独自霸占一个Tomcat服务)

这种部署方案被称为 "多实例部署" (Multi-Instance)

它的核心思想是:在物理上复制多份 Tomcat 文件夹,每个 Tomcat 独立运行,监听不同的端口,互不干扰。如果其中一个挂了(比如内存溢出),不会影响另一个。

以下是完整的操作步骤和配置细节:


第一阶段:准备工作 (目录规划)

假设你要部署两个项目:

  1. Admin 系统 (admin.war) -> 计划端口 8081
  2. API 系统 (api.war) -> 计划端口 8082
1. 复制 Tomcat 目录

假设你已经解压了一个标准的 Tomcat 到 /usr/local/tomcat9。我们将它作为"母板",复制出两份新的。

bash 复制代码
cd /usr/local/

# 复制出 Admin 用的 Tomcat
cp -r tomcat9 tomcat-admin

# 复制出 API 用的 Tomcat
cp -r tomcat9 tomcat-api

现在你的 /usr/local/ 下有三个目录(原版保留备用,实际运行那两个新的)。


第二阶段:修改端口配置 (最关键步骤)

Tomcat 默认占用 3 个端口,必须全部修改,否则第 2 个 Tomcat 启动时会报错端口被占用

1. 端口规划表

建议按照规律修改,防止弄混:

服务名称 目录名 HTTP端口 (访问用) Shutdown端口 (停止服务用) AJP端口 (通常用不到)
Admin tomcat-admin 8081 8006 8010
API tomcat-api 8082 8007 8011

(原默认端口分别是:8080, 8005, 8009)

2. 修改 Admin Tomcat 配置
bash 复制代码
# 编辑配置文件
vi /usr/local/tomcat-admin/conf/server.xml

找到以下三处并修改:

  1. Shutdown 端口 (通常在第 22 行左右):
xml 复制代码
<Server port="8006" shutdown="SHUTDOWN">
  1. HTTP 端口 (通常在第 69 行左右):
xml 复制代码
<Connector port="8081" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
  1. AJP 端口 (通常在第 116 行左右,如果注释掉了就不用管,没注释则要改):
xml 复制代码
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

保存退出 (:wq)。

3. 修改 API Tomcat 配置

同样的操作,对应 API 的端口规划:

bash 复制代码
vi /usr/local/tomcat-api/conf/server.xml
  • Server port 改为 8007
  • Connector HTTP port 改为 8082
  • Connector AJP port 改为 8011

保存退出。


第三阶段:部署 WAR 包

将 WAR 包分别放入对应的 Tomcat 容器中。为了访问方便(不带项目名),建议都重命名为 ROOT.war

1. 部署 Admin 项目
bash 复制代码
# 先清空默认应用
rm -rf /usr/local/tomcat-admin/webapps/*

# 上传并重命名 (假设 war 包在本地当前目录)
scp admin.war root@服务器IP:/usr/local/tomcat-admin/webapps/ROOT.war

*访问地址将是:http://服务器IP:8081/*

2. 部署 API 项目
bash 复制代码
# 先清空默认应用
rm -rf /usr/local/tomcat-api/webapps/*

# 上传
scp api.war root@服务器IP:/usr/local/tomcat-api/webapps/ROOT.war

*访问地址将是:http://服务器IP:8082/*


第四阶段:独立内存配置 (可选但推荐)

既然是两个独立的 Java 进程,建议给它们分别设置内存,防止相互抢资源。

为 Admin 设置内存:

bash 复制代码
vi /usr/local/tomcat-admin/bin/setenv.sh

写入:

bash 复制代码
# Admin 没那么耗资源,给小一点
export JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx512m"

赋予权限:chmod +x /usr/local/tomcat-admin/bin/setenv.sh

为 API 设置内存:

bash 复制代码
vi /usr/local/tomcat-api/bin/setenv.sh

写入:

bash 复制代码
# API 可能是高并发,给大一点
export JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx1024m"

赋予权限:chmod +x /usr/local/tomcat-api/bin/setenv.sh


第五阶段:启动与运维

现在你可以独立控制它们了。

1. 启动
bash 复制代码
# 启动 Admin
/usr/local/tomcat-admin/bin/startup.sh

# 启动 API
/usr/local/tomcat-api/bin/startup.sh
2. 检查

使用 ps 命令查看进程,应该能看到两个 java 进程。

bash 复制代码
ps -ef | grep tomcat

或者检查端口监听:

bash 复制代码
netstat -ntlp | grep java
# 应该能看到 8081, 8006, 8082, 8007 都在 LISTENING
3. 开放防火墙

别忘了把新端口放行。

bash 复制代码
firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --zone=public --add-port=8082/tcp --permanent
firewall-cmd --reload

总结:架构图解

部署完成后的服务器状态如下:

text 复制代码
服务器 (Linux)
├── 数据库 (MySQL 3306)
│
├── 进程 1: Tomcat-Admin
│    ├── 路径: /usr/local/tomcat-admin
│    ├── 端口: 8081 (HTTP) / 8006 (Shutdown)
│    └── 代码: webapps/ROOT.war (Admin项目)
│
└── 进程 2: Tomcat-API
     ├── 路径: /usr/local/tomcat-api
     ├── 端口: 8082 (HTTP) / 8007 (Shutdown)
     └── 代码: webapps/ROOT.war (API项目)

优点:

  1. 互不影响: Admin 后台如果因为处理 excel 导入导致内存溢出崩了,API 接口服务依然正常运行。
  2. 热更新方便: 你可以只重启 Admin,不影响 API 的用户。
  3. 日志分离: tomcat-admin/logstomcat-api/logs 分开,查错更清晰。
相关推荐
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-DDD业务领域模块设计思路
java·数据库·人工智能·spring boot·ddd
青小莫2 小时前
C语言vsC++中的动态内存管理(内含底层实现讲解!)
java·c语言·c++
{Hello World}2 小时前
Java抽象类与接口深度解析
java·开发语言
AI视觉网奇2 小时前
ue5 自定义 actor ac++ actor 用法实战
java·c++·ue5
光明顶上的5G3 小时前
本地缓存面试重点
java·缓存·面试
haluhalu.3 小时前
深入理解Linux线程机制:线程概念,内存管理
java·linux·运维
jiaguangqingpanda3 小时前
Day22-20260118
java·开发语言
雪碧聊技术3 小时前
1、LangChain4j 名字的寓意
java·大模型·langchain4j
风生u3 小时前
bpmn 的理解和元素
java·开发语言·工作流·bpmn