一、前言
很多 Java 初学开发者写完 SpringBoot 项目,只能在本地localhost运行,无法让外网其他人访问。想要真正项目上线、公网可访问、绑定域名、不带端口直接访问,必须完成 Linux 云服务器部署 + 端口放行 + Nginx 反向代理 + 域名解析全套流程。
本文全程使用MobaXterm工具,一站式完成:服务器连接、文件上传、项目部署、后台常驻、日志排查、Nginx 配置、域名绑定、公网正式上线。适配 CentOS7/8、阿里云 / 腾讯云所有云服务器,纯新手向、零废话、可直接跟着实操上线项目。
为什么推荐 MobaXterm 部署项目
- 自带SFTP可视化文件面板,直接拖拽上传 Jar 包,无需 FTP、无需传输命令
- 终端 + 文件管理二合一,不用切换软件
- 免费够用、轻量稳定、适配所有 Linux 远程操作
- 支持实时日志监控、进程查看,非常适合 Java 项目部署排查
二、部署整体流程总览
本地打包 → 云服务器环境检查 → MobaXterm 连接服务器 → 上传 Jar 包 → 后台启动 SpringBoot 项目 → 防火墙放行端口 → 安装配置 Nginx 反向代理 → 域名购买与解析 → 域名无端口公网访问
三、部署前期准备
1. 所需环境与资源
- 本地环境:Windows、IDEA、Maven、MobaXterm
- 服务器:阿里云 / 腾讯云 CentOS Linux 云服务器(已安装 JDK1.8+)
- 项目:可正常本地启动的 SpringBoot 项目,端口默认 8080
- 额外资源:完成备案的域名(国内云服务器强制备案)
2. 服务器前置检查
连接服务器后,确认 JDK 环境正常:
bash
java -version输出版本号说明环境正常,无输出则先安装 JDK。
四、第一步:IDEA 本地打包 SpringBoot 项目
1. 确认打包插件
项目pom.xml必须拥有 SpringBoot 官方打包插件,用于打包可执行 Jar:
xml
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.15</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>2. Maven 打包操作
IDEA 右侧 Maven 工具栏:
- clean:清除旧打包文件
- package:打包生成可执行 Jar
打包成功后,项目target目录生成xxx.jar即为部署包。
上线重要修改
打包前必须修改项目配置:
- 数据库、Redis、RocketMQ 地址改为服务器内网 IP
- 禁止使用 localhost、127.0.0.1,防止上线后中间件连接失败
五、第二步:MobaXterm 连接云服务器
- 打开 MobaXterm → 点击 Session → 选择 SSH
- Remote host 填写云服务器公网 IP
- 勾选 Specify username,填写服务器用户名
- 输入服务器密码,完成远程连接
创建项目统一存放目录
bash
mkdir -p /home/ningzh/springboot-project cd /home/ningzh/springboot-project六、第三步:拖拽上传 Jar 包
- MobaXterm 左侧为服务器可视化文件目录,右侧为命令终端
- 左侧文件夹定位到刚刚创建的
/home/ningzh/springboot-project - 打开本地项目 target 文件夹,直接将 xxx.jar 文件拖拽到左侧面板
- 等待传输进度条走完,终端执行
ls,能看到 jar 包即上传成功
七、第四步:云服务器后台启动 SpringBoot 项目
1. 两种启动方式
前台启动(仅本地测试,关闭 MobaXterm 窗口项目直接停止)
bash
java -jar 项目名.jar后台守护启动(正式上线使用,断开终端不关闭程序)
bash
nohup java -jar 项目名.jar > app.log 2>&1 &参数详细说明:
- nohup:让进程脱离终端,后台永久运行
app.log:把程序正常运行日志输出到 app.log 文件
- 2>&1:将报错、异常日志统一写入同一个日志文件
- &:命令放入后台执行,终端可继续输入其他指令
2. 实时查看启动日志,判断是否启动成功
bash
tail -f app.log日志输出Started XxxApplication in xxx seconds代表项目启动完成,监听 8080 端口。
3. 查看 Java 运行进程
bash
# 简洁查看所有java进程 jps # 完整查看进程详情 ps -ef | grep java八、第五步:服务器放行端口(公网访问基础)
SpringBoot 项目占用 8080,Nginx 占用 80(http 标准端口),两个端口都需要放行。
1. Linux 防火墙放行端口
bash
# 永久放行80、8080端口 firewall-cmd --add-port=80/tcp --permanent firewall-cmd --add-port=8080/tcp --permanent # 重载防火墙规则生效 firewall-cmd --reload # 校验已开放端口列表 firewall-cmd --list-ports2. 云服务器控制台放行安全组
阿里云 / 腾讯云服务器,防火墙放行端口后还需要在后台安全组配置入站规则:
- 登录云服务器控制台,找到实例对应的安全组
- 添加入站规则,放行协议 TCP,端口 80、8080,授权对象 0.0.0.0/0(全网可访问)
- 保存规则,规则即时生效
此时访问公网IP:8080已经可以打开项目,但是带有端口,下面配置 Nginx 实现不带端口域名访问。
九、完整 Nginx 安装 + 反向代理详细教程
9.1 Nginx 作用说明
- 反向代理:外网访问 80 端口(域名默认端口,浏览器可省略),Nginx 接收请求转发给本地 8080 端口的 SpringBoot 程序
- 负载均衡(多服务扩展)、静态资源缓存、请求限流、SSL 证书 HTTPS 加密
- 隐藏后端真实服务端口,提升项目安全性
9.2 CentOS 系统安装 Nginx 完整命令
1. 安装 epel 软件源(CentOS 默认无 nginx 安装包)
bash运行
yum install -y epel-release2. 安装 Nginx
bash
yum install -y nginx3. Nginx 基础系统命令(启动 / 停止 / 重启 / 开机自启)
bash
# 启动nginx systemctl start nginx # 停止nginx systemctl stop nginx # 修改配置后重载(不中断访问) systemctl reload nginx # 重启nginx systemctl restart nginx # 设置开机自启(服务器重启自动运行nginx) systemctl enable nginx # 查看nginx运行状态 systemctl status nginx4. 验证 Nginx 是否正常启动
浏览器直接访问服务器公网 IP,出现 Nginx 默认欢迎页面代表安装成功。
9.3 Nginx 核心目录结构(必须了解)
plaintext
# 主配置文件(我们主要修改这个文件) /etc/nginx/nginx.conf # 站点配置存放目录(推荐拆分配置,便于管理) /etc/nginx/conf.d/ # Nginx静态资源默认目录 /usr/share/nginx/html/ # Nginx日志目录 /var/log/nginx/9.4 两种反向代理配置方案
方案一:推荐,拆分配置(conf.d 新建站点文件,便于多项目管理)
- 新建域名专属配置文件(替换为你的域名,例如school-market.com)
bash
vim /etc/nginx/conf.d/school-market.conf- 完整配置粘贴进去,注释有详细讲解
nginx
server { # 监听80标准http端口,浏览器访问域名默认走80,无需填写端口 listen 80; # 绑定你的域名,多个域名空格分隔,@代表不带www,www代表带www前缀 server_name school-market.com www.school-market.com; # 日志配置,区分项目日志,方便排错 access_log /var/log/nginx/school-market-access.log; error_log /var/log/nginx/school-market-error.log; # 所有请求转发给本地SpringBoot 8080端口 location / { # 反向代理地址,指向本机运行的springboot项目 proxy_pass http://127.0.0.1:8080; # 以下配置固定复制,解决后端获取真实客户端IP、跨域、header丢失问题 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 超时时间,适配接口请求、文件上传场景 proxy_connect_timeout 60s; proxy_read_timeout 60s; } }方案二:直接修改主配置 nginx.conf
bash运行
vim /etc/nginx/nginx.conf找到 http {} 内部,删除默认 server 块,替换为下面内容:
nginx
server { listen 80; server_name school-market.com www.school-market.com; access_log /var/log/nginx/school-market-access.log; error_log /var/log/nginx/school-market-error.log; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 60s; proxy_read_timeout 60s; } }9.5 配置校验 + 重载生效
1. 检查 Nginx 配置语法是否错误(非常关键,错字符会导致 Nginx 启动失败)
bash运行
nginx -t输出test is successful代表配置无错误。
2. 重载 Nginx,配置立即生效,不中断用户访问
bash
systemctl reload nginx9.6 Nginx 常用排错命令
bash
# 实时查看访问日志 tail -f /var/log/nginx/school-market-access.log # 实时查看错误日志(502/404报错全部在这里) tail -f /var/log/nginx/school-market-error.log # 查看nginx运行状态 systemctl status nginx9.7 502 Bad Gateway 报错常见原因(反向代理高频问题)
- SpringBoot 项目未启动,8080 端口无服务
- SpringBoot 启动崩溃,查看项目 app.log 日志排查异常
- 防火墙拦截本地回环,极少出现,关闭防火墙测试
- proxy_pass 地址写错,端口、IP 填写错误
十、第六步:域名购买 + 域名解析(正式公网上线)
1. 域名购买
前往阿里云万网、腾讯云 DNSPod 平台注册域名,国内服务器必须完成 ICP 备案,否则无法使用 80/443 端口。
2. 域名解析操作步骤
- 进入域名管理控制台,找到「解析」功能
- 添加两条 A 记录:
- 主机记录:@,记录类型:A,记录值:云服务器公网 IP,TTL 默认 10 分钟
- 主机记录:www,记录类型:A,记录值:云服务器公网 IP,TTL 默认 10 分钟
- 保存解析记录,等待 1-10 分钟全球 DNS 生效
3. 访问方式对比
未配置 Nginx:http://公网IP:8080配置 Nginx 反向代理 + 域名解析后:http://school-market.com、http://www.school-market.com无需加任何端口,直接域名访问项目,项目正式全网上线。
十一、项目迭代更新流程(后续改代码重新上线)
- 一键停止旧 SpringBoot 项目进程
bash运行
kill -9 $(jps | grep jar | awk '{print $1}')- 本地修改业务代码,IDEA 执行 clean、package 重新打包
- MobaXterm 拖拽新 jar 包覆盖服务器旧文件
- 后台启动项目
bash
nohup java -jar 项目名.jar > app.log 2>&1 &- 查看 app.log 确认项目启动正常,Nginx 无需改动,自动转发新服务
十二、线上部署全套常见报错解决
1. 端口占用
SpringBoot8080 被占用
bash
netstat -tanlp | grep 8080 kill -9 进程PIDNginx80 端口被占用
bash
netstat -tanlp | grep 80 systemctl stop nginx2. RocketMQ / 数据库配置读取失败、connect to null
配置文件 key 书写不规范、线上地址未替换服务器内网 IP、使用localhost导致外部服务无法连接。 标准 mq 配置示例:
properties
rocketmq.name-server=192.168.117.128:9876 rocketmq.producer.group=school-market-producer-group rocketmq.consumer.group=school-market-consumer-group3. 外网无法访问页面
双重检查:①云服务器安全组放行 80、8080 ②Linux 防火墙放行端口 ③SpringBoot 正常启动 ④Nginx 运行正常
4. Nginx 访问报 502 Bad Gateway
后端 SpringBoot 未启动、启动报错崩溃,优先查看项目 app.log 日志定位代码异常。
5. 访问域名 403/404
Nginx 配置 server_name 域名填写错误、proxy_pass 后端地址写错、项目接口路径错误。
十三、完整上线流程总结
本地 IDEA Maven 打包 → MobaXterm 远程连接 Linux 服务器 → 拖拽上传 Jar 包 → nohup 后台常驻启动 SpringBoot → 防火墙 + 云安全组放行 80、8080 端口 → 安装 Nginx、编写反向代理配置、重载生效 → 域名购买备案 + DNS 解析绑定服务器公网 IP → 纯域名无端口公网访问,项目正式上线。
整套流程覆盖 Java 后端从本地开发到公网域名上线全链路,包含 SpringBoot 部署、进程守护、日志排查、Nginx 反向代理核心知识点,适用于课程项目、毕业设计、小型商用系统上线部署。