一、机器准备

首先准备三台机器:

我是一台WINDOWS系统主机,在WINDOWS里的 VMware 中安装两台Ubuntu系统虚拟机

如果你的虚拟机只有 CentOS,可以参考这篇文章:https://www.cnblogs.com/qwg-/p/13237210.html

VMware 中如何克隆虚拟机

右键点击你的原虚拟机,选择管理 ----> 克隆

我创建的是完整克隆,根据自身情况选择存放路径

以下是分布式部署项目的机器结构

(三台主机需要连接同一个WLAN)

主机名 负责部署 IP地址
ytt132 前后端 192.168.193.129
ytt132_02 访问 192.168.193.130
WINDOWS 数据库 192.168.0.107

如何查询机器IP地址

  1. 查询当前 Ubuntu 虚拟机(ytt132)的IP地址

    (1) 打开终端

    (2) 输入 ifconfig

  2. 查询WINDOWS主机的IP地址

    (1) WIN键 + R打开“运行”

    (2) 输入 cmd 打开 “命令提示符”

    (3) 输入 ipconfig 查询,WLAN下的IPv4地址即本机的IP地址,我的是192.168.0.107

二、项目准备

WINDOWS :

准备一个 VUE+SPINGBOOT 项目,在IDEA中打开,并且能够成功运行

本人使用的项目是一个基于Vue框架的前端(项目名CRUDDemo)和一个基于SpringBoot框架的后端(项目名CRUDServer02)

运行要求

前端:安装好npm、Vue

后端:安装好Maven

三、前端部署

前端准备

先安装 nginx 代理服务器

nginx 简介:https://www.runoob.com/w3cnote/nginx-setup-intro.html

安装方法一(建议使用)

1. 在终端中输入命令:
sudo apt-get install nginx

2. 输入 nginx -v 查看是否安装成功,出现版本号即安装成功

3. 启动 nginx 服务:
sudo service nginx start

补充两个 nginx 操作:

sudo service nginx stop        # 停止nginx服务
sudo service nginx restart     # 重启nginx服务
4. 在浏览器地址栏输入本机IP地址,若出现以下欢迎界面即安装成功

其他安装方法

其他安装方法参考:https://blog.csdn.net/qq_23832313/article/details/83578836

前端打包

1. 修改URL(根据个人项目情况操作)

先检查项目文件中有没有使用 http://localhost:xxxx/ 这种URL进行 POST 和 GET 方法的语句(可以使用 CTRL + F 搜索 'localhost' 来查找),我是写在了vue文件中的

因为 localhost 指的是本地IP地址,与 127.0.0.1 一样,所以使用外部主机访问该URL时是无法进行远程访问的

因此,我们要把所有 localhost 修改为你用来部署前后端的主机IP,例如我使用的是 ytt132端 部署的前后端,刚刚已经查询过为192.168.193.129

复制该IP后,将其粘贴并替换vue中所有带 localhost 的URL地址

2. 开始打包

修改完成后,打开终端 Terminal ,输入 npm run build (注意项目路径)

项目资源管理窗口中出现 dist 文件夹即打包完成

在文件资源管理器中打开 dist 文件夹所在位置,对其进行压缩

注:若你传输文件的常用方式为共享文件夹,则不用压缩和解压,可以直接上传文件夹

3. 上传文件

将 dist.zip 压缩文件发送到将要部署前后端的虚拟机(ytt132)中

(可以用 SSH 连接主机和虚拟机或者 空投 等方式传文件)

本人喜欢用空投嘻嘻:AirPortal 空投快传

上传成功!

找一个地方存放打包好的前端文件夹,我是在 /usr/local 下新建文件夹 project 专门存放前后端打包文件

新建文件夹命令

sudo mkdir /usr/local/project
4. 解压文件

将dist.zip压缩文件解压到/usr/local/project目录下

解压zip文件命令:

sudo unzip -d /usr/local/project ~/下载/dist.zip

前端配置

配置文件具体位置如图:

使用apt工具安装 nginx 的配置文件在 /etc/nginx/nginx.conf

但在 nginx.conf 文件里有一条这样的语句,它引用了 /etc/nginx/sites-enabled 下所有文件中的内容

进入 /etc/nginx/sites-enabled 目录,可以看到目录下只有一个 default 文件

所以我们需要对该 default 文件进行前端配置

1. 修改配置文件
sudo gedit default

在server中添加如下语句:

root /usr/local/project/dist;    # 前端打包文件夹所在位置    # 注意要分号

保存 default 文件即前端配置完成!

2. 重启nginx服务
sudo service nginx restart

