当前位置: 首页 > news >正文

从本地Win10到云端CentOS:我的第一个Spring Boot博客部署全记录(附WinSCP+域名绑定心得)

从零到上线:Spring Boot博客的云端部署实战手记

第一次把自己的项目部署到云端服务器时,那种既兴奋又忐忑的心情至今记忆犹新。作为一个刚接触后端开发的初学者,面对陌生的Linux命令、服务器配置和域名绑定,整个过程就像在解谜。本文将完整记录我从Windows本地开发环境到CentOS云服务器部署Spring Boot博客的全过程,特别适合那些想把自己的毕业设计或个人项目真正上线运行的同学。不同于官方文档的抽象说明,这里会有大量实际操作中的细节处理、常见错误的解决方法,以及那些"原来如此"的恍然大悟时刻。

1. 云端起航:服务器选购与基础配置

选择云服务商时,我对比了几家主流平台的学生优惠方案。最终选择了性价比适中的基础型云服务器,配置为1核CPU、2GB内存、50GB SSD存储,运行CentOS 7.6系统。这个配置对于个人博客项目已经绰绰有余,月费仅相当于几杯咖啡的价格。

服务器初始化必做三件事

  1. 设置安全组规则:开放22(SSH)、80(HTTP)、443(HTTPS)端口
  2. 修改默认root密码为高强度组合
  3. 创建具有sudo权限的普通用户(避免直接使用root)

安全提示:首次登录后立即执行passwd修改密码,并定期更换

通过SSH连接服务器的命令看似简单,但新手常会遇到连接超时问题。我的经验是:

ssh username@your_server_ip -p 22

如果连接失败,按这个顺序排查:

  • 检查安全组规则是否开放22端口
  • 确认IP地址没有输错
  • 尝试关闭本地防火墙临时测试

2. 环境搭建:从空白系统到运行准备

干净的CentOS系统就像一张白纸,需要安装Java环境、数据库等基础组件。我选择了OpenJDK 11而非Oracle JDK,既避免版权问题又能满足Spring Boot 2.7的需求。

环境安装速查表

组件安装命令验证命令
OpenJDK 11yum install java-11-openjdk-develjava -version
MySQL 8.0添加官方源后yum install mysql-community-serversystemctl status mysqld
Gityum install gitgit --version

MySQL安装后有几个关键配置不可忽视:

  1. 运行mysql_secure_installation加强安全性
  2. 创建专用数据库用户而非使用root
  3. 调整字符集为utf8mb4以支持完整Unicode
CREATE DATABASE blog_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'blog_user'@'%' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON blog_db.* TO 'blog_user'@'%'; FLUSH PRIVILEGES;

3. 项目迁移:从本地开发到云端部署

Spring Boot项目的打包过程看似简单,但有几个细节决定了部署的成败。在pom.xml中确保包含spring-boot-maven-plugin,这样生成的jar包才是可执行的独立文件。

打包常见问题排查

  • 测试失败导致打包中断 → 添加-DskipTests参数
  • 依赖冲突 → 使用mvn dependency:tree分析
  • 资源文件缺失 → 检查src/main/resources目录

使用WinSCP上传文件时,我发现了几个效率技巧:

  1. 建立站点管理器保存连接信息
  2. 使用同步功能而非简单上传
  3. 对大型文件启用压缩传输

上传后的目录结构建议如下:

/home/username/ └── projects/ ├── blog/ # 项目目录 │ ├── app.jar # 可执行jar │ ├── config/ # 配置文件 │ └── logs/ # 日志目录 └── uploads/ # 用户上传文件

4. 服务运行:让博客持续在线

直接运行java -jar app.jar虽然简单,但关闭终端后服务就会停止。我尝试了几种后台运行方案,最终选择了systemd服务管理,这是最可靠的方案。

创建服务单元文件/etc/systemd/system/blog.service

[Unit] Description=Blog Service After=syslog.target [Service] User=bloguser WorkingDirectory=/home/username/projects/blog ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar app.jar SuccessExitStatus=143 Restart=always [Install] WantedBy=multi-user.target

管理服务的常用命令:

sudo systemctl daemon-reload # 修改配置后重载 sudo systemctl start blog # 启动服务 sudo systemctl enable blog # 设置开机自启 sudo journalctl -u blog -f # 查看实时日志

5. 域名与访问:从IP到专属网址

拥有自己的域名会让项目显得更专业。我注册了一个简洁的.me域名,年费不到百元。域名解析设置其实很简单:

  1. 在域名注册商处添加A记录指向服务器IP
  2. 等待DNS生效(通常几分钟到几小时)
  3. 使用dig yourdomain.com命令验证解析

为了让Spring Boot应用直接响应80端口,有两种方案:

  • 使用Nginx反向代理(推荐)
  • 以root身份运行jar并绑定80端口(需处理权限问题)

Nginx配置示例:

server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

