🧱 一、前言:为什么我要做一个自己的博客?

作为一个程序员,我一直想拥有一个属于自己的博客平台。不仅可以记录学习心得,还能展示技术成果,甚至未来可以成为一个个人品牌门户。

于是,我决定从零开始搭建一个基于 Spring Boot + React 的全栈博客系统,并把它部署到公网服务器上。这篇文章将详细记录整个部署流程,并总结我在过程中踩过的“坑”。

🚀 二、部署流程总览

🔧 技术栈

  • 后端:Spring Boot(Java)
  • 前端:React(Admin 后台 + Tourist 游客页面)
  • 数据库:MySQL + Redis
  • 部署工具:Nginx、systemd、scp
  • 服务器环境:CentOS

🛠️ 三、准备阶段:服务器与环境搭建

1. 购买服务器(以阿里云为例)

  • 平台:阿里云 ECS
  • 配置建议:
  • 操作系统:CentOS 7 或 Ubuntu 20.04+
  • 带宽:至少 1Mbps
  • 安全组:开放端口 80(HTTP)、443(HTTPS)、22(SSH)

2. 登录服务器并更新系统

  • 使用xshell登录系统

3. 安装 Java 环境(JDK)

Spring Boot 项目需要 Java 运行环境。

CentOS / Ubuntu 安装 OpenJDK 17 示例:

yum install java-17-openjdk -y # CentOS

apt install openjdk-17-jdk -y # Ubuntu

验证安装是否成功:

java -version

javac -version

4. 安装 Nginx(用于反向代理和静态资源托管)

CentOS:

yum install nginx -y

systemctl start nginx

systemctl enable nginx

5. 安装 MySQL 数据库

CentOS:

yum install mariadb-server -y

systemctl start mariadb

mysql_secure_installation

6. 安装 Redis(可选,用于缓存)

CentOS / Ubuntu:

yum install redis -y # CentOS

apt install redis -y # Ubuntu

systemctl start redis

systemctl enable redis

🛠️ 四、部署全流程详解

1. 前端部署:React 多项目共用 Nginx

我使用了两个 React 项目:

  • blogAdmin:后台管理界面
  • blogTourist:游客浏览页面
✅ 解决方案:

使用路径前缀区分不同项目,通过 Nginx 配置如下:

server {

listen 80;

server_name yourdomain.com;



location ^~ /admin {

alias /web/admin/build;

index index.html;

try_files $uri $uri/ /admin/index.html;

}



location ^~ /tourist {

alias /web/tourist/build;

index index.html;

try_files $uri $uri/ /tourist/index.html;

}
# 根路径跳转

location = / {

return 301 /tourist;

}

}

2. 后端部署:Spring Boot JAR 包运行

我将后端项目打包成可执行的 JAR 文件,并上传到服务器运行。

✅ 遇到问题:
  • 使用 rz 上传大文件时经常中断。
  • 开发环境和线上环境不匹配。
✅ 解决方案:
  • 改用 scp 上传文件更稳定。
  • 检查 JAR 是否完整:jar tf xxx.jar
  • 确保本地正确打包:mvn clean package 或 ./gradlew bootJar
  • 检查配置文件,最好不要将配置硬编码,这样好灵活配置

3. 数据库配置:MySQL + Hibernate dialect 设置

Spring Boot 默认会自动识别数据库类型,但有时失败。

❌ 错误提示:

Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

✅ 解决方案:

在 application.properties 中显式指定方言:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

同时确保 MySQL 正常运行:

systemctl status mysqld

sudo systemctl start mysqld

4. 反向代理:前后端同域通信

前端请求 /api/xxx 接口时出现跨域问题。

✅ 解决方案:

在 Nginx 中添加反向代理:

location /api {

proxy_pass http://localhost:8080;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

}

这样前端和后端就可以共享域名,避免跨域。

5. 守护进程:使用 systemd 实现开机自启

使用 nohup 启动的服务在服务器重启后会停止。

✅ 解决方案:

创建 systemd 服务文件 /etc/systemd/system/myblogserver.service:

[Unit]

Description=MyBlogServer Spring Boot Application

After=syslog.target

[Service]

User=root

WorkingDirectory=/web

ExecStart=/usr/bin/java -jar /web/MyBlogServer-0.0.1-SNAPSHOT.jar

SuccessExitStatus=143

Restart=always

StandardOutput=file:/web/logs/app.log

StandardError=file:/web/logs/app.err

[Install]

WantedBy=multi-user.target

然后执行:

sudo systemctl daemon-reload

sudo systemctl start myblogserver

sudo systemctl enable myblogserver

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