Docker+Nginx打包部署前后端分离项目

news2024/9/24 19:14:26

Docker+Nginx打包部署前后端分离项目

  • 1、问题描述
  • 2、项目打包
    • 2.1 前端项目打包
      • 2.1.1 修改vue.config.js文件
      • 2.1.2 router配置中添加base属性
      • 2.1.3 打包前端项目
    • 2.2 后端项目打包
    • 2.3 将前端和后端的打包文件上传到服务器
  • 3 nginx反向代理配置
  • 4、后端通过Dockerfile打包成docker镜像
    • 4.1 这里为什么使用docker?
    • 4.2 编写Dockerfile
    • 4.3 构建Docker镜像
    • 4.4 查看构建的镜像
    • 4.5 运行容器
    • 4.6 运行测试

1、问题描述

  最近做了一个前后端分离的通用权限管理系统,今天想用自己的服务器部署下,本地部署测试是没问题的,但是部署在服务器上还是出现了许多小插曲,这里大概记录一下吧。

2、项目打包

2.1 前端项目打包

  由于我需要在同一个端口号下使用nginx部署多个前端项目,所以需要额外设置一些东西。

2.1.1 修改vue.config.js文件

  添加如下配置:

image-20221230164452873

2.1.2 router配置中添加base属性

const createRouter = () => new Router({
  // mode: 'history', // require service support
  scrollBehavior: () => ({ y: 0 }),
  routes: constantRoutes,
  base:'/guigu'
})

image-20221230164614590

2.1.3 打包前端项目

  执行命令:npm run build:prod

image-20221230164743322

image-20221230164732551

  出现dist文件夹说明打包成功

image-20221230164808807

2.2 后端项目打包

这里我跳过了test步骤

image-20221230164838903

  打包之后target文件夹下面会有jar包

image-20221230164906192

2.3 将前端和后端的打包文件上传到服务器

  这里上传的方法较多,不过多赘述了。

image-20221230165043432

  将dist.tgz文件解压即可

tar -zxvf dist.tgz -C  写你的解压路径即可

3 nginx反向代理配置

  部分配置如下:

image-20221230165222245

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
           proxy_pass http://blog;
		   proxy_set_header HOST $host;
		   proxy_set_header X-Forwarded-Proto $scheme;
		   proxy_set_header X-Real-IP $remote_addr;
		   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
		
		location ^~/prod-api/ {
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header REMOTE-HOST $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header X-NginX-Proxy true;
			proxy_pass http://127.0.0.1:8800/;
		}
		# guigu-auth配置
		location /guigu {
			alias /opt/guigu-auth/guigu-front/;
			index index.html index.htm;
		}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

  上面nginx.conf的配置分为两个部分,第一个部分实现前端vue的映射,即将/opt/guigu-auth/guigu-front/index.html映射成127.0.0.1:8080/guigu

location /guigu {
			alias /opt/guigu-auth/guigu-front/;
			index index.html index.htm;
}

  第二部分是将后端请求指向后端项目。这里直接替换了uri的前缀prod-api,也就是说假设前端向后端发送的请求为http://localhost:8800/prod-api/admin/system/index,经过nginx反向代理后,实际上到达后端的uri为http://localhost:8800/admin/system/index

  至此,前端项目部署完毕

  访问codeleader.top/guigu,会出现如下页面说明前端部署成功

image-20221230170335533

4、后端通过Dockerfile打包成docker镜像

4.1 这里为什么使用docker?

  我开始不想用这个,是直接将jar包在服务器上部署的,觉得小项目没必要用docker。但是由于我以前搭建个人博客的时候装的jdk11,这个项目使用jdk8开发的,环境不一致,docker的环境隔离机制非常适合现在这种情况,关于docker使用场景请看我docker专栏,这里不再赘述。

4.2 编写Dockerfile

# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER xtt
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为guigu_docker.jar
ADD service-system.jar guigu_docker.jar
# 运行jar包
RUN bash -c 'touch /guigu_docker.jar'
ENTRYPOINT ["java","-jar","/guigu_docker.jar"]
#暴露8800端口作为微服务
EXPOSE 8800