6. 那些踩过的坑:经验与教训

第一次部署不可能一帆风顺,记录下几个典型问题的解决方法:

问题1:数据库连接失败

  • 检查MySQL是否允许远程连接
  • 确认用户名密码正确
  • 查看服务器防火墙规则

问题2:静态资源404

  • 确保路径前缀正确(如/static/
  • 检查文件权限(至少644)
  • Spring Boot配置spring.web.resources.static-locations

问题3:上传文件消失

  • 绝对不要用jar包内路径存储上传文件
  • 配置明确的外部存储路径
  • 设置适当的权限(用户可写)

在性能调优方面,有几个简单但有效的措施:

  1. 添加JVM内存参数(如-Xmx512m
  2. 启用Gzip压缩(server.compression.enabled=true
  3. 配置数据库连接池(HikariCP推荐)

7. 进阶之路:从基础部署到持续交付

当项目需要频繁更新时,手动上传jar包变得低效。我建立了一个简单的自动化流程:

  1. GitHub仓库设置Webhook
  2. 服务器配置接收推送的脚本
  3. 自动拉取代码、构建并重启服务

基本部署脚本示例:

#!/bin/bash cd /home/username/projects/blog git pull origin main mvn clean package -DskipTests sudo systemctl restart blog

对于需要更高可用性的场景,可以考虑:

  • 使用Docker容器化部署
  • 配置负载均衡和多实例
  • 实现蓝绿部署或金丝雀发布

整个部署过程最深的体会是:文档要边做边记。那些当时觉得"这么简单肯定不会忘"的步骤,两周后再看就可能完全想不起来。现在我把所有关键命令、配置和解决过的问题都记录在一个Markdown文件中,放在项目根目录的DEPLOY.md里,这已经成为我最宝贵的部署手册。

http://www.cnnetsun.cn/news/2860893.html

相关文章:

  • 用C++解决‘合影效果’排序题:从STL sort到冒泡排序的三种实战写法(附避坑点)
  • 从数独到拼图:我的日历拼图解题策略与启发式搜索心得
  • MATLAB实战:用锤击法测水泥试件的固有频率与阻尼比(附完整代码与数据)
  • C++结构体排序实战:从信息学奥赛题到学生成绩管理系统(附完整代码)
  • 从JFET到MOSFET:手把手教你选对场效应管做小信号放大(附实际电路搭接与测试指南)
  • 效率翻倍!如何用嘉立创BOM模板反推设计你的Cadence SPB17.4 CIS数据库字段?
  • 用老古董uA741搭个PWM发生器:从Multisim仿真到面包板实测的完整避坑指南
  • 别再手动算脉冲了!用STM32的编码器接口模式,5分钟搞定电机测速
  • 生物医学大数据隐私保障的三层实战平衡框架
  • 手把手教你用LabVIEW和USRP搭建无线文本传输系统(附完整VI程序框图)
  • BLE开发避坑:MTU交换不是你想的那样,聊聊ATT层那点事(附空中包分析)
  • Excel数据清洗:除了‘删除重复项’,试试这3种更灵活的合并去重方法
  • Qt QChart实战:手把手教你打造一个可交互的折线图配置工具(附完整源码)
  • 2022 AI落地实战:MLOps、Data Mesh与可解释AI的工程化演进
  • LangGraph+Function Call+Web Scraper多智能体生产实践
  • LPC82x微控制器模拟与电源管理实战:从比较器、ADC到低功耗设计
  • 在Windows上用C++原始套接字给IP包加Option字段:一个被遗忘的IPv4特性实战
  • 机器学习模型生产化:从Notebook到高可用、可审计、可治理的系统组件
  • 保姆级教程:基于STM32 HAL库的GD32F305 CAN驱动移植与适配(解决发送丢失、接收失败)
  • 大语言模型与序列推荐融合:SpecTran技术解析
  • 别再只玩555了!用uA741运放实现PWM的另类思路与深度原理剖析
  • TLJH搭建避坑指南:从权限安全到用户清理,这些配置细节你注意了吗?
  • 从西北角法到闭回路调整:深入解析MATLAB表上作业法的每一步(附调试技巧)
  • 别再死记硬背公式了!手把手带你用Python/Matlab复现Clarke与Park变换(附源码)
  • 别再只会用均值模糊了!用Python的gaussian_filter1d和gaussian_filter函数实现更自然的图像平滑
  • 从零到一:手把手教你用Verilog在HDLbits上搭建第一个数字电路(附完整代码)
  • FPGA新手避坑实录:用Altera芯片驱动VGA显示自定义图片(附完整Verilog代码与IP核配置)
  • 从电脑内存条到STM32的SRAM:图解嵌入式系统的‘内存地图’与寄存器寻址
  • 手把手教你用Gazebo和ROS复现DARPA地下挑战赛(附官方模型下载)
  • Streamlit+Heroku:50行Python快速部署数据应用