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 包的容器。
- 下载与解压:
前往 Apache Tomcat 9 官网 复制Core->tar.gz的链接。
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.properties 或 application.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 |
常见问题排查
- 数据库连接报错: 检查
jdbc.properties中的密码是否与服务器 MySQL 一致,以及 URL 是否包含时区设置。 - 404 Not Found: 确认 WAR 包是否已自动解压(
ls webapps查看是否有对应的文件夹)。如果没解压,说明 Tomcat 没启动成功,请查catalina.out。 - 版本不兼容: 如果报错
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-web 和 app-api),其 pom.xml 中都配置了 war 打包方式:
xml
<packaging>war</packaging>
2. 避免路径冲突 (代码层面)
虽然它们运行在不同的上下文路径下,但建议检查以下几点:
- Cookie 覆盖问题: 如果两个项目部署在同域名同端口下,Session Cookie 可能会冲突。通常 Tomcat 会自动处理(Path 不同),但最好确保
application.properties或web.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.warapp-api/target/app-api-1.0.war
建议在本地把它们重命名为你想要访问的短名字,例如:
admin.warapi.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
你会看到类似这样的日志流:
Deploying web application archive [.../admin.war]-> Spring 容器初始化 -> 完成。Deploying web application archive [.../api.war]-> Spring 容器初始化 -> 完成。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 默认就是用文件名作为路径。
总结流程图
- Maven 父工程 ->
mvn clean package - 获取产物 -> 拿到
admin.war,api.war,mobile.war - 上传 -> 全部扔进服务器
/tomcat9/webapps/ - 配置内存 ->
bin/setenv.sh(增加 Heap 和 Metaspace) - 启动 ->
startup.sh - 访问 ->
IP:8080/admin,IP:8080/api
聚合项目(所有模块分别独自霸占一个Tomcat服务)
这种部署方案被称为 "多实例部署" (Multi-Instance)。
它的核心思想是:在物理上复制多份 Tomcat 文件夹,每个 Tomcat 独立运行,监听不同的端口,互不干扰。如果其中一个挂了(比如内存溢出),不会影响另一个。
以下是完整的操作步骤和配置细节:
第一阶段:准备工作 (目录规划)
假设你要部署两个项目:
- Admin 系统 (admin.war) -> 计划端口 8081
- 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
找到以下三处并修改:
- Shutdown 端口 (通常在第 22 行左右):
xml
<Server port="8006" shutdown="SHUTDOWN">
- HTTP 端口 (通常在第 69 行左右):
xml
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- 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项目)
优点:
- 互不影响: Admin 后台如果因为处理 excel 导入导致内存溢出崩了,API 接口服务依然正常运行。
- 热更新方便: 你可以只重启 Admin,不影响 API 的用户。
- 日志分离:
tomcat-admin/logs和tomcat-api/logs分开,查错更清晰。