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

【退役之再次线上部署】Spring Boot + VUE + Nginx + MySQL

这篇博客写在凌晨 4 点 20 分,这个时候我刚线上部署完成 web 项目,自己写的全栈项目
这个点儿,也睡不着了,索性就写篇博客记录一下

一、踩坑实录

这个是 最重要的,所以写在前面

Nginx 配置文件

location

location /admin {root   /home/project/backstage/dist; index  index.html index.htm;}

这里最坑的是 root 指令,root 就是代替host的,
在这里插入图片描述
如你所见,它最终访问的路径就是 /home/project/backstage/dist/admin ,然后 index 指令会在此目录下搜索 index.html,所以如果存在index.html,那么最终访问到的就是 /home/project/backstage/dist/admin/index.html

(我刚开始想当然的认为,/admin 路径 会转发到 /home/project/backstage/dist,这里害得我把nginx 配置文件学了遍,最后在一个 nginx 部署实战课视频里面,才知道有这么一遭,所以真不能想当然。)

接口调用关系的设计

  1. 我开发使用的操作系统是 windows,部署到服务器的时候,后端还行,只需要修改上传图片的存储路径;但是前端用到的请求路径就多了,需要做较多修改。
  2. 最终我采用的方案是:
    • 后端接口前统一加上/api,比如 /api/product
    • 前端门户系统,使用80端口
    • 前端后台系统,使用81端口
    • 之所以采用两个接口,是因为门户系统和后台系统结构极为相似,比如 index.html 都需要加载 /assets 下的文件,如果使用同一个接口,那么这里就非常不好处理,我尝试过用正则表达式捕获组解决这个问题,但水平有限,无效。
    • 事实证明,把它们分开是明智的,因为后面就比较顺利了。

前端代码的请求地址方面耦合得比较严重,后续要想办法解耦

二、总结经验

  1. 使用 linux 系统进行开发,这样就不需要再部署的时候,修改路径了。
  2. 编写代码时,要注意对文件路径和请求路径解耦
  3. 可以考虑使用docker来解决部署上线的问题,因为这样部署太麻烦了,需要很多次修改。

三、整体思路

最后说一下web 项目整体部署思路吧

1. 在本地开发后,先在本地部署测试,之后再线上部署,这样更容易查找问题

2. 安装MySQL,把本地的MySQL的结构和数据复刻到云服务器(这很简单,直接导出sql就可以)

3. 部署后端(java -jar *.jar --server_name=8080)

4. 编译前端文件(yarn build)上传到云服务器

5. 安装 nginx,根据自己需要,修改配置文件,主要是设置server,还有一个client_max_body_size 设置文件上传大小限制的。

困了,写得有点乱,休息睡觉,狗命要紧,以后有机会再梳理和扩展一下此博客
这是我退伍之后又一次开发了全栈项目,之前的一次全栈经历还是上学的时候嘞,有点纪念意义,故作此篇。


四、问题解决

关于数据请求 url 耦合的问题

解决办法: 使用 nginx 代理实现解耦。比如 前端80 端口要请求后端 8080 端口的数据,则使用 nginx 的 server 监听 80 端口,将请求代理到后端

server {listen 80;server_name xxxxxx;location /api {proxy_pass http://localhost:8080}
}
...

那么80端口(门户系统)中向后端的请求,只需要 使用/api 开头就可以被代理到后端,当然,后端的 controller 也需要使用 /api 作为开头,才能匹配。

关于开发系统和部署系统不一致的问题

其实解决了数据请求 url 耦合的问题,这个问题就迎刃而解了,本地部署和云端部署唯一的区别,就是 nginx 配置文件不一样(因为项目文件存放的路径不一样,windows 和 linux 的文件路径规则写法也不一样)。

五、所以现在的开发环境和部署的问题就解决了,暂时用不到 docker 部署,本着用不到就不用的原则,本着减少变动的原则,暂时就不用 docker 部署了

http://www.lryc.cn/news/444533.html

相关文章:

  • Qanything 2 0源码解析系列1:新建知识库
  • Redis-01 入门和十大数据类型
  • IT行业的现状与未来发展趋势
  • 828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Jenkins CI/CD平台
  • 今日 leetCode 15.三数之和
  • Games101笔记-二维Transform变换(二)
  • 【洛谷】AT_abc371_c [ABC371C] Make Isomorphic 的题解
  • 全国职业院校技能大赛(大数据赛项)-平台搭建Spark、Scala笔记
  • 【Java】JVM基本组成
  • 解决【WVP服务+ZLMediaKit媒体服务】加入海康摄像头后,能发现设备,播放/点播失败,提示推流超时!
  • 淘宝商品详情接口item_get响应参数解析:props、props_list、prop_img
  • Android使用OpenCV 4.5.0实现扑克牌识别(源码分享)
  • Pandas_iloc_loc_哪个是inclusive哪个是exclusive
  • python是什么语言写的
  • python编程,把所有子目录和文件输出到文本文件
  • 使用 IntelliJ IDEA 连接到达梦数据库(DM)
  • 【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘
  • Java中的事件(动作监听-ActionListener)
  • STM32篇:开发环境安装
  • AIGC实战——多模态模型Flamingo
  • 如何在WordPress中添加事件Schema(分步指南)
  • 守护企业资产安全:企业微信群禁止互加好友操作指南!
  • 【QT基础】创建项目项目代码解释
  • 【数据结构】对象的比较
  • 代码随想录八股训练营第四十天| C++
  • 【C++】10道经典面试题带你玩转二叉树
  • 【裸机装机系列】13.kali(ubuntu)-优化-自定义grub启动界面个性化背景
  • 数组高阶应用(C++版)
  • Spring(四)多线程+异步任务执行服务+常见的Enable注解+SpringUnit测试
  • 解析与实现二叉树