4.3 构建Docker镜像

  将打包的后端项目jar包和Dockerfile放在同一个目录下面

image-20221230170847494

  执行命令如下命令构建镜像:

docker build -t guigu_docker:1.0 .

image-20221230170948838

4.4 查看构建的镜像

docker images

image-20221230171022201

4.5 运行容器

docker run -d -p 8800:8800 --name guigu-auth guigu_docker:1.0

image-20221230171057150

image-20221230171116141

4.6 运行测试

  点击登录按钮,成功进入系统,说明前后端部署成功。

image-20221230171226854

image-20221230171736165

image-20221230171711121

   现在这种部署方式跟部署单个微服务的方法一样,但是生产中不可能只有一个微服务,所以需要借助容器编排来实现一次打包一堆微服务,包括docker-compose、docker swam、k8s、DevOps等这还需要大量的开发实践才行,这些技术光学没用,要在自己的项目中实践才行。其实这里nginx和前端也可以用容器部署的,但这里暂时感觉没必要。

  开发+部署多有意思啊,现在整天搞自己不感兴趣的方向已经和当初自己想象的研究生科研生涯完全不同了,这种感觉或许只有自己读研之后才能感同身受了,虽有诸多无奈,但我绝不会放弃我所热爱的技术,架构师之路任重而道远。

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

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

相关文章

目标检测-锚框

目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。 不同的模型使用的区域采样方法可能不同。 这里我们介…

vue3 antd项目实战——Form表单的重置【使用resetFields()重置form表单数据、清空输入框】

vue3 ant design vue项目实战——Form表单【resetFields重置form表单数据】关于form表单的文章场景复现resetFields()重置表单数据项目实战关于form表单的文章 文章内容文章链接Form表单提交和校验https://blog.csdn.net/XSL_HR/article/details/128495087?spm1001.2014.3001…

十二、Kubernetes核心技术Service详解、实例

1、概述 我们都知道Kubernetes会为每个pod分配一个独立的IP,然而却存在如下问题: Deployment控制的3个pod,其中一个Pod出现问题,这个时候给销毁重新创建后Pod Ip会变化Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问 …

AcWing的Linux基础课学习笔记(未学完)

