基于阿里云 ECS 的 Java 博客系统部署实践记录
一、项目背景
本次实践的目标是在阿里云 ECS 云服务器上部署一个 Java 博客系统,并通过 Nginx 对外提供统一访问入口。
该博客系统采用典型的 Java Web 架构,主要组件包括:
- JDK:提供 Java 运行环境
- MySQL:存储博客系统数据
- Tomcat:运行 Java Web 项目
- Nginx:作为 Web 入口和反向代理服务器
- 阿里云 ECS:承载整套服务环境
最终目标是:用户通过浏览器访问 Nginx 所在服务器的 80 端口,由 Nginx 将请求转发到后端 Tomcat 服务,Tomcat 调用 MySQL 数据库完成博客系统页面展示和业务处理。
二、整体架构设计
本次部署采用两台 ECS 云服务器:
| 节点 | 主要角色 | 部署组件 |
|---|---|---|
| node1 | 入口代理节点 | JDK、Nginx |
| node2 | 应用与数据库节点 | JDK、MySQL、Tomcat、博客系统 WAR 包 |
整体访问链路如下:
用户浏览器 ↓ 阿里云安全组 80 端口 ↓ node1:Nginx ↓ 反向代理 node2:Tomcat 8080 ↓ node2:MySQL 数据库这样设计的好处是:
- Nginx 统一对外暴露 80 端口。
- Tomcat 只作为后端应用服务,不直接暴露给公网。
- 后期如果扩展多台 Tomcat,可以继续使用 Nginx 做负载均衡。
- 整体结构更接近实际生产环境中的“入口层 + 应用层 + 数据层”部署方式。
三、ECS 服务器准备
本次使用阿里云 ECS 免费试用实例完成部署。创建 ECS 时主要关注以下几项:
图 1:阿里云 ECS 实例创建完成,node1 和 node2 分别作为代理节点与应用数据库节点
- 操作系统:CentOS Stream 9
- 配置规格:2 核 CPU、2GB 内存、40GB 云盘
- 网络:分配公网 IP
- 安全组:开放 SSH 22 端口和 HTTP 80 端口
- 后期临时验证 Tomcat 时开放 8080 端口,正式通过 Nginx 访问后再关闭 8080 公网访问
两台服务器分别设置主机名:
hostnamectl set-hostname node1.itcast.cn hostnamectl set-hostname node2.itcast.cn然后在两台服务器的/etc/hosts中添加内网解析记录:
<node1内网IP>node1 node1.itcast.cn<node2内网IP>node2 node2.itcast.cn这里需要注意:服务器之间通信应优先使用阿里云内网 IP,而不是公网 IP。这样可以减少公网暴露面,也更符合生产环境中的内网通信方式。
配置完成后,可以通过ping node1、ping node2验证主机名解析和两台服务器之间的连通性。
四、部署 JDK 环境
博客系统是 Java Web 项目,因此两台服务器都需要安装 JDK。
创建软件包目录:
mkdir-p/export/softwarecd/export/software下载 JDK 安装包:
wgethttps://raw.gitcode.com/open-source-toolkit/66825/blobs/7acfac1a75800e01c620ea37a18de1fa62c645e3/jdk-8u241-linux-x64.tar.gz解压到/opt目录:
tar-xzfjdk-8u241-linux-x64.tar.gz-C/opt配置系统环境变量:
vim/etc/profile在文件末尾添加:
exportJAVA_HOME=/opt/jdk1.8.0_241exportPATH=$JAVA_HOME/bin:$PATHexportCLASSPATH=$JAVA_HOME/lib:$CLASSPATH使配置生效:
source/etc/profile验证 JDK 是否安装成功:
java-versionjavac
图 3:JDK 1.8 环境配置完成,Java 命令可全局调用
能正常输出 Java 版本信息,说明 JDK 环境配置完成。
五、部署 MySQL 数据库
MySQL 部署在 node2 上,用于存储博客用户、文章、后台管理等数据。
安装 MySQL 官方仓库:
dnfinstall-yhttps://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm查看 MySQL 仓库是否启用:
dnf repolist enabled|grepmysql安装 MySQL 服务:
dnfinstall-ymysql-community-server--nogpgcheck启动并设置开机自启:
systemctl start mysqld systemctlenablemysqld systemctl status mysqld
图 4:node2 上 MySQL 服务启动成功
查看 MySQL 初始 root 密码:
greppassword /var/log/mysqld.log执行安全初始化:
mysql_secure_installation初始化完成后,使用 root 用户登录 MySQL:
mysql-uroot-p这里不建议在博客文档中写出真实数据库密码,生产环境也不应该将 root 密码暴露在文档、截图或公网仓库中。
六、导入博客系统初始化数据
博客系统需要提前准备数据库和基础数据。本次项目使用schema.sql和data.sql两个初始化脚本。
将 SQL 文件上传到 node2 后,执行:
cd~ mysql-uroot-p<schema.sql mysql-uroot-p<data.sql导入完成后登录数据库验证:
showdatabases;确认存在:
forum-java进入数据库:
useforum-java;showtables;查看用户表数据:
select*fromforum_user;如果数据库、表和基础用户数据都存在,说明博客系统的数据初始化完成。
七、部署 Tomcat 服务
Tomcat 部署在 node2 上,用于运行博客系统 WAR 包。
进入软件目录:
cd/export/software下载 Tomcat:
wgethttps://mirrors.huaweicloud.com/apache/tomcat/tomcat-9/v9.0.97/bin/apache-tomcat-9.0.97.tar.gz解压到/opt:
tar-xzfapache-tomcat-9.0.97.tar.gz-C/opt启动 Tomcat:
cd/opt/apache-tomcat-9.0.97/bin ./startup.sh查看 Tomcat 进程:
ps-ef|greptomcat查看端口监听:
ss-tulnp临时开放 8080 端口用于验证:
firewall-cmd--zone=public --add-port=8080/tcp--permanentfirewall-cmd--reloadfirewall-cmd --list-all同时需要在阿里云安全组中临时放行 8080 端口。
浏览器访问:
http://<node2公网IP>:8080如果能看到 Tomcat 默认页面,说明 Tomcat 服务启动成功。
八、部署博客系统 WAR 包
部署博客系统前,先停止 Tomcat:
cd/opt/apache-tomcat-9.0.97/bin ./shutdown.sh删除 Tomcat 默认项目:
rm-rf/opt/apache-tomcat-9.0.97/webapps/ROOT上传博客系统的ROOT.war到:
/opt/apache-tomcat-9.0.97/webapps/重新启动 Tomcat:
cd/opt/apache-tomcat-9.0.97/bin ./startup.shTomcat 会自动解压ROOT.war,生成新的ROOT项目目录。
访问前台:
http://<node2公网IP>:8080访问后台:
http://<node2公网IP>:8080/admin如果前台页面和后台登录页面都能正常打开,说明博客系统已经成功部署到 Tomcat。
九、部署 Nginx 反向代理
Nginx 部署在 node1 上,作为整个博客系统的统一访问入口。
安装 Nginx:
dnfinstall-ynginx启动并设置开机自启:
systemctl start nginx systemctlenablenginx systemctl status nginx开放 80 端口:
firewall-cmd--zone=public --add-service=http--permanentfirewall-cmd--reloadfirewall-cmd --list-all同时需要在阿里云安全组中放行 80 端口。
浏览器访问:
http://<node1公网IP>如果能看到 Nginx 默认页面,说明 Nginx 部署成功。
十、配置 Nginx 请求转发
编辑 Nginx 配置文件:
vim/etc/nginx/nginx.conf在对应的server配置中添加或修改location /:
location / { proxy_pass http://node2.itcast.cn:8080/; }检查 Nginx 配置语法:
nginx-t如果输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful说明配置文件语法正确。
重新加载 Nginx:
nginx-sreload再次访问:
http://<node1公网IP>这时访问 node1 的 80 端口,应该直接进入后端博客系统页面。
十一、部署验证
本次部署完成后,我主要从以下几个角度验证服务状态。
1. Nginx 配置验证
nginx-t结果显示配置文件语法正确。
2. Nginx 本地访问验证
curl-Ihttp://127.0.0.1返回结果中出现:
HTTP/1.1 200 Server: nginx/1.20.1说明 Nginx 本地访问正常。
3. 浏览器访问验证
通过浏览器访问:
http://<node1公网IP>能够正常打开博客系统页面,说明访问链路已经打通:
用户浏览器 → node1 Nginx → node2 Tomcat → MySQL十二、日志查看与问题排查
1. Tomcat 日志
Tomcat 日志目录:
/opt/apache-tomcat-9.0.97/logs常用查看命令:
tail-100f/opt/apache-tomcat-9.0.97/logs/catalina.out项目相关日志包括:
access.log error.log forum-java.log如果博客页面打不开、后台登录异常、数据库连接失败,可以优先查看 Tomcat 和项目日志。
2. Nginx 日志
Nginx 日志目录:
/var/log/nginx查看访问日志:
tail-10f/var/log/nginx/access.log查看错误日志:
tail-10f/var/log/nginx/error.log如果出现 502、页面无法访问、反向代理失败,可以重点查看 Nginx 错误日志和 Tomcat 服务状态。
十三、安全收口
部署过程中,为了验证 Tomcat,临时开放了 8080 端口。但正式通过 Nginx 访问后,Tomcat 不应该继续直接暴露在公网。
最终安全组建议:
| 端口 | 用途 | 是否保留 |
|---|---|---|
| 22 | SSH 远程连接 | 保留,但建议限制来源 IP |
| 80 | Nginx 对外访问 | 保留 |
| 8080 | Tomcat 直接访问 | 验证完成后关闭 |
| 3306 | MySQL | 不对公网开放 |
正式环境中,MySQL 只允许本机或内网访问,不能暴露到公网。
另外,博客文档和截图中不应出现:
- 服务器登录密码
- MySQL root 密码
- 完整公网 IP
- 阿里云 AccessKey
- 数据库连接密码
- 后台管理员密码
十四、云监控与告警配置
部署完成后,还需要对服务器资源进行基础监控,避免服务运行后无人感知异常。
本次可以在阿里云云监控中开启主机监控,重点关注:
- CPU 使用率
- 内存使用率
- 磁盘使用率
- 网络流量
- 进程数量
- ECS 实例状态
可以配置基础告警规则,例如:
内存使用率 > 95% 磁盘使用率 > 80% CPU 使用率持续过高 服务器异常停止同时可以创建可视化监控大屏,将 CPU、内存、磁盘、网络等指标集中展示,形成一个简单的运维观测面板。
十五、本次实践总结
本次部署完成了一套基于阿里云 ECS 的 Java 博客系统上线流程,主要包括:
- 创建两台 ECS 云服务器。
- 配置主机名和内网 hosts 解析。
- 部署 JDK 运行环境。
- 在 node2 上部署 MySQL 并导入初始化数据。
- 在 node2 上部署 Tomcat 和博客系统 WAR 包。
- 在 node1 上部署 Nginx。
- 配置 Nginx 反向代理到 node2 的 Tomcat。
- 通过
nginx -t、curl -I和浏览器访问完成上线验证。 - 查看 Tomcat 和 Nginx 日志,建立基础排查路径。
- 收口安全组,关闭不必要的公网端口。
- 使用阿里云云监控补充 CPU、内存、磁盘、网络等基础监控。
这次实践让把一个 Java Web 项目从云服务器准备、基础软件安装、数据库初始化、应用部署、反向代理配置,到最终访问验证完整走了一遍。
从运维角度看,真正重要的不只是“服务能打开”,而是要形成完整闭环:
部署前:资源规划、端口规划、节点分工 部署中:组件安装、配置修改、服务启动 部署后:访问验证、日志排查、安全收口、监控告警最终结果是:通过访问 node1 的 80 端口,可以正常打开博客系统页面,说明 Nginx 到 Tomcat,再到 MySQL 的整体链路已经部署成功。