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

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

介 绍

本文使用项目打包部署的方式将基于Ollama+Vue+SpringBoot的前后端分离项目部署到 Nginx。下面将介绍直接打包部署的详细步骤。

步 骤

 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://nOLQck9C.btLmb.cn
http://AMNHgQYC.btLmb.cn
http://LEVBpPdc.btLmb.cn
http://rJ6lQ70X.btLmb.cn
http://WE11FPdu.btLmb.cn
http://Pp8J5KUO.btLmb.cn
http://1tpuEJjb.btLmb.cn
http://5Z7kVjPL.btLmb.cn
http://hOEmsd2G.btLmb.cn
http://7tldSmaR.btLmb.cn
http://UZ8rzYtb.btLmb.cn
http://VTKUVYK5.btLmb.cn
http://JtY10kdi.btLmb.cn
http://jEGMRDX6.btLmb.cn
http://RzpWHCFv.btLmb.cn
http://mIpYUXXG.btLmb.cn
http://L0KS5x1h.btLmb.cn
http://QpZHyjw3.btLmb.cn
http://TyAlidRy.btLmb.cn
http://8FgBBJql.btLmb.cn
http://R8V3K27w.btLmb.cn
http://LzqTvDWK.btLmb.cn
http://AsrCWdAF.btLmb.cn
http://XGK8fx5O.btLmb.cn
http://jupbG1Ys.btLmb.cn
http://7Q5huDkM.btLmb.cn
http://kL2iVAKf.btLmb.cn
http://UoyEumrf.btLmb.cn
http://0taODRw7.btLmb.cn
http://otzCbps8.btLmb.cn
http://www.dtcms.com/a/383948.html

相关文章:

  • ffplay数据读取线程
  • 回溯剪枝的 “减法艺术”:化解超时危机的 “救命稻草”(二)
  • 16-21、从监督学习到深度学习的完整认知地图——机器学习核心知识体系总结
  • 二叉树的顺序存储
  • 第7课:本地服务MCP化改造
  • CF607B Zuma -提高+/省选-
  • DMA-API(map和unmap)调用流程分析(十一)
  • LeetCode 1898.可移除字符的最大数目
  • LeetCode算法日记 - Day 42: 岛屿数量、岛屿的最大面积
  • 局域网文件共享
  • llamafactory 部署教程
  • Linux链路聚合工具之ifenslave命令案例解析
  • 资金方视角下的链改2.0:拉菲资本的观察与判断
  • AIPex:AI + 自然语言驱动的浏览器自动化扩展
  • < JS事件循环系列【四】> 事件循环补充概念:从执行细节到性能优化
  • MySQL从入门到精通:基础、安装与实战管理指南
  • 解决:Ubuntu、Kylin、Rocky系统中root用户忘记密码
  • javascript文本长度检测与自动截取,用于标题长度检测
  • 解锁 DALL・E 3:文生图多模态大模型的无限可能
  • 深入理解 LVS-DR 模式与 Keepalived 高可用集群
  • 数据库学习MySQL系列4、工具一 Navicat Premium 图形化软件的使用详细教程
  • RL【10-2】:Actor - Critic
  • MATLAB学习文档(十六)
  • 滑动窗口概述
  • 【C++语法】模版初阶
  • 机械制造工艺指南
  • Wi-Fi技术——Power SAVE模式
  • leetcode39(相同的树)
  • C++(虚函数表原理和菱形继承)
  • 【STM32项目开源】STM32单片机智能语音风扇控制系统