前端部署成功

四、数据库部署

WINDOWS:

运行 navicat premium

1. 打开 localhost_3306 连接

右键选择新建数据库,数据库命名要与后端项目src/main/resources/application.properties中url里的数据库名对应

例如我的是 cruddemo_db

2. 双击打开数据库
3. 运行数据库文件

接下来是运行你的数据库文件,如果是 sql文件 的话直接右键运行 sql文件

以下是还原 nb3备份文件 的步骤:

右键备份,选择还原备份从...

点击 “还原” ,完成后直接关闭

数据表导入完成

4. 修改用户权限

在数据库开启的状态下,点击上方菜单栏中的用户

双击 ‘ root@localhost ’ 进入root用户设置界面,将主机名从localhost修改为%(表示所有用户可连接)

至此,数据库配置完成

五、后端部署

后端打包

(确保maven插件已安装,并且项目能够成功运行)

在 src/main/resources 目录下找到 application.properties ,这是编写连接数据库代码的文件,找到项目对应的数据库名字,我这里是 cruddemo_db

该文件中有几个要注意的参数

  • server.port:后端运行的端口号

  • spring.datasource.url:连接MYSQL数据库

  • username:MYSQL用户名

  • password:MYSQL密码

(可以使用自行设置的端口号,但要保证虚拟机在运行后端时没有相同端口号的进程在运行)

在后面的配置文件中也会使用到这个端口号

这里url地址要将 localhost 修改为你要进行部署数据库的主机IP地址,即 WINDOWS端 的IP地址

1. 修改后端url的IP地址

并检查 username 和 password 是否和你的 MYSQL 连接的用户名和密码相同

检查无误后开始打包

2. 开始打包

点开右侧边栏中的 Maven,按照以下目录选择 clean、compile、package,然后点击上方的绿色三角运行打包

打包成功界面

打包出来的文件在项目的 target 目录下,是一个jar包

3. 上传文件

将这个jar包上传到部署前后端的虚拟机上(ytt132)

后端配置

再次进入 /etc/nginx/sites-enabled 目录,对default文件进行后端配置

sudo gedit default

在 location 中添加如下语句:

proxy_pass http://192.168.193.129:8081;    # 192.168.193.129为当前主机IP,8081为后端部署的端口

注:若后面后端运行失败,连虚拟机本地都不能访问WEB的话,尝试在default文件中注释原来的location,并在后面添加以下代码:

location  ^~ /prod-api/ {
proxy_pass http://192.168.193.129:8081/; # 192.168.193.129为当前主机IP,8081为后端部署的端口
}

(只是修改了location方法头)

保存 default 文件即后端配置完成

后端运行

1. 运行jar包

在jar包所在目录下运行以下命令

java -jar crud-demo-0.0.1-SNAPSHOT.jar

2. 重启 nginx 服务
sudo service nginx restart
3. 访问服务

在浏览器中输入本机IP访问

后端数据成功显示,前后端部署完成

注:

在后端运行过程中可以输入 CTRL+Z 终止运行

但这样并未真正终止进程,再次运行可能会出现以下报错:

终端里输入 sudo netstat -anutp | grep 8081 查看占用了8081端口的进程PID:3963

杀死该进程PID号

kill -9 3963

重新运行jar包成功

六、外部访问

最后,要在外部主机访问WEB服务,本人是在 ytt132_02端 进行访问的

打开另一个虚拟机的浏览器,输入 ytt132 (部署前后端)的IP地址:http://192.168.193.129/

成功访问!

防火墙问题

可以使用 ping 对方主机IP地址 来测试两台主机能否连接

若两台机器之间无法ping通,检查一下ping的那台机器是否开启了防火墙,很有可能是防火墙阻挡了外部访问你的IP

WINDOWS打开或关闭 Microsoft Defender 防火墙:https://support.microsoft.com/zh-cn/windows/打开或关闭-microsoft-defender-防火墙-ec0844f7-aebd-0583-67fe-601ecf5d774f

Ubuntu防火墙常用命令:

sudo ufw status     # 查看防火墙活动状态
sudo ufw allow 3306     # 开放防火墙3306端口,也可以把8081端口也开放
sudo ufw enable    # 开启防火墙
sudo ufw reload     # 重启防火墙
sudo ufw disable      # 关闭防火墙

