这篇博客写在凌晨 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 部署实战课视频里面,才知道有这么一遭,所以真不能想当然。)
接口调用关系的设计
- 我开发使用的操作系统是 windows,部署到服务器的时候,后端还行,只需要修改上传图片的存储路径;但是前端用到的请求路径就多了,需要做较多修改。
- 最终我采用的方案是:
- 后端接口前统一加上/api,比如 /api/product
- 前端门户系统,使用80端口
- 前端后台系统,使用81端口
- 之所以采用两个接口,是因为门户系统和后台系统结构极为相似,比如 index.html 都需要加载 /assets 下的文件,如果使用同一个接口,那么这里就非常不好处理,我尝试过用正则表达式捕获组解决这个问题,但水平有限,无效。
- 事实证明,把它们分开是明智的,因为后面就比较顺利了。
前端代码的请求地址方面耦合得比较严重,后续要想办法解耦
二、总结经验
- 使用 linux 系统进行开发,这样就不需要再部署的时候,修改路径了。
- 编写代码时,要注意对文件路径和请求路径解耦
- 可以考虑使用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 的文件路径规则写法也不一样)。