Docker+nginx部署SpringBoot+vue前后端分离项目(保姆及入门指南)

前后分离项目部署

  • 项目回顾
  • 工具
  • 上线准备
  • 1、win
    • 1.1、前端
    • 1.2、后端
  • 2、linux环境
    • 2.1、安装docker
    • 2.2、安装docker compose
    • 2.3、编写Dockerfile文件
    • 2.4、编写docker-compose.yml文件
    • 2.5、修改application-pro.yml
    • 2.6、准备好nginx的挂载目录和配置
    • 2.7、部署后端服务

项目回顾

书接上文,我们使用springboot+jwt+shiro+vue+elementUI+axios+redis+mysql完成一个前后端分离的博客项目
csdn链接:https://blog.csdn.net/weixin_45683778/article/details/139002415
github地址:https://github.com/huang-hanson/vueblog

项目展示地址:http://47.116.123.21:81/blogs

这部分介绍如何部署我们的项目

工具

  • xshell 7 绿色破解版
  • Navicat 11 简体中文

上线准备

这里我们同步演示怎么部署到win环境和linux(centos7)系统中,前端服务器采用nginx部署并使用docker统一管理前后端服务器。
所以我们会用到:

  • nginx
  • docker compose

1、win

win环境我就用本机来演示了,我们需要分别打包前后端,前后端打包都是一条命令即可,只不过我们打包之前注意需要配置好线上的环境参数等

1.1、前端

先来配置一下后端的调用路径,因为现在部署在本地localhost,所以在axios.js中,我们配置好链接,因为等下后端部要也是本机,所以我这里直接这样配置就好了,如下:

  • srclaxios.js
axios.defaults.baseURL = "http://localhost:8082"

在这里插入图片描述

上面配置的就是前端访问后端接口的服务。

然后前端部署还需要考虑一个问题:打包之后项目资源引用路径,比如我们打包后链接是否需要带项目名称等。按照Vue官方的部罢说明,我们添加一个vue.config.js文件,

  • vueblog-vue/vue.config.js
module.exports = {publicPath: '/'
}

在这里插入图片描述

当然了,pubicPath默认其实是空的,也就是publicPath:",两个效果貌似其实是一样的,哈哈哈,我只是提醒一下有这回事而已,嘿嘿。

设置完毕之后,我们执行打包命令:

#打包命令
npm run build

命令执行之后,我们在项目根目录下就可以找到一个dist的目录,这个就是打包之后的文件夹里面有个index.html,但是我们点击直接打开是看不到任何内容的,这时候,我们需要部署到nginx中。

注:首次打包需要npm install一下
在这里插入图片描述

在这里插入图片描述

首先我们下载一个nginx,下载地址:http://nginx.org/en/download.html,这里我们下载nginx/Windows-1.26.0版本,下载之后解压zip。根据我们对nginx的熟悉,静态文件我们放在html文件夹下面,所以先把html文件夹中的index.html50x.html删掉,然后把打包出来的dist文件夹内的所有文件都复制到nginxhtml中,如图:

在这里插入图片描述
在这里插入图片描述

双击nginx.exe启动nginx,然后浏览器输入http://localhost,出现了我们熟悉的界面,虽然没有博客数据,链接也自动跳转到了http://localhost/blogs,

在这里插入图片描述
我们点击任意一个链接或者按钮或者剧新界面,这时候出现了404:

在这里插入图片描述
刷新之后nginx就找不到路由了,这是为啥,得和你们科普一下,vue项目的入口是index.html文件,nginx路由的时候都必领要先经过这个文件,所以我们得给nginx定义一下规则,让它匹配不到资源路径的时候,先去读取index.html,然后再路由。所以我们配置一下nginx.conf文件。具体操作就是找到location,添加上一行代码try_files $uri $uri/ /index.html last;如下:

  • nginx-1.26.0/conf/nginx.conf
location / {root html;try_files $uri $uri/ /index.html last;index index.html index.htm;
} 

在这里插入图片描述

这一行代码是什么意思呢?
try_files的语法规则:格式1:try_files file…uri,表示按指定的们file顺序查找存在的文件,并使用第一个找到的文件进行请求处理,last表示匹配不到就内部直接匹配最后一个。

重启nginx之后,链接再刷新都正常啦。但是没有数据,所以我们去部署一下后端。windows环境nginx的重启我一般都是打开任务管理器直接干掉nginx进程,然后再重新双击的~~

在这里插入图片描述
重启之后,这样就能找到我们的资源路径了(例如:通过logs,跳转到登录页)

在这里插入图片描述
在这里插入图片描述

前端已经部署完毕,但是没有数据进来,现在部署后端。

