微服务的编程测评系统20-虚拟机-nginx-部署

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • [0. 虚拟机安装/配置流程](#0. 虚拟机安装/配置流程)
    • [0.1 虚拟机安装](#0.1 虚拟机安装)
    • [0.2 virtualbox](#0.2 virtualbox)
    • [0.3 虚拟机⽹络设置](#0.3 虚拟机⽹络设置)
    • [0.4 安装docker](#0.4 安装docker)
    • [0.5 配置aliyun镜像加速器](#0.5 配置aliyun镜像加速器)
  • [1. nginx](#1. nginx)
    • [1.1 正向代理](#1.1 正向代理)
    • [1.2 反向代理](#1.2 反向代理)
    • [1.3 负载均衡](#1.3 负载均衡)
    • [1.4 动静分离](#1.4 动静分离)
    • [1.5 安装](#1.5 安装)
    • [1.6 测试](#1.6 测试)
    • [1.7 测试](#1.7 测试)
  • [2. 项目部署](#2. 项目部署)
    • [2.1 开启docker远程访问](#2.1 开启docker远程访问)
  • 总结

前言

0. 虚拟机安装/配置流程

0.1 虚拟机安装

ubuntu22.04下载,下载地址:https://releases.ubuntu.com/jammy/。进⼊后完成如下操作:

0.2 virtualbox

下载安装virtualbox,下载地址如下,点击即可完成下载。

https://download.virtualbox.org/virtualbox/7.0.18/VirtualBox-7.0.18-162988-Win.exe

直接安装在默认目录吧

点击新建按钮,填写名称,选择⽂件夹和Ubuntu的iso镜像⽂件。点击下⼀步

不勾选跳过⾃动安装,Ubuntu会按照默认配置⾃动安装,选中则进⾏⾃定义安装。

设置⽤⼾名、密码

配置内存,CPU等信息。此处设置2核4G。资源充⾜建议8G以上。(挑战项⽬部署建议8g以上)

配置硬盘等信息。此处配置60GB

新建的虚拟电脑信息总览⻚⾯。点击完成,会进⼊到ubuntu的安装⻚⾯

配置ubuntu账号密码等信息

我设置的username是ck

password是ck@123

点击 Continue 之后,会⾃动完成安装。安装完成后,会进⼊Ubuntu桌⾯,如下图

0.3 虚拟机⽹络设置

安装完成之后,关闭虚拟机进⾏⽹络设置。

  1. ⽹络设置
    选中⽬标虚拟机,点击设置:

选择⽹络分别设置以下三种⽹络连接⽅式:(记得虚拟机要关机)

• ⽹络地址转换

• 桥接⽹卡

• 仅主机(Host-Only)⽹络


设置好之后,重新启动虚拟机。

  1. 查看⼦⽹掩码和⽹关IP
    查看仅主机(Host-Only)⽹络⼦⽹掩码和⽹关IP。


    设置虚拟机固定内⽹IP


安装完成后,重启服务器,开启ssh服务

java 复制代码
#1. 修改root密码
sudo passwd root
#2. 切换为root
su
#3. 安装ssh服务
apt update
apt install openssh-server vim bash-completion -y
#4. root开启⽀持远程登录
vi /etc/ssh/sshd_config
# 调整配置⽂件值如下
PermitRootLogin yes
# 重启服务
systemctl restart ssh

按Ctrl Alt F3,启动终端

这样以后就可以用ssh来连接了

0.4 安装docker

卸载旧版本

java 复制代码
sudo apt-get remove docker \
               docker-engine \
               docker.io

安装docker(鉴于国内网络问题,此处使用国内源安装)

添加使用 HTTPS 传输的软件包以及 CA 证书

java 复制代码
sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

添加软件源的 GPG 密钥

java 复制代码
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

向 sources.list 中添加 Docker 软件源

java 复制代码
echo \  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装

java 复制代码
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

启动docker

java 复制代码
sudo systemctl enable docker
sudo systemctl start docker

0.5 配置aliyun镜像加速器

https://developer.aliyun.com/article/110806这个是安装docker的

https://cr.console.aliyun.com/cn-shanghai/instances/mirrors这个是加速的

申请阿里云镜像加速器

按照这一页进行配置就可以了

java 复制代码
sudo systemctl daemon-reload 使配置生效
sudo systemctl restart docker 重启docker
java 复制代码
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["***********************"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

校验

java 复制代码
docker --version
docker compose version

但是当前仅支持阿里云用户使用具备公网访问能力的阿里云产品进行镜像加速,且仅限于特定范围内的容器镜像。详情请见公告。

由于运营商网络问题,拉取 Docker Hub 镜像可能会变慢。

建议手动拉取镜像到本地节点并重启Pod,也可上传镜像至 ACR 或使用订阅海外源镜像功能,再从 ACR 拉取对应镜像。

所以我们要用这个来加速,因为使用阿里云的这个加速的话,必须得是阿里云的云服务器

java 复制代码
vim /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://dockerhub.azk8s.cn",
    "https://mirror.ccs.tencentyun.com",
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.1panel.live",
    "https://atomhub.openatom.cn/",
    "https://hub.uuuadc.top",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://docker.ckyl.me",
    "https://docker.awsl9527.cn"
  ]
}
sudo systemctl daemon-reload
sudo systemctl restart docker

1. nginx

官网

Nginx 是⼀个⾼性能的 HTTP 和反向代理 Web 服务器。它的主要功能包括反向代理、负载均衡和动静分离等。正因为 Nginx 的这些功能能够为系统带来性能和安全⽅⾯的诸多优势,我们在项⽬部署时需要引⼊ Nginx 组件。接下来我们会逐⼀向⼤家介绍nginx的核⼼功能。

1.1 正向代理

正向代理通常是指客⼾端(如浏览器)通过代理服务器来访问互联⽹上的其他服务器。在这种情况下,客⼾端配置了代理设置(注意这个代理是在客⼾端配置的),所有对外的请求都会先发送到代理服务器上,再由代理服务器转发到真正的⽬标服务器。这样做的好处包括但不限于:

◦ 隐私保护:客⼾端的真实IP地址不会直接暴露给外部服务器。

◦ 缓存:如果代理服务器具有缓存功能,那么对于频繁请求的数据,可以直接从缓存中返回结果,提⾼响应速度。

◦ 内容过滤:组织或企业可以使⽤正向代理对员⼯的上⽹⾏为进⾏监控或者过滤不合适的⽹站内容。

意思就是代理服务器在客户端

1.2 反向代理

这个代理服务器就是在服务端了

反向代理则是指客⼾端直接访问的服务器实际上是⼀个代理服务器(注意代理服务器在服务器端配置),这个代理服务器接收客⼾端的请求后,会将请求转发给真正的后端服务器。客⼾端本⾝是不知道这个代理服务器存在的。反向代理的应⽤场景包括:

◦ 负载均衡:通过反向代理可以在多个后端服务器之间分配请求,以分散单个服务器的压⼒。这个也是我们下⼀个要讲到的功能。

◦ 安全性:隐藏真实的后端服务器地址,增加了⼀层安全防护。

◦ 缓存与加速:类似于正向代理,反向代理也可以实现缓存功能,减少后端服务器的负载并加快响应速度。

1.3 负载均衡

为了避免单点故障或者现有的请求使服务器压⼒太⼤⽆法承受,所有我们需要搭建⼀个服务器集群(如上图所⽰服务端有多个服务器),将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将"负载"均衡的分发到不同的服务器,也就是我们所说的负载均衡。

那假如我们增加了A、B、C、D等等多台服务器,我们需要把请求分给这些服务器,但是每个服务器也有⾃⼰的不同,性能也可能不均,所以怎么分?如何分配更好?⼜是⼀个问题。nginx提供了⼏种算法来解决这个问题:

  1. • 轮询法(默认法)

    ◦ 每个请求按时间顺序逐⼀分配到不同的后端服务器。

    ◦ 适合服务器配置相当,性能⽆差异的情况。

  2. • weight (权重模式,加权轮询)

    ◦ 指定轮询⼏率, weight 和 访问⽐率 成正⽐,⽤于后端服务器性能不均的情况。

    ◦ 这种⽅式⽐较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利⽤资源。 weight 和 访问⽐率 成正⽐,权重越⾼,在被访问的概率越⼤

  3. ip_hash

    ◦ 请求通过哈希算法,⾃动定位到该服务器。每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问⼀个后端服务器

  4. 最少连接(least_conn)

    ◦ nginx 会统计每个后端服务器当前的活动连接数,当有新的请求到来时,将请求分配到活动连接数最少的服务器上。

    ◦ 能够根据服务器的实际负载情况动态地分配请求,将新请求分配到当前连接数最少的服务器上,避免某些服务器负载过⾼⽽其他服务器负载过低的情况。

1.4 动静分离

动:动态资源。 动态资源指的是通过请求服务器获取到的资源。

静:静态资源。静态资源指的是不需要通过请求服务器就可以得到的资源。如: css 、html 、 jpg 、 js 等⽂件)。

这些静态资源既然⽆需服务器处理,则可以由nginx直接来处理⽆需后端服务器介⼊。这样可以减轻后端服务器的负载,使其专注于处理动态内容,从⽽提⾼整体性能。并且们还可以根据 静态资源 的特点将其做缓存操作,以提⾼资源的响应速度。如下图所⽰:动态资源和静态资源的处理是分开的。

总结:

在本地开发时,我们通常⽆需使⽤nginx。因为本地开发的时候我们专注于业务功能的实现。然⽽,⼀旦项⽬开发完成,并准备部署到服务器上,我们就需要考虑性能、安全等⼀系列的问题这个时候我们就需要部署nginx,以构建⼀个完整且稳定的运⾏环境。

1.5 安装

java 复制代码
#拉取nginx镜像
docker pull nginx:1.21
#启动nginx容器
docker run --name oj-nginx -d -p 5413:80 nginx:1.21

1.6 测试

nginx配置⽂件在什么位置?

◦ 主配置⽂件: /etc/nginx/nginx.conf

◦ 附加配置⽂件:在 /etc/nginx/conf.d/ ⽬录下,已经默认给我们提供了⼀个附加配置⽂

件: /etc/nginx/conf.d/default.conf ,在主配置⽂件中会引⼊附加配置⽂件,如

下。这样也就意味着nginx的完整的配置应该是主配置⽂件+附加配置⽂件。

如何修改nginx配置⽂件?

推荐(不是必须):你应该尽可能使⽤ /etc/nginx/conf.d/default.conf 或其他在

/etc/nginx/conf.d/ ⽬录下的附加配置⽂件来添加或修改你的 Nginx 配置,⽽不是直接

编辑 /etc/nginx/nginx.conf ⽂件。这样做可以保持主配置⽂件的清晰和整洁,并使得

配置更易于管理和维护。

◦ 注意:修改配置之后,还需要通过重载 Nginx 来应⽤更改:

java 复制代码
nginx -s reload

我们是通过docker安装的nginx,也可以直接重启nginx服务

java 复制代码
docker restart [容器名称或ID]命令

或者直接点击按钮,restart

1.7 测试

测试friend

java 复制代码
@RestController
@RequestMapping("/test/nginx")
@Tag(name = "nginx测试接口")
@Slf4j
public class NginxTestController {
    @GetMapping("/info")
    public R<Void> info( ){
        log.info("nginx测试");
        return R.ok();
    }
}

怎么测速负载均衡呢--》多台服务才行

要多个friend

点击修改选项,允许多个实例

我们先启动第一个服务

然后启动这个新的,启动这个新的之前要把nacos配置端口号19202

这样就成功了

然后是nginx配置

我们修改配置文件default.conf

java 复制代码
server{
    location /ckoj-dev/ {
            proxy_pass http://ckoj/;
    }
}


    upstream ckoj {
        server 192.168.250.155:9202 ;
        server 192.168.250.155:19202 ;
    }

记得保存,然后重启

然后cmd查询本机ip:ipconfig

局域网中的内网 IP 地址通常显示在 "无线局域网适配器" 或 "以太网适配器" 下的 "IPv4 Address" 处。

给nginx配置我们有哪些服务器

这⾥我们需要增加两处配置。第⼀处我们需要增加upstream⽤来配置后端服务器组,其实这个服务器组就是我们请求动态资源时,请求的后端服务器的ip和端⼝。第⼆处是在server块当中增加location ⽤来配置所有以 /ckoj-dev/ 开头的请求都代理到我们 upstream 中配置的服务器组当中。修改完配置之后记得重启nginx容器或者重载 nginx。

测试地址http://localhost:5413/ckoj-dev/test/nginx/info

为什么访问地址是这个?原因是我们测试需要通过nginx调⽤这个接⼝⽽不是直接调⽤,这样才能测试处负载均衡反向代理的效果。加上我们在nginx配置⽂件中进⾏了配置以 /bitoj-dev/ 开头的请求都代理到我们 upstream 中配置的服务器组当中。实际上请求的地址会变成http://localhost:9202/test/nginx/info 或者http://localhost:19202/test/nginx/info。

我们请求很多次

我们这个的负载均衡策略是轮询的

发现打印的数量是相当的

第二个策略是加权的

java 复制代码
    upstream ckoj {
        server 192.168.250.155:9202 weight=1;
        server 192.168.250.155:19202 weight=2;
    }

这样就可以了

然后保存文件重启


发现打印的数量也是正确的

java 复制代码
upstream bitoj {
 server 本机ip:9201;
 server 本机ip:9301;
 ip_hash;
}
java 复制代码
upstream bitoj {
 server 本机ip:9201;
 server 本机ip:9301;
 least_conn;
}

这两个就是另外的两个策略,一个ip_hash,一个least_conn

2. 项目部署

先安装docker和docker compose

服务器职责划分

完成安装之后,在上⾯的内容中我们提到需要两台服务器,接下来我们先⼀起了解下这两台服务器的职责:

◦ 服务器1:

▪ 组件:nginx、nacos、mysql、redis、elasticsearch、rabbitMQ

▪ 服务:gateway服务、system服务、friend服务、judge服务、job服务

◦ 服务器2:

▪ 服务:gateway服务、system服务、friend服务、judge服务、job服务

我们在项目上创建一个部署的文件

默认把jar包存入ckoj-jar,还有dockerfile文件、

每个小目录下面有自己的jaar包和dockerfile文件

这些存的就是这些组件需要的文件

在test⽬录下为项⽬所以依赖的每⼀个组件创建对应⽬录,⽤于存储这些组件的部署时的相关配置⽂件、数据⽂件或其它相关⽂件

在nginx 组件的⽬录下创建⼀个名为 dist 的⽬录,⽤于存放前端资源(我们上次介绍nginx动静分离的时候提到的静态资源)由于前端项⽬分为 B 端和 C 端,因此在 dist ⽬录内还需分别创建 oj-fe-b(B 端)和 oj-fe-c(C 端)两个⼦⽬录,将B端和C端的静态资源分开存放

default.conf是nginx的配置文件

sh存储的是部署的脚本

部署时需要对后端服务进⾏打包,但是打包之后jar包存放在不同服务所在的⽬录下。这样对我们后期部署操作来讲很不⽅便。所以我们可以在sh⽬录下创建copy.ps1⽂件,⽤于将后端jar包统⼀存储到上⾯创建的bitoj-jar⽬录下,便于⾯部署⼯作。.ps1是 PowerShell脚本⽂件的扩展名,这种⽂件我们需要在Windows PowerShell中执⾏。


然后是脚本的内容

java 复制代码
rm ../ckoj-jar/gateway/oj-gateway.jar
rm ../ckoj-jar/friend/oj-friend.jar
rm ../ckoj-jar/job/oj-job.jar
rm ../ckoj-jar/judge/oj-judge.jar
rm ../ckoj-jar/system/oj-system.jar
copy ../../../oj-gateway/target/oj-gateway-1.0.jar ../ckoj-jar/gateway/oj-gateway.jar
copy ../../../oj-modules/oj-judge/target/oj-judge-1.0-SNAPSHOT.jar
../ckoj-jar/judge/oj-judge.jar
copy ../../../oj-modules/oj-friend/target/oj-friend-1.0-SNAPSHOT.jar
../ckoj-jar/friend/oj-friend.jar
copy ../../../oj-modules/oj-job/target/oj-job-1.0-SNAPSHOT.jar ../ckoj-jar/job/oj-job.jar
copy ../../../oj-modules/oj-system/target/oj-system-1.0-SNAPSHOT.jar
../ckoj-jar/system/oj-system.jar
pause

这个脚本的理解成本也不⾼,将原来bitoj-jar⽬录下的jar包先清空掉,然后再将新打包好的后端服务jar包移动到bitoj-jar⽬录下。(我们先将脚本准备好,等到需要执⾏的时候执⾏。)

和我们在本地创建的⼯作⽬录对应,在本地我们准备好的⽤⼾部署的⽂件将来都要上传到服务器中,⽤于项⽬部署。服务器上也创建对应的目录ckoj来专门存储这些文件

2.1 开启docker远程访问

在我们的项⽬中,judge 服务需要调⽤ Docker API,因此必须与 Docker 建⽴连接。这要求通过 IP 地址进⾏连接。由于我们计划使⽤ docker0 桥接⽹络的 IP 地址来进⾏调⽤,所以需要先开启 Docker 的远程配置。

查看docker0ip

java 复制代码
ip addr show docker0

所以到时候我们就要用这个地址和docker进行连接

配置参数--》远程访问打开

java 复制代码
vi /lib/systemd/system/docker.service
找到ExecStart 开头的配置,注释原配置 进⾏备份
插⼊以下内容
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always

就是加上-H tcp://0.0.0.0:2375这个就可以了

重启服务

java 复制代码
systemctl daemon-reload
service docker restart

到此我们就完成了项⽬部署前的所有准备⼯作,接下来我们正式进⼊到项⽬部署阶段。

总结

相关推荐
云雾J视界3 小时前
百万级并发下的微服务架构设计之道:从阿里双11看分布式系统核心原则与落地实践
分布式·微服务·云原生·架构
望获linux3 小时前
【Linux基础知识系列:第一百一十六篇】使用mt进行磁带驱动管理
java·linux·运维·服务器·数据库·windows·嵌入式软件
品牌AI前线4 小时前
Few-Shot Prompting 实战:用5个例子让GPT-4学会复杂任务
服务器·数据库·人工智能
小毛驴8504 小时前
maven 常用指令
java·数据库·maven
YoungUpUp4 小时前
【SQL Server 2022】保姆级SQL Server 详细图文下载安装教程
数据库·sql·sqlserver·sql server·sql server数据库·sql server 2022·sql 数据库
知彼解己5 小时前
Redis 集群模式与高可用机制
数据库·redis·缓存
GBASE5 小时前
GBASE南大通用政企行业案例-国家电网公司“网上国网”项目
数据库
GBASE5 小时前
DB-Engines数据库排行榜9月榜单速递
数据库
IvorySQL5 小时前
PostgreSQL 中唯一索引的工作原理
数据库·postgresql