很多自学Java的小伙伴,日常开发都习惯在Windows上完成,服务也都部署在本地,想把项目迁移到Linux服务器上实战一把,却被各种问题搞得头大:JDK版本不匹配、数据库远程连不上、项目启动报错、Nginx反向代理配置不通……
本文就以完整的前后端分离项目为例,手把手带你走完从Windows开发环境到Linux服务器的全量部署流程,把每一步的标准操作、高频踩坑点、对应的解决方案全给你讲明白。 本文适配技术栈:后端SpringBoot、MySQL、Redis、Minio、WebSocket;前端Vue;Nginx做反向代理,看完就能照着操作,顺利完成项目部署!
一、部署前核心说明
我们遇到的90%部署问题,根源都在于开发环境(Windows)与生产环境(Linux)不一致,所以整个部署流程,核心就是解决环境适配、服务连通、配置兼容三大问题。 整个部署流程分为5个核心步骤,按顺序操作即可:
二、完整部署分步操作指南
步骤1:Linux服务器JDK环境配置(最核心基础)
SpringBoot项目运行的核心是JDK环境,必须保证Linux上的JDK版本与Windows开发环境一致或更高,否则会出现版本不兼容、项目启动失败的问题。
1.1 标准安装操作
- 先查看Linux当前JDK版本,确认环境情况
java -version
- 下载对应版本JDK安装包(本文以JDK17为例,适配绝大多数SpringBoot项目)
wget --header="Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/java/17/archive/jdk-17.0.10_linux-x64_bin.tar.gz
- 解压安装包到指定目录
# 先创建安装目录mkdir -p /usr/local/java# 解压安装包tar -zxvf jdk-17.0.10_linux-x64_bin.tar.gz -C /usr/local/java
- 配置全局环境变量
# 编辑系统配置文件vim /etc/profile
在文件末尾添加以下配置,保存退出:export JAVA_HOME=/usr/local/java/jdk-17.0.10export PATH=$PATH:$JAVA_HOME/bin
- 刷新配置,使环境变量生效
source /etc/profile
- 验证安装是否成功,输出版本号即为配置完成
java -version
1.2 高频踩坑&解决方案
坑:项目编译版本高,Linux的JDK版本低,环境变量改了不生效
- 解决方案1:升级JDK版本后,直接指定JDK路径启动jar包,无需依赖全局环境变量
/usr/local/java/jdk-17.0.10/bin/java -jar 你的项目jar包名.jar
- 解决方案2:降低项目编译版本,使用Maven重新打包后再部署(生产环境慎用)
步骤2:MySQL远程访问配置
Windows开发时,数据库默认在本地运行,部署到Linux后,需要让Linux服务器能远程访问Windows上的MySQL数据库,核心是开通远程访问权限、配置网络连通。
2.1 标准配置操作
- 登录Windows本地的MySQL服务,创建允许远程访问的用户并授权
-- 创建远程访问用户,%表示允许所有地址访问CREATEUSER'你的用户名'@'%'IDENTIFIEDBY'你的密码';-- 给用户授予数据库全量权限GRANTALLPRIVILEGESON 你的数据库名.* TO'你的用户名'@'%';-- 刷新权限,使配置生效FLUSHPRIVILEGES;
- 修改MySQL配置文件,允许远程连接 找到MySQL安装目录下的
my.ini(Windows)/my.cnf(Linux)文件,在[mysqld]模块下添加以下配置:[mysqld]# 允许所有IP地址访问bind-address = 0.0.0.0
- 配置Windows防火墙,放行MySQL端口 以管理员身份打开PowerShell,执行以下命令,放行默认3306端口:
New-NetFirewallRule -DisplayName "MySQL Server" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow
- 在Linux服务器上测试网络连通性
# 替换为你的Windows主机IP和MySQL端口telnet Windows主机IP 3306
能正常连通即为配置完成,若失败可检查IP是否可ping通、端口是否正确、用户密码是否无误。
步骤3:基础依赖服务启动
项目正常运行,还需要Redis、Minio等基础服务,先确保这些服务在Linux上正常启动。
3.1 Redis服务启动
# 启动Redis服务,指定配置文件运行redis-server redis7.conf # 进入Redis客户端,验证服务是否正常redis-cli# 验证密码(若有设置)auth 用户名 密码# 测试连通性,返回PONG即为正常ping
3.2 Minio服务启动
# 启动Minio服务,指定数据存储目录和控制台端口/usr/local/bin/minio server /mnt/data --console-address :9001
步骤4:SpringBoot项目打包与Linux部署
4.1 标准部署操作
- Windows开发环境中,使用Maven完成项目打包,得到可执行的jar包
- 在Linux服务器上创建项目目录,通过XFTP等工具将jar包上传到该目录
# 创建项目目录mkdir -p /root/app# 切换到jar包所在目录cd /root/app
- 启动SpringBoot项目
# 基础启动命令java -jar 你的项目jar包名.jar# 后台常驻启动命令(关闭终端不停止服务)nohup java -jar 你的项目jar包名.jar > app.log 2>&1 &
- 项目启动成功后,可通过Postman访问接口,测试后端服务是否正常运行,测试地址格式:
http://Linux服务器IP:项目端口/接口地址
4.2 高频踩坑&解决方案
坑:打包/启动报错ServerEndpointExporter相关异常这个报错是因为项目使用了WebSocket,ServerEndpointExporter依赖Servlet容器环境,通常是容器缺失或配置错误导致。
解决方案:
- 检查pom.xml,确保引入了Web容器依赖(SpringBoot Web默认集成Tomcat)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
- 若非Web环境,需替换容器依赖,排除默认Tomcat并引入Undertow
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency>
- 非Web环境下,给WebSocket配置添加条件化加载注解
@ConfigurationpublicclassWebSocketConfig{@Bean@ConditionalOnWebApplicationpublic ServerEndpointExporter serverEndpointExporter(){returnnew ServerEndpointExporter(); }}
- 执行
mvn dependency:tree命令,排查容器依赖的版本冲突,确保仅保留一个有效容器依赖。
步骤5:Nginx反向代理与前端部署
后端服务正常运行后,通过Nginx完成前端部署和反向代理,实现前端页面访问、接口请求转发、WebSocket长连接支持。
5.1 核心配置说明
Nginx的核心配置文件为nginx-1.x.x/conf/nginx.conf,我们需要配置3个核心模块:
- 前端页面访问配置:支持Vue等单页应用(SPA)路由
- 反向代理配置:将前端接口请求转发到Linux上的SpringBoot后端服务
- WebSocket配置:支持后端WebSocket长连接服务
5.2 完整可直接复用的Nginx配置
worker_processes1;events {worker_connections1024;}http {include mime.types;default_type application/octet-stream;sendfileon;keepalive_timeout65;# WebSocket升级适配配置map$http_upgrade$connection_upgrade{default upgrade; '' close; }# 后端服务地址配置,替换为你的Linux服务器IP和SpringBoot项目端口upstream backend_servers {server192.168.1.11:8080 weight=100; }upstream webservers{server192.168.1.11:8080 weight=90; }server {# 监听端口,默认80端口listen80;server_name localhost;# 前端页面配置location / {# 支持Vue单页应用路由,刷新页面不404try_files$uri$uri/ /index.html;# 前端代码存放路径,替换为你的实际目录root html/sky;# 默认首页index index.html index.htm; }# 错误页配置error_page500502503504 /50x.html;location = /50x.html {root html; }# 反向代理-管理端接口请求转发location /api/ {# 转发到后端服务,注意末尾/的匹配规则proxy_pass http://backend_servers/admin/;# 请求头配置,传递客户端真实信息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_http_version1.1;# 超时时间配置proxy_connect_timeout30s;proxy_send_timeout60s;proxy_read_timeout60s; }# 反向代理-用户端接口请求转发location /user/ {proxy_pass http://webservers/user/; }# WebSocket长连接支持location /ws/ {proxy_pass http://backend_servers/ws/;proxy_http_version1.1;# WebSocket升级配置proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 长连接超时时间延长proxy_read_timeout3600s; } }}
5.3 配置生效与验证
- 修改完配置文件后,重载Nginx配置使其生效
# 测试配置文件是否有语法错误nginx -t# 重载配置nginx -s reload
- 浏览器访问
http://Linux服务器IP,即可打开前端页面,测试接口请求、WebSocket连接是否正常。
至此,基于Windows开发的SpringBoot前后端分离项目,就完整迁移到Linux服务器上了!
三、部署高频避坑指南(90%的人都踩过)
- 环境版本问题:必须保证Linux的JDK、MySQL、Redis等服务版本,与Windows开发环境兼容,优先保证大版本一致,这是避免绝大多数问题的核心。
- 网络连通问题:所有服务启动后,先通过
ping、telnet测试端口连通性,再排查配置问题;同时注意Linux防火墙、云服务器安全组是否放行对应端口。 - 路径配置问题:Windows和Linux的文件路径格式不同,Linux区分大小写,项目中的文件路径、配置文件路径必须适配Linux系统规则。
- 权限问题:Linux上运行服务时,注意文件和目录的访问权限,避免因权限不足导致服务启动失败、文件读写异常。
- API前缀匹配问题:Nginx反向代理时,注意
proxy_pass末尾的/,路径匹配错误会导致接口404,务必和后端接口前缀保持一致。
结尾
从Windows本地开发到Linux服务器部署,是Java开发工程师必备的基础能力,看似复杂的流程,核心就是做好环境适配、配置正确、网络连通这三件事。
大家在部署过程中遇到了什么问题,欢迎在评论区留言,我会一一解答~如果这篇文章对你有帮助,别忘了点赞、在看、转发,让更多小伙伴少走弯路!