前言
1、这个Demo的后端主要是使用SpringBoot整合了微信授权和微信网站扫码支付,前端页面主要使用了Bootstrap和JQuery。网址:http://wechatpay.ysqorz.top/(不保证长期有效)
2、下面是【理论上】项目部署的架构图,事实上我比较穷,买不起这么多ECS,所以实际上部署时我只用了两台ECS。本博客会按照下面这张架构图介绍用Linux命令实现多节点集群部署。看起来蛮简单的,但我在实际操作部署时遇到奇奇怪怪的错误蛮多的。
3、本博客的食用人群,对SpringBoot和Linux有了解,对云服务器有了解(比如说:安全组...),不需要很深入。另外MySQL、Nginx等安装我统一使用Docker,原因是镜像随拉随用,容器配置坏了随时删除重装。食用者需要对Dokcer有了解。看完这篇博客就差不多了。https://blog.csdn.net/qq_43290318/article/details/107743188
目录
1、将SpringBoot项目打成jar包,并推送到ECS_2和ECS_3并运行
环境安装
1、首先在ECS_1和ECS_4上安装Docker
参考博客:https://blog.csdn.net/qq_43290318/article/details/107743188
2、在ECS_2和ECS_3上安装JDK
# 检查当前系统是否已安装JDK
yum list installed | grep java
# 查看当前所使用的JDK版本
java -verision
# 如果想卸载当前系统的所有JDK
yum -y remove java-*-openjdk*
yum -y remove tzdata-java.noarch
# 安装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/nginx/nginx.conf
虚拟主机的配置文件:/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 -Dmaven.test.skip=true
注意,在打jar包之前,我们可以不需要特意修改配置文件application.yml。我们可以另外复制一份,把相关配置改成上线使用的配置,连同jar包一起推到云服务器上。然后在云服务器上运行jar包时,可以指定新的配置文件。
# 指定另外的配置文件application.yml,运行jar包
# 以下命令基于application.yml和jar包处于同一目录下
java -jar ***.jar --Dspring.config.location=application.yml
上述命令是在前台运行jar包,会占用终端。按 ctrl + c 停止进程退出。
在测试时,可以这样做,可以看控制台输出。
# 在确保运行正常之后,以守护进程的方式后台启动并运行
nohup java -jar ***.jar --Dspring.config.location=application.yml &
# 查看守护进程的日志输出(实时的)
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/nginx/nginx.conf
在http闭包中,添加以下配置:
# 配置多节点集群
# lbs是自定义的集群名称,后面会用到
# 端口是jar包(项目)运行后占用的端口
upstream lbs {
server ECS_2的公网ip:端口;
server ECS_3的公网ip:端口;
}
(3)修改虚拟主机的配置文件,配置请求分发策略
这里我直接使用Nginx默认的80端口,不另外配置虚拟主机。
# 建议做好备份,方便以后配置其他虚拟主机
vim /etc/nginx/conf.d/default.conf
# 配置请求分发策略
# 凡是请求的路径为/api/的,都会负载均衡地分配到集群lbs的任一节点
# 转发策略可以配置,下面采用默认策略
location /api/ {
proxy_pass http://lbs;
proxy_redirect default;
}
# 注意修改配置后需要重启Nginx容器,让配置生效
# 从容器内部退出
exit
docker restart 容器id或容器名称
(4)修改静态资源中有关接口请求的路径,指向Nginx
我上面的部署,由于Nginx在ECS_1上,且使用的是80端口,所以可以不需要带上端口
// 本地前后端联调时,使用localhost,微信那边会返回终端ip无效
//var host = "http://127.0.0.1:8080";
// 上线时改成下面
var host = "Nginx所在ECS的公网ip:端口号";
3、远程连接ECS_4上的MySQL,新建数据库并导入数据
这里主要使用 Navicat 操作就可以了。