1.2、后端

后端的打包就简单多了,应该大家都挺熟悉的,注意配置redis、mysql的链接密码啥的,然后执行命令,本机测试,redis和mysql我都已经提前安装好的了,sql文件也在vueblog-java的resources日录下

对了,pom.xml文件里面,spring-boot-maven-plugin之前注释掉了,现在一定要打开。不然执行jar会找不到主类。

  • pom.xml
    <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

在这里插入图片描述

执行打包命令:

#跳过测试打包
mvn clean package -Dmaven.test.skip=true

得到target下的vueblog-0.0.1-SNAPSHOT.jar,然后再执行命令

或者直接通过maven工具

在idea右侧直接运行clean–>test–>package,左边会出现target文件和jar包
在这里插入图片描述

java jar vueblog-0.0.1-SNAPSHOT.jar --spring.profiles.active=default

后端上线之后,我们再访问下前端,发现已经可以正常浏览网页啦!spring.profiles.active表示指定环境配置文件。

在这里插入图片描述
在这里插入图片描述
图中后端启动完成,端口为8082,刷新前端页面

在这里插入图片描述

到此,win部署完成。

2、linux环境

linux环境部署相对复杂一点,因为我们还要部署redis、mysql等。我们使用docker compose来编排我们的服务,一起性搞定部罢。
二话不说,我们先来安装一下docker和docker compose,对于docker知识还不是特别懂的同学,建议自行去补习补习哈。

2.1、安装docker

#安装
yum install docker#检验安装是否成功
[rootalocalhost opt]# docker--version
Docker version 26.0.0, build 2ae903e#启动
systemctl start docker

2.2、安装docker compose

可以参考:https://docs.docker.com/compose/install/

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose或者sudo wget "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64" -O /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose#检查是否安装成功
docker-compose --version

在这里插入图片描述

2.3、编写Dockerfile文件

因为我们的项目需要成为docker的镜像,所以我们必须先编写Dockerfile文件构建我们的项目镜像然后进行编排,Dockerfile文件可以帮我们进行构建。

在这里插入图片描述

  • Dockerfile
FROM openjdk:8EXPOSE 8080ADD vueblog-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=pro"]

2.4、编写docker-compose.yml文件

我们需要用到的软件与服务分别有nginx、mysq、redis、还有我们的springboot项目,所以编写如下:

  • docker-compose.yml
version: '3'services:nginx: # 服务名称image: nginx:latest # 最新版本的nginxports:#- 80:80 # 把docker容器的80端口映射到宿主机的80端口- 81:81volumes:- /root/nginx/html:/usr/share/nginx/html  # 将docker中额html文件夹映射到宿主机的/root/nginx/html目录下- /root/nginx/nginx.conf:/etc/nginx/nginx.conf  # 将docker中额nginx.conf配置文件映射到宿主机的/root/nginx/nginx.conf目录下privileged: true # 这个必须要加,解决nginx的文件调用权限问题mysql:image: mysql:5.7.27ports:#- 3306:3306- 8081:3306environment:- MYSQL_ROOT_PASSWORD=adminredis:image: redis:latestcommand: redis-server /etc/redis/redis.confvolumes:- ./redis/data:/data- /root/redis/redis.conf:/etc/redis/redis.conf  # 将docker中额nginx.conf配置文件映射到宿主机的/root/nginx/nginx.conf目录下ports:- 6379:6379vueblog:image: vueblog:latestbuild: .   # 这个不能从docker hub中去拉取,需要自己构建,会去寻找同级下的Dockerfile文件(文件中的jar包)进行构建ports:- 8082:8082depends_on:- mysql- redis

上面注释写的很明白

2.5、修改application-pro.yml

然后我们再回头看看applicaiion-pro.yml文件,mysql和redls的链接之前还是localhost,现在我们需要修改成容器之间的调用,如何知道mysql和redis的链接地址呢?docker compose就帮我们解决了这个问题,我们可以使用镜像容器的服务名称来表示链接。比如docker-compose.yml中mysql的服务名称就叫mysql、redis就叫redis。

# DataSource Config
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://mysql:8081/vueblog?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghaiusername: rootpassword: admin
shiro-redis:enabled: trueredis-manager:host: redis:6379

2.6、准备好nginx的挂载目录和配置

docker-compose.yml中已经提到

  • 宿主机的挂载目录:/root/nginx/htmI
  • 挂载配置:/root/nginx/nginx.conf

所以我们在root目录下新建nginx目录,并进入nginx目录下新建html目录和一个nginx.conf配置文件。

在这里插入图片描述
axios.js文件中url需要改成你的linux机器ip