云计算:Ubuntu下Vue+Springboot前后端分离项目部署(多节点)的更多相关文章

  1. docker-compose 部署 Vue+SpringBoot 前后端分离项目

    一.前言 本文将通过docker-compose来部署前端Vue项目到Nginx中,和运行后端SpringBoot项目 服务器基本环境: CentOS7.3 Dokcer MySQL 二.docker ...

  2. 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题

    问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...

  3. Vue + SpringBoot 前后端分离打包部署遇到的坑

    1. 在vue项目的目录下,用npm run build 生成dist目录,将目录下的static和index.html复制到SpringBoot项目下的resource目录下 这个时候发现启动Spr ...

  4. nginx+vue+uwsgi+django的前后端分离项目部署

    Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...

  5. vue+springboot前后端分离实现单点登录跨域问题处理

    最近在做一个后台管理系统,前端是用时下火热的vue.js,后台是基于springboot的.因为后台系统没有登录功能,但是公司要求统一登录,登录认证统一使用.net项目组的认证系统.那就意味着做单点登 ...

  6. 前后端分离项目部署到Linux虚拟机

    最近做了一个springboot+vue的前后端分离项目,把它部署到Linux虚拟机上.下面是我的步骤和遇到的问题,需要的朋友可以看下(看的时候注意要全部看完到底部,因为我习惯是把我遇到的问题放到最后 ...

  7. 基于Vue的前后端分离项目实践

    一.为什么需要前后端分离 1.1什么是前后端分离  前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...

  8. Docker环境下的前后端分离项目部署与运维

    本教程将从零开始部署一个前后端分离的开源项目,利用docker虚拟机的容器技术,采用分布式集群部署,将项目转换成为高性能.高负载.高可用的部署方案.包括了MySQL集群.Redis集群.负载均衡.双机 ...

  9. Vue+SpringBoot前后端分离中的跨域问题

    在前后端分离开发中,需要前端调用后端api并进行内容显示,如果前后端开发都在一台主机上,则会由于浏览器的同源策略限制,出现跨域问题(协议.域名.端口号不同等),导致不能正常调用api接口,给开发带来不 ...

随机推荐

  1. 在windev中实现BS架构级的灵活排版

    windev是CS架构,但却能够实现BS架构级的灵活排版.玩过CS架构的老铁们,感受应会都如我,如获新生!因为苦于没有一张好画皮久矣!在windev中,要实现灵活,专业,自适应和非常丰富的排版,可以关 ...

  2. 【C# 线程】线程局部存储(TLS)理论部分 ThreadStatic|LocalDataStoreSlot|ThreadLocal<T>

    线程本地存储(TLS:Thread Local Storage) 线程本地存储(Thread Local Storage),字面意思就是专属某个线程的存储空间.变量大体上分为全局变量和局部变量,一个进 ...

  3. 深入理解Cache工作原理

    内容来源:https://zhuanlan.zhihu.com/p/435031232 内容来源:https://zhuanlan.zhihu.com/p/102293437 本文主要内容如下,基本涉 ...

  4. 一个简单的性能计数器:CodeTimer

    public static class CodeTimer { public static void Initialize() { Process.GetCurrentProcess().Priori ...

  5. 我遇到移动端ios系统遇到的一些坑和解决办法

    我是作为一个H5移动端开发.主要是做跨平台兼容ios系统和Android系统. 在移动端中,最让我头疼的不是功能,不是业务逻辑.而是适配.俗话说:移动端适配是最头疼的事情,也是头发掉得最快的时候. 我 ...

  6. MIPI CSI-2 像素打包格式解析

    背景 MIPI CSI-2支持YUV.RGB和RAW data三种数据格式,这里是个笼统的叫法,具体又根据不同的像素打包方式细分为具体的格式,打包是什么概念?就是把Sensor采样得到的RGB三个通道 ...

  7. Python:pyglet学习(1):想弄点3D,还发现了pyglet

    某一天,我突然喜欢上了3D,在一些scratch教程中见过一些3D引擎,找了一个简单的,结果z轴太大了,于是网上一搜,就发现了pyglet 还是先讲如何启动一个窗口 先看看官网: Creating a ...

  8. 微信小程序商品发布

    <!--pages/good/good.wxml--> <!--商品发布--> <form bindsubmit="formSubmit"> & ...

  9. laravel报错 : laravel Please provide a valid cache path

    这是因为laravel的缓存路径没有找到 laravel缓存文件路径是在 config/cache.php中设置,默认存在storage文件夹中 'file' => [ 'driver' =&g ...

  10. OCCT基础

    基础 构成总览 Root类 基本类型,如布尔,字符,整数或实数 安全处理动态创建的对象,确保自动删除未引用的对象 可配置的内存管理器,提高了应用程序的性能 包含运行时类型信息机制,有助于创建复杂应用 ...