从本地Win10到云端CentOS:我的第一个Spring Boot博客部署全记录(附WinSCP+域名绑定心得)
从零到上线Spring Boot博客的云端部署实战手记第一次把自己的项目部署到云端服务器时那种既兴奋又忐忑的心情至今记忆犹新。作为一个刚接触后端开发的初学者面对陌生的Linux命令、服务器配置和域名绑定整个过程就像在解谜。本文将完整记录我从Windows本地开发环境到CentOS云服务器部署Spring Boot博客的全过程特别适合那些想把自己的毕业设计或个人项目真正上线运行的同学。不同于官方文档的抽象说明这里会有大量实际操作中的细节处理、常见错误的解决方法以及那些原来如此的恍然大悟时刻。1. 云端起航服务器选购与基础配置选择云服务商时我对比了几家主流平台的学生优惠方案。最终选择了性价比适中的基础型云服务器配置为1核CPU、2GB内存、50GB SSD存储运行CentOS 7.6系统。这个配置对于个人博客项目已经绰绰有余月费仅相当于几杯咖啡的价格。服务器初始化必做三件事设置安全组规则开放22(SSH)、80(HTTP)、443(HTTPS)端口修改默认root密码为高强度组合创建具有sudo权限的普通用户避免直接使用root安全提示首次登录后立即执行passwd修改密码并定期更换通过SSH连接服务器的命令看似简单但新手常会遇到连接超时问题。我的经验是ssh usernameyour_server_ip -p 22如果连接失败按这个顺序排查检查安全组规则是否开放22端口确认IP地址没有输错尝试关闭本地防火墙临时测试2. 环境搭建从空白系统到运行准备干净的CentOS系统就像一张白纸需要安装Java环境、数据库等基础组件。我选择了OpenJDK 11而非Oracle JDK既避免版权问题又能满足Spring Boot 2.7的需求。环境安装速查表组件安装命令验证命令OpenJDK 11yum install java-11-openjdk-develjava -versionMySQL 8.0添加官方源后yum install mysql-community-serversystemctl status mysqldGityum install gitgit --versionMySQL安装后有几个关键配置不可忽视运行mysql_secure_installation加强安全性创建专用数据库用户而非使用root调整字符集为utf8mb4以支持完整UnicodeCREATE 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上传文件时我发现了几个效率技巧建立站点管理器保存连接信息使用同步功能而非简单上传对大型文件启用压缩传输上传后的目录结构建议如下/home/username/ └── projects/ ├── blog/ # 项目目录 │ ├── app.jar # 可执行jar │ ├── config/ # 配置文件 │ └── logs/ # 日志目录 └── uploads/ # 用户上传文件4. 服务运行让博客持续在线直接运行java -jar app.jar虽然简单但关闭终端后服务就会停止。我尝试了几种后台运行方案最终选择了systemd服务管理这是最可靠的方案。创建服务单元文件/etc/systemd/system/blog.service[Unit] DescriptionBlog Service Aftersyslog.target [Service] Userbloguser WorkingDirectory/home/username/projects/blog ExecStart/usr/bin/java -Xms256m -Xmx512m -jar app.jar SuccessExitStatus143 Restartalways [Install] WantedBymulti-user.target管理服务的常用命令sudo systemctl daemon-reload # 修改配置后重载 sudo systemctl start blog # 启动服务 sudo systemctl enable blog # 设置开机自启 sudo journalctl -u blog -f # 查看实时日志5. 域名与访问从IP到专属网址拥有自己的域名会让项目显得更专业。我注册了一个简洁的.me域名年费不到百元。域名解析设置其实很简单在域名注册商处添加A记录指向服务器IP等待DNS生效通常几分钟到几小时使用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/检查文件权限至少644Spring Boot配置spring.web.resources.static-locations问题3上传文件消失绝对不要用jar包内路径存储上传文件配置明确的外部存储路径设置适当的权限用户可写在性能调优方面有几个简单但有效的措施添加JVM内存参数如-Xmx512m启用Gzip压缩server.compression.enabledtrue配置数据库连接池HikariCP推荐7. 进阶之路从基础部署到持续交付当项目需要频繁更新时手动上传jar包变得低效。我建立了一个简单的自动化流程GitHub仓库设置Webhook服务器配置接收推送的脚本自动拉取代码、构建并重启服务基本部署脚本示例#!/bin/bash cd /home/username/projects/blog git pull origin main mvn clean package -DskipTests sudo systemctl restart blog对于需要更高可用性的场景可以考虑使用Docker容器化部署配置负载均衡和多实例实现蓝绿部署或金丝雀发布整个部署过程最深的体会是文档要边做边记。那些当时觉得这么简单肯定不会忘的步骤两周后再看就可能完全想不起来。现在我把所有关键命令、配置和解决过的问题都记录在一个Markdown文件中放在项目根目录的DEPLOY.md里这已经成为我最宝贵的部署手册。