在这里插入图片描述
重新前端代码打包,压缩后托到html文件夹下面

在这里插入图片描述

将dist文件下面的文件全部转移到html下

在这里插入图片描述

编写nginx.config配置文件,其中可以参考win下的配置文件

将location 的html地址改成挂载的目录

# user root;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {# listen       80;listen       81;server_name  localhost;location / {root   /usr/share/nginx/html;try_files $uri $uri/ /index.html last;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

在这里插入图片描述

2.7、部署后端服务

一切准备就绪之后,我们就开始编排部署了哈。

首先本地打包vueblog项目,vueblog-0.0.1-SNAPSHOT.jar,并上传到linux中,同时docker-compose.ymlDockerfile也上传到同一目录下。如图所示:

在这里插入图片描述

然后我们执行一下编排命令:

#开始编排
cd
docker-compose up -d

其中-d表示后台服务形式启动

然后我们稍等片刻,特别是开始Building vueblog的时候可能时间有点长,耐心等待即可!最后提示如下·

在这里插入图片描述

访问连接:http://47.116.123.21:81/blogs(你自己的ip+port)我这里为了避免冲突,我将80改成了81端口
在这里插入图片描述
发现没有数据,需要导入sql表

DROP TABLE IF EXISTS `m_blog`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
SET character_set_client = utf8mb4 ;
CREATE TABLE `m_blog` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) NOT NULL,`title` varchar(255) NOT NULL,`description` varchar(255) NOT NULL,`content` longtext,`created` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,`status` tinyint(4) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;DROP TABLE IF EXISTS `m_user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
SET character_set_client = utf8mb4 ;
CREATE TABLE `m_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`username` varchar(64) DEFAULT NULL,`avatar` varchar(255) DEFAULT NULL,`email` varchar(64) DEFAULT NULL,`password` varchar(64) DEFAULT NULL,`status` int(5) NOT NULL,`created` datetime DEFAULT NULL,`last_login` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `UK_USERNAME` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;INSERT INTO `vueblog`.`m_user` (`id`, `username`, `avatar`, `email`, `password`, `status`, `created`, `last_login`) VALUES ('1', 'hanson', 'https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg', NULL, '96e79218965eb72c92a549dd5a330112', '0', '2020-04-20 10:44:01', NULL);

在这里插入图片描述
再次刷新项目就部署成功了;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据挖掘实战-基于内容协同过滤算法的电影推荐系统

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

OpenHarmony集成OCR三方库实现文字提取

1. 简介 Tesseract(Apache 2.0 License)是一个可以进行图像OCR识别的C库&#xff0c;可以跨平台运行 。本样例基于Tesseract库进行适配&#xff0c;使其可以运行在OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;上&#xff0c;并新增N-API接口供上层应…

Ubuntu服务器运行Subspace节点和Farm

提供Subspace 节点部署&性能优化&机房托管&运维监控等服务。myto88 磁盘格式化 将插入的磁盘格式化。 sudo mkfs.ext4 -m 0 -T largefile4 /dev/sd*磁盘挂载 此处为语雀内容卡片&#xff0c;点击链接查看&#xff1a;https://www.yuque.com/u25096009/lvoxa…

企商在线荣登甲子光年“2024中国AI算力层创新企业”榜单

5月15日&#xff0c;「AI创生时代——2024甲子引力X科技产业新风向」大会在北京顺利举办&#xff0c;大会发布2024【星辰100】创新企业榜。企商在线凭借全栈式一体化AI算力能力&#xff0c;与超聚变、寒武纪等企业共同入选“2024中国AI算力层创新企业”榜单。 本次大会由中国科…

AJAX(JQuery版本)

目录 前言 一.load方法 1.1load()简介 1.2load()方法示例 1.3load()方法回调函数的参数 二.$.get()方法 2.1$.get()方法介绍 2.2详细说明 2.3一些例子 2.3.1请求test.php网页并传送两个参数 2.3.2显示test返回值 三.$.post()方法 3.1$.post()方法介绍 3.2详细说明 …

什么是云计算安全?如何保障云计算安全

云计算彻底改变了数据存储的世界&#xff0c;它使企业可以远程存储数据并随时随地从任何位置访问数据。存和取变得简单&#xff0c;也使得云上数据极易造成泄露或者被篡改&#xff0c;所以云计算安全就显得非常重要了。那么什么是云计算安全&#xff1f; 其实&#xff0c;云计…

WPS PPT学习笔记 1 排版4原则等基本技巧整理

