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

【Docker+Nginx】前后端分离式项目部署(传统打包方式)

介 绍

将前后端分离项目部署到 Nginx 可以通过两种方式实现:直接部署和使用 Docker 容器化部署。下面将介绍直接打包部署的详细步骤。

步 骤

 1. 服务器上创建部署目录结构

(这里使用MobaXterm连接CentOS系统)

mkdir -p /opt/project/{frontend,backend,nginx/conf,nginx/logs}

2. 前端项目打包

以 Vue项目为例,(VScode按下Ctrl+`调出终端)在终端运行:

# Vue项目打包
npm run build

运行结果:

打包完成后会生成dist目录,包含所有静态资源(HTML/CSS/JS)。

将生成的dist目录下所有文件复制到服务器的/opt/project/frontend目录

3. 后端项目打包

以 Spring Boot 为例:

# 打包为JAR文件
mvn clean package "-Dmaven.test.skip=true"

运行结果:

生成的 JAR 文件通常在target目录下。

将生成的 JAR 文件复制到服务器的/opt/project/backend目录

4. Nginx 配置

/opt/project/nginx/conf目录下touch创建nginx.conf文件:

编辑Nginx配置文件:

server {listen 80;server_name _;  # 允许所有IP/域名访问# 前端静态资源(指向你存放dist文件的目录)location / {root /opt/project/frontend/dist;  # 关键:匹配前端dist目录的实际路径index index.html;try_files $uri $uri/ /index.html;  # 解决SPA路由问题}# 后端API代理(根据后端部署方式选择)location /api/ {# 情况1:后端以Docker容器运行(假设容器名为backend)# proxy_pass http://backend:8080/api/;# 情况2:后端直接在Linux服务器上运行(非容器,推荐)proxy_pass http://192.168.1.128:8080/api/;  # 本地后端服务地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

注意:配置中的host.docker.internal是 Docker 提供的特殊 DNS,用于访问宿主机。如果不起作用,可以替换为宿主机的实际 IP 地址。

配置如图所示:

输入  :wq  保存并退出

注意:如果是这种手动打包部署项目,前后端分离的项目要解决跨域问题,即使你在Windows下成功运行,也要修改跨域设置,因为你在windows系统访问的是的的服务器地址(例如虚拟机的ifconfig显示的192.168.1.128)所以你要专门配置这个访问地址的跨域问题。如下图:

前端(nginx里已经对 /ai 进行了代理):

// 相对路径,自动继承前端页面的域名(http://192.168.1.128)const response = await fetch(`/ai/chat?prompt=${encodeURIComponent(prompt)}`);

后端(确保前端发送请求由nginx代理到服务器地址,被后端接收,防止出现跨域问题):

5. 启动 Nginx 容器

docker run -d \--name chatbot-nginx \-p 80:80 \# 前端文件挂载(你的dist目录)-v /opt/project/frontend/dist:/opt/project/frontend/dist \# Nginx配置文件挂载-v /opt/project/nginx/conf/nginx.conf:/etc/nginx/conf.d/chatbot.conf \# 日志目录挂载-v /opt/project/nginx/logs:/var/log/nginx \# 自动重启策略--restart always \nginx:stable-alpine

参数说明:

  • -d:后台运行容器
  • --name:指定容器名称
  • -p 80:80:端口映射,宿主机 80 端口映射到容器 80 端口
  • -v:目录挂载,将宿主机目录与容器内目录关联
  • --restart always:容器退出时自动重启

6. 启动后端服务

# 进入后端目录(确保在jar包所在目录)
cd /opt/project/backend# 启动服务(使用Java 17运行)
nohup java -jar chatbot-0.0.1-SNAPSHOT.jar --server.port=8080 &# 等待3-5秒后,检查服务是否启动
ps -ef | grep java | grep chatbot# 查看启动日志,确认是否成功
tail -f nohup.out

注意:JDK版本要一致 ! ! ! 

7. 验证部署

检查 Nginx 容器是否正常运行:

docker ps | grep 容器名

### 查看 Nginx容器 日志:

### 访问服务器 IP 地址,验证前端是否正常显示(ifconfig或ip addr)

测试 API 接口,验证后端是否能正常响应

测试发现,出了些问题,原因是在windows上部署了Ollama,但在linux上没有部署Ollama

---------解决方法:让 Linux 后端能访问 Ollama 服务---------

a.在 Linux 服务器上部署 Ollama

通过 Docker 容器运行 Ollama(手动下载和拉取可能会出现版本不兼容需要更新操作系统,Docker容器化部署),容器内已包含所有依赖库,无需担心系统版本问题。

# 启动 Ollama 容器(映射 11434 端口,与默认端口一致;设置自动重启)
docker run -d \--name ollama \-p 11434:11434 \-v ollama_data:/root/.ollama \  # 挂载数据卷,持久化模型(删除容器后模型不丢失)--restart always \              # 服务器重启后自动启动容器ollama/ollama

b.验证容器是否正常启动

  • 正常日志会包含 Listening on 127.0.0.1:11434,表示 Ollama API 已就绪。

c.在Docker容器内拉取模型(项目中使用的Windows部署的Ollama模型)

# 进入 Ollama 容器的命令行
docker exec -it ollama /bin/sh# 在容器内拉取模型(首次下载需等待,约 10GB,视网络速度而定)
ollama pull qwen3:0.6b# 拉取完成后,可验证模型是否存在(显示 qwen3:0.6b 即成功)
ollama list# 退出容器(输入 exit 回车)
exit

### 重启后端服务,对接 Docker 版 Ollama

# 1. 停止旧的后端进程(先找到 PID)
ps -ef | grep java | grep chatbot  # 输出类似:root  12977  ... java -jar ...
kill -9 12977  # 替换为实际的 PID# 2. 进入后端目录,重启服务
cd /opt/project/backend
nohup java -jar chatbot-0.0.1-SNAPSHOT.jar --server.port=8080 &# 3. 查看后端日志,确认无错误
tail -f nohup.out

### 测试大模型接口是否正常

用 curl 测试后端 /ai/chat 接口,确认能返回 AI 回复:

# 发送请求(中文“测试消息”已 URL 编码)
curl "http://localhost:8080/ai/chat?prompt=%E6%B5%8B%E8%AF%95%E6%B6%88%E6%81%AF"

### 测试 API 接口,验证后端是否能正常响应

8. 更新部署

更新前端

# 1. 将新的dist文件复制到/opt/project/frontend
# 2. 重启Nginx容器
docker restart project-nginx

更新后端

# 1. 停止当前服务
ps -ef | grep java | grep your-project.jar | awk '{print $2}' | xargs kill# 2. 复制新的JAR文件到/opt/project/backend# 3. 启动新服务
nohup java -jar your-project.jar --server.port=8080 &

9. 最终效果


文章转载自:

http://PN0JKUos.kbntL.cn
http://4BRdoyob.kbntL.cn
http://hd9EZI5i.kbntL.cn
http://cOukodva.kbntL.cn
http://Kinsorhw.kbntL.cn
http://4SkEP9KD.kbntL.cn
http://nIqOHTSv.kbntL.cn
http://vnSwBUTL.kbntL.cn
http://PH98Fauk.kbntL.cn
http://OsO8ZqVS.kbntL.cn
http://zIq1JVqU.kbntL.cn
http://ga2dTK7j.kbntL.cn
http://PNbViMZ3.kbntL.cn
http://xqB3UG0o.kbntL.cn
http://b96ulWlU.kbntL.cn
http://WXx3LWdJ.kbntL.cn
http://JYQ3MjLa.kbntL.cn
http://aeGyT0eE.kbntL.cn
http://RgQq9wZw.kbntL.cn
http://OQAl02lS.kbntL.cn
http://d0DHK14o.kbntL.cn
http://Saj4JmMY.kbntL.cn
http://G5BnFXwW.kbntL.cn
http://m8GxyVu1.kbntL.cn
http://ty0F97T5.kbntL.cn
http://q3Kb3w9v.kbntL.cn
http://IcybyL3o.kbntL.cn
http://f6fK7wL6.kbntL.cn
http://4Uom0qbf.kbntL.cn
http://XB4OFGQV.kbntL.cn
http://www.dtcms.com/a/382923.html

相关文章:

  • 基于Grafana Loki与Prometheus的日志与指标一体化监控平台实战经验分享
  • SQL 数据库简介
  • Grafana自定义dashboard与监控主流中间件
  • LabVIEW 中的振动分析与信号处理
  • 简单UDP网络程序
  • RCE绕过技术:取反与异或的深入解析与实践
  • 算法题(207):最长上升子序列(经典线性dp题)
  • 【Nginx开荒攻略】Nginx主配置文件结构与核心模块详解:从0到1掌握nginx.conf:
  • 操作系统(二) :CPU调度
  • Knockout.js DOM 数据存储模块详解
  • js趣味游戏 贪吃蛇
  • Ajax-day2(图书管理)-弹框显示和隐藏
  • 低代码平台-开发SDK设计
  • Java 线程池面试高频问题全解析
  • 【HarmonyOS】MVVM与三层架构
  • 算法—双指针1.2
  • hcl ac ap 本地转发学习篇
  • Velox:数据界的超级发动机
  • 嵌入式系统启动流程
  • TRAE通用6A规则+敏捷开发5S规则
  • 【Java后端】Spring Boot 集成雪花算法唯一 ID
  • 【知识管理】【科普】新概念的学习路径
  • flask入门(五)WSGI及其Python实现
  • 第17课:自适应学习与优化
  • 详解安卓开发andorid中重要的agp和gradle的关系以及版本不匹配不兼容问题的处理方法-优雅草卓伊凡
  • Linux应用开发(君正T23):三网智能切换及配网功能
  • 华为HarmonyOS开发文档
  • Java 文件io
  • 在Android Studio中配置Gradle涉及到几个关键的文件
  • 基于OpenCV的答题卡自动识别与评分系统