目录版本B站试听课(1.常用文件管理命令)1.1文件系统1.2文件管理常用指令版本 服务器:Linux Ubuntu 20.04     我的笔记本:Acer Nitro AN515-55(所以如果我要在AC Terminal里复制粘贴的话分别是:CtrlFnI…

autoload魔术方法的妙用

前言: __autoload魔术方法从PHP7.2.0开始被废弃,并且在PHP8.0.0以上的版本完全废除。取而代之的则是spl_autoload_register,但是本文还是研究__autoload。 什么是autoload魔术方法? 首先还是从官方手册中下手,了解a…

C++线程池的一种实现

线程池是实际开发中提高软件性能和稳定性的一种基本手段。可以想一下,如果程序中不用多线程,那执行效率会很低,如果运行线程太多,操作系统又吃不消,程序性能和稳定性会收到威胁。所以使用线程池技术诞生了,…

争做八桂好网民网络评选投票小程序投票的优劣微信怎么投票

用户在使用微信投票的时候,需要功能齐全,又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便,用户可以随时使用手机微信小程序获得线上投票服务,很多用户都很喜欢“活动星投票”这款软件。“活动星投票”小程序在使…

【Linux】Linux进程的理解

如果不改变自己,就别把跨年搞的和分水岭一样,记住你今年是什么吊样,明年就还会是什么吊样!!! 文章目录一、冯诺依曼体系结构(硬件)二、操作系统(软件)1.操作…

AWVS安装与使用(最新版2022.12.27更新)

AWVS安装与使用1.AWVS1.1.AWVS介绍1.2.AWVS下载2.AWVS安装2.1.AWVS安装流程2.1.1.运行安装2.1.2.安装位置2.1.3.设置账号密码2.1.4.端口设置2.1.5.远程设置2.1.6.安装证书2.2.AWVSpj2.2.1.pj软件设置2.2.2.运行pj软件2.2.3.成功过程2.2.4.失败过程(成功跳过&#xf…

基于Jeecg-boot开发的物流仓储系统,含数据库文件,涵盖模块:用户管理、车辆管理、计划管理、仓库管理、库存管理、财务管理、统计报表等

物流管理系统 完整代码下载地址:基于Jeecg-boot开发的物流仓储系统 基础开发环境:由于有小伙伴在运行项目时版本号不一致产生的各种问题,这里可以统一下版本号。 JDK: 1.8Maven: 3.5MySql: 5.7Redis: 3.2 Node Js: 10.0 Npm: 5.6.0Yarn: 1…

Java语法要素练习

目录 1.A B 2.求差 3.圆的面积 4.平均数1 5.工资 6.油耗 7.两点间距离 8.钞票 9.时间转换 10.简单乘积 11.简单计算 12.球的体积 13.面积 14.平均数2 15.工资和奖金 16.最大值 17.距离 18.燃料消耗 19.钞票和硬币 20.天数转换 1.A B 输入两个整数&#…

01月份图形化四级打卡试题

活动时间 从2023年 1月1日至1月21日,每天一道编程题。 本次打卡的规则如下: (1)小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 (2)小朋友做完题目后&…

chatgpt接口版本,chatgpt网页版,chatgpt国内直接用的版本,无广告、无套路、拿去就用

老规矩,先看效果: 文件是电脑端的网页版,打开之后输入你自己的apikey,然后就可以直接开始问了,带上下文功能,直接问的问题是自动跟之前上面的所有问题有关联的,如果想要重新开始一个上下文语境…

初入公司,一招shell教你如何看清linux应用服务日志

文章目录Linux系统查看应用日志一、背景二、分析2.1、思路三、shell脚本实现3.1、效果演示13.2、优化shell脚本3.3、效果演示2四、技能扩展Linux系统查看应用日志 一、背景 为了方便测试查看服务日志,而开发过shell来实现快捷查看日志脚本,具体做法呢就…

通过可视化运维配置,实现故障秒级自愈

急促的告警铃声响彻寂静的夜晚。对运维人来说,晚间值守耗费更大的精力,往往一个简单的磁盘使用率告警通知,就不得不爬起来进行处理,毕竟告警无小事,对于小问题,运维人也不能心存侥幸心理。虽然有着值班人员…

QML学习笔记【02】:QML快速入门

一、QML语法(QML Syntax) QML是一种描述用户界面的声明式语言。它将用户界面分解成一些更小的元素,这些元素能够结合成一个组件。QML语言描述了用户界面元素的形状和行为。用户界面能够使用JavaScript来提供修饰,或者增加更加复杂…

【OFDM系列9】OFDM采用正交区分不同子载波的,但是子载波通过调相后携带了基带信号后,如何还能继续保证两者正交

不经意间在知乎看到这样一个问题,在此记录一下我的看法 OFDM采用正交区分不同子载波的,但是子载波通过调相后携带了基带信号后,如何还能继续保证两者正交? 补充内容是:OFDM是指通过2组正交载波传递信息,但…

最小生成树,贪心算法和Prim算法的Java代码实现过程详解

1.最小生成树原理 之前学习的加权图,我们发现它的边关联了一个权重,那么我们就可以根据这个权重解决最小成本问题,但如何才能找到最小成本对应的顶点和边呢?最小生成树相关算法可以解决。 定义: 图的生成树是它的一棵含…

新生活、新成长、新认知

总览: 承接上文:https://blog.csdn.net/weixin_46141936/article/details/125537093 ​ 今年夏天 (即大三暑假) 入职 北京金山云 开始进行暑期实习,首次进到大城市、步入职场、接触到各种人、年龄的成长 等等,让我的心态 在 202…

Canvas drawImage() 方法实现图片压缩

图片压缩原理 1.CanvasRenderingContext2D.drawImage() 方法可以从页面 DOM 元素作为图像源来根据坐标和大小重新绘制该图像。 2.HTMLCanvasElement.toDataURL() 和 HTMLCanvasElement.toBlob() 方法支持导出为 base64 字符串或 Blob 对象。 CanvasRenderingContext2D.drawIm…