排版原则 PPT的排版需要满足4原则&#xff1a;密性、对齐、重复和对比4个基本原则。 亲密性 彼此相关的元素应该靠近&#xff0c;成为一个视觉单位&#xff0c;减少混乱&#xff0c;形成清晰的结构。 两端对齐&#xff0c;1.5倍行距 在本例中&#xff0c;19年放左边&#x…

是谁的项目还在烂大街?一个基于 SpringBoot 的高性能短链系统

看了几百份简历&#xff0c;真的超过 90% 的小伙伴的项目是商城、RPC、秒杀、论坛、外卖、点评等等烂大街的项目&#xff0c;人人都知道这些项目烂大街了&#xff0c;但大部分同学还是得硬着头皮做&#xff0c;没办法&#xff0c;网络上能找到的、教程比较完善的就这些项目了&a…

基于机器学习预测未来的二氧化碳排放量(随机森林和XGBoost)

基于机器学习预测未来的二氧化碳排放量&#xff08;随机森林和XGBoost&#xff09; 简介&#xff1a; CO2排放是当今全球关注的环境问题之一。本文将使用Python对OWID提供的CO2排放数据集进行分析&#xff0c;并尝试构建机器学习模型来预测未来的CO2排放趋势。我们将探索数据…

kafka Kerberos集群环境部署验证

背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka keberos安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详细…

ViLT学习

多模态里程碑式的文章&#xff0c;总结了四种多模态方法&#xff0c;根据文字和图像特征特征抽取方式不通。 文章的贡献主要是速度提高了&#xff0c;使用了数据增强&#xff0c;文本的mask 学习自b站朱老师的论文讲解

电赛控制类PID算法实现

一、什么是PID PID&#xff08;Proportional-Integral-Derivative&#xff09;是一种经典的控制算法&#xff0c;广泛应用在自动化控制系统中。它是通过对被控对象的测量值和设定值进行比较&#xff0c;并根据误差的大小来调整输出信号&#xff0c;实现对被控对象的稳定控制。 …

【C++】map和set的封装

目录 前言一、红黑树的设计1.1 红黑树存储节点的设计1.2 红黑树的迭代器1.3 map的设计1.4 set的设计1.5关于map与set的const_iterator设计 前言 我们知道map和set的底层都是用红黑树实现的&#xff0c;但是set和map的结构不一样&#xff0c;set只有一个参数K&#xff0c;而map…

前端基础:1-2 面向对象 + Promise

面向对象 对象是什么&#xff1f;为什么要面向对象&#xff1f; 通过代码抽象&#xff0c;进而藐视某个种类物体的方式 特点&#xff1a;逻辑上迁移更加灵活、代码复用性更高、高度的模块化 对象的理解 对象是对于单个物体的简单抽象对象是容器&#xff0c;封装了属性 &am…

Linux_应用篇(07) 系统信息与系统资源

在应用程序当中&#xff0c;有时往往需要去获取到一些系统相关的信息&#xff0c;譬如时间、日期、以及其它一些系统相关信息&#xff0c;本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取系统信息&#xff0c; 譬如获取系统时间、日期以及设置系统时间、日期等&#x…

三能一体运营体系助力政企支撑水平提升

生产力的发展是现代社会孜孜不倦的追求&#xff0c;由此产生了我们熟悉的“机械化、电子化、信息化”乃至现今正在发生的“智能化”四次工业革命。这些是由技术的突破性发展带来的&#xff0c;但我们也注意到生产力发展的另一个助力&#xff0c;即生产效率的提升&#xff0c;19…

【MySQL数据库】mysql日志管理、备份与恢复

mysql日志管理、备份与恢复 MySQL数据库备份及日志一、数据库备份分类&#xff1a;如何选择逻辑备份策略 (频率)完全备份与恢复备份恢复 增量备份与恢复实现增量备份 基于时间点与位置恢复 二.MySQL日志管理 MySQL数据库备份及日志 在生产环境中&#xff0c;数据的安全性是至关…

在未来你将何去何从?

在数字化的浪潮中&#xff0c;信息技术行业无疑是推动全球经济和社会发展的重要动力。随着科技的不断迭代与进步&#xff0c;云计算、大数据、人工智能&#xff08;AI&#xff09;、物联网&#xff08;IoT&#xff09;、5G通信和区块链等技术已经深入到我们生活的每一个角落&am…

鸿蒙原生应用元服务开发-鸿蒙真机运行项目实战与注意事项

一、解压项目注意项目包不能为中文 二、用数据线将装好DevEco Studio的电脑与设置为开发者模式的鸿蒙手机相连接。 三、将项目包托进DevEco Studio 中 注意项目包文件不能有嵌套 四、查看设备运行 五、点击项目结构 六、勾选红色框圈部分 登录开发者账号 七、选择好公司 八、等…