前后端分离的⼩Demo实现【多节点集部署】
前⾔
2、下⾯是【理论上】项⽬部署的架构图,事实上我⽐较穷,买不起这么多ECS,所以实际上部署时我只⽤了两台ECS。本博客会按照下⾯这张架构图介绍⽤Linux命令实现多节点集部署。看起来蛮简单的,但我在实际操作部署时遇到奇奇怪怪的错误蛮多的。
⽬录
环境安装
1、⾸先在ECS_1和ECS_4上安装Docker
2、在ECS_2和ECS_3上安装JDK
# 检查当前系统是否已安装JDK
yum list installed | grep java
# 查看当前所使⽤的JDK版本
java -verision
# 如果想卸载当前系统的所有JDK
yum -y remove java-*-openjdk*
yum -y arch
# 安装JDK8
yum -y list java*
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
# 如果存在多个JDK,想切换jdk版本
alternatives --config java
3、在ECS_1上通过Docker安装Nginx
# 拉取最新的Nginx镜像
docker pull nginx
# 启动容器
# 我不建议启动容器时挂载,因为挂载会以宿主机为基准,如果容器内⽬录有⽂件,⽽宿主机⽬录是空的,那么挂在后容器内⽬录的⽂件就没了docker run --name nginx -p 80:80 -d nginx
# 进⼊容器,并返回⼀个终端
docker exec -it nginx /bin/bash
# 容器内没有vim,在后⾯⽆法操作配置⽂件,所有需要安装vim
apt-get update
apt-get install vim
# 下⾯是Nginx容器内部⼏个主要的路径,后⾯配置Nginx时需要知道
静态资源⽂件夹:/usr/share/nginx/html
⽇志:/var/log/nginx
主配置⽂件:/etc/f
虚拟主机的配置⽂件:/etc/nginx/conf.d/*.conf
# 从宿主机复制⽂件或⽬录到容器内
# 这条命令也可以直接复制⽬录,不需要加其他命令参数
docker cp 宿主机路径容器id或容器别名:容器内部路径
4、在ECS_4上通过Docker安装MySQL
# 拉取最新版的MySQL镜像
docker pull mysql
# 启动容器
docker run -p 3306:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
# 进⼊容器内部,并返回终端
docker exec -it mysql8 /bin/bash
# 在容器内登进mysql
mysql -u root -p
# 输⼊密码...
# 查看所有账户
# 注意,有些MySQL,root账户默认并⽀持远程连接,所以我们要么打开权限,要么新增账户。
select user, host from mysql.user;
# 创建远程登录账户ysq,具有所有权限
create user 'ysq'@'%' identified by '密码';
grant all privileges on *.* to 'ysq'@'%' with grant option;
# 不要忘了刷新权限
flush privileges;
# 修改root密码
alter user 'root'@'localhost' identified by '新密码';
alter user 'root'@'%' identified by '新密码';
# 查看root的权限
show grants for 'root'@'%' \G;
项⽬部署
使⽤⼯具:xftp 和 xshell
1、将SpringBoot项⽬打成jar包,并推送到ECS_2和ECS_3并运⾏
# 在idea的终端,输⼊以下命令
# 跳过test模块,将项⽬达成jar包。默认会声称在target⽬录下
mvn package -st.skip=true
注意,在打jar包之前,我们可以不需要特意修改配置⽂件l。我们可以另外复制⼀份,把相关配置改成上线使⽤的配置,连同jar包⼀起推到云服务器上。然后在云服务器上运⾏jar包时,可以指定新的配置⽂件。
# 指定另外的配置⽂件l,运⾏jar包
# 以下命令基于l和jar包处于同⼀⽬录下
java -jar ***.jar --fig.l
上述命令是在前台运⾏jar包,会占⽤终端。按 ctrl + c 停⽌进程退出。
在测试时,可以这样做,可以看控制台输出。
# 在确保运⾏正常之后,以守护进程的⽅式后台启动并运⾏
nohup java -jar ***.jar --fig.l &
# 查看守护进程的⽇志输出(实时的)
tail -f nohup.out
# 查看对应端⼝号占⽤情况
lsof -i:端⼝号
# 如果没有lsof⼯具,直接通过以下命令安装
yum install lsof
# 通过pid强制杀死进程
kill -9 pid
2、将静态资源推送到ECS_1,配置Nginx
(1)将静态资源从宿主机拷贝到Nginx容器内
# /data/WechatPay/static 是静态资源在宿主机的路径
docker cp /data/WechatPay/static 容器id或容器别名:/usr/share/nginx/html
(2)在Nginx主配置⽂件中配置多节点和请求分发策略
# 进⼊容器内部
# nginx为容器名称,也可以替换为容器id
docker exec -it nginx /bin/bash
# 修改主配置⽂件
vim /etc/f
在http闭包中,添加以下配置:
# 配置多节点集
# lbs是⾃定义的集名称,后⾯会⽤到
# 端⼝是jar包(项⽬)运⾏后占⽤的端⼝
upstream lbs {
server ECS_2的公⽹ip:端⼝;
server ECS_3的公⽹ip:端⼝;
}
(3)修改虚拟主机的配置⽂件,配置请求分发策略
这⾥我直接使⽤Nginx默认的80端⼝,不另外配置虚拟主机。
# 建议做好备份,⽅便以后配置其他虚拟主机
vim /etc/nginx/conf.f
# 配置请求分发策略
# 凡是请求的路径为/api/的,都会负载均衡地分配到集lbs的任⼀节点
# 转发策略可以配置,下⾯采⽤默认策略
location /api/ {
proxy_pass lbs;
proxy_redirect default;
}
# 注意修改配置后需要重启Nginx容器,让配置⽣效
# 从容器内部退出
exit
docker restart 容器id或容器名称
(4)修改静态资源中有关接⼝请求的路径,指向Nginx
我上⾯的部署,由于Nginx在ECS_1上,且使⽤的是80端⼝,所以可以不需要带上端⼝
// 本地前后端联调时,使⽤localhost,那边会返回终端ip⽆效
//var host = "127.0.0.1:8080";
mysql的jar包下载// 上线时改成下⾯
var host = "Nginx所在ECS的公⽹ip:端⼝号";
3、远程连接ECS_4上的MySQL,新建数据库并导⼊数据
这⾥主要使⽤ Navicat 操作就可以了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论