目录

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

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

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


前言

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

0.1 虚拟机安装

ubuntu22.04下载,下载地址:https://releases.ubuntu.com/jammy/。进⼊后完成如下操作:
https://i-blog.csdnimg.cn/direct/1ad7ad58a34b435c943c17e1975f87e4.png

0.2 virtualbox

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

直接安装在默认目录吧
https://i-blog.csdnimg.cn/direct/aafb8f4b0d9b491e9403e16d3d8e1579.png

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

https://i-blog.csdnimg.cn/direct/fbc7f5d587fd417596de3a72721a3470.png

设置⽤⼾名、密码

https://i-blog.csdnimg.cn/direct/e83fc2a62d08460c95dab12e835c1d5b.png

https://i-blog.csdnimg.cn/direct/bde5aacf0cf340b4b5156b94c2c09536.png

0.3 虚拟机⽹络设置

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

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

https://i-blog.csdnimg.cn/direct/0995df1694974071a91289f4e00c6f22.png
选择⽹络分别设置以下三种⽹络连接⽅式:(记得虚拟机要关机)
• ⽹络地址转换
• 桥接⽹卡
• 仅主机(Host-Only)⽹络
https://i-blog.csdnimg.cn/direct/ac9be68e4780476a839ffa6c75d04759.png
https://i-blog.csdnimg.cn/direct/7b561c64886e45b791c527c0970a1300.png
https://i-blog.csdnimg.cn/direct/d778cd8d9bff4e8b8415805ca08747ce.png
设置好之后,重新启动虚拟机。

  1. 查看⼦⽹掩码和⽹关IP
    查看仅主机(Host-Only)⽹络⼦⽹掩码和⽹关IP。
    https://i-blog.csdnimg.cn/direct/954db916106c4d29ac55230b09bf91aa.png
    https://i-blog.csdnimg.cn/direct/ec3958bc022848a58bef8daefab3b749.png
    设置虚拟机固定内⽹IP
    https://i-blog.csdnimg.cn/direct/0b234f7a434a4ba3b8a1d3da94549893.png
    https://i-blog.csdnimg.cn/direct/5731555c48134bda8ba60b22914809ab.png
    https://i-blog.csdnimg.cn/direct/fd46142695364a5aa54428e98a6c167b.png

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

#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

卸载旧版本

sudo apt-get remove docker \
               docker-engine \
               docker.io

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

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

sudo apt-get update

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

添加软件源的 GPG 密钥

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 软件源

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

安装

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

启动docker

sudo systemctl enable docker
sudo systemctl start docker

0.5 配置aliyun镜像加速器

这个是安装docker的
这个是加速的
申请阿里云镜像加速器
按照这一页进行配置就可以了

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

校验

docker --version
docker compose version

但是当前仅支持阿里云用户使用具备公网访问能力的阿里云产品进行镜像加速,且仅限于特定范围内的容器镜像。详情请见公告。
由于运营商网络问题,拉取 Docker Hub 镜像可能会变慢。
建议手动拉取镜像到本地节点并重启Pod,也可上传镜像至 ACR 或使用订阅海外源镜像功能,再从 ACR 拉取对应镜像。

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

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地址不会直接暴露给外部服务器。
◦ 缓存:如果代理服务器具有缓存功能,那么对于频繁请求的数据,可以直接从缓存中返回结果,提⾼响应速度。
◦ 内容过滤:组织或企业可以使⽤正向代理对员⼯的上⽹⾏为进⾏监控或者过滤不合适的⽹站内容。

https://i-blog.csdnimg.cn/direct/bc593c8db0434db6ad61f0097a40f0be.png
意思就是代理服务器在客户端

1.2 反向代理

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

反向代理则是指客⼾端直接访问的服务器实际上是⼀个代理服务器(注意代理服务器在服务器端配置),这个代理服务器接收客⼾端的请求后,会将请求转发给真正的后端服务器。客⼾端本⾝是不知道这个代理服务器存在的。反向代理的应⽤场景包括:
◦ 负载均衡:通过反向代理可以在多个后端服务器之间分配请求,以分散单个服务器的压⼒。这个也是我们下⼀个要讲到的功能。
◦ 安全性:隐藏真实的后端服务器地址,增加了⼀层安全防护。
◦ 缓存与加速:类似于正向代理,反向代理也可以实现缓存功能,减少后端服务器的负载并加快响应速度。
https://i-blog.csdnimg.cn/direct/b57b693793f645bdae33d1d111c0e456.png

1.3 负载均衡

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

https://i-blog.csdnimg.cn/direct/2f57d6a025114c958ebe949b05b8203d.png

那假如我们增加了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直接来处理⽆需后端服务器介⼊。这样可以减轻后端服务器的负载,使其专注于处理动态内容,从⽽提⾼整体性能。并且们还可以根据 静态资源 的特点将其做缓存操作,以提⾼资源的响应速度。如下图所⽰:动态资源和静态资源的处理是分开的。

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

1.5 安装

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

https://i-blog.csdnimg.cn/direct/469f3f4524f84fabbe67188855d76dae.png

1.6 测试

nginx配置⽂件在什么位置?

◦ 主配置⽂件: /etc/nginx/nginx.conf
◦ 附加配置⽂件:在 /etc/nginx/conf.d/ ⽬录下,已经默认给我们提供了⼀个附加配置⽂
件: /etc/nginx/conf.d/default.conf ,在主配置⽂件中会引⼊附加配置⽂件,如
下。这样也就意味着nginx的完整的配置应该是主配置⽂件+附加配置⽂件。
https://i-blog.csdnimg.cn/direct/035f09c4eeb041038944d38958991e25.png
如何修改nginx配置⽂件?

推荐(不是必须):你应该尽可能使⽤ /etc/nginx/conf.d/default.conf 或其他在
/etc/nginx/conf.d/ ⽬录下的附加配置⽂件来添加或修改你的 Nginx 配置,⽽不是直接
编辑 /etc/nginx/nginx.conf ⽂件。这样做可以保持主配置⽂件的清晰和整洁,并使得
配置更易于管理和维护。
◦ 注意:修改配置之后,还需要通过重载 Nginx 来应⽤更改:

nginx -s reload

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

docker restart [容器名称或ID]命令

或者直接点击按钮,restart

1.7 测试

测试friend

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

怎么测速负载均衡呢–》多台服务才行
要多个friend
https://i-blog.csdnimg.cn/direct/220112d905a84ed78702843fd4d96ca8.png
https://i-blog.csdnimg.cn/direct/849b727b1f114d6583370b2cbaf223a9.png
点击修改选项,允许多个实例
https://i-blog.csdnimg.cn/direct/ca51817c5bd1403b8325ada8e6c06aed.png
我们先启动第一个服务
然后启动这个新的,启动这个新的之前要把nacos配置端口号19202
https://i-blog.csdnimg.cn/direct/4189b3ebfc3c493b936201bd2eabcee2.png
这样就成功了
然后是nginx配置

我们修改配置文件default.conf

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。

https://i-blog.csdnimg.cn/direct/5db1bb9574444bc795aa4010796681b3.png
我们请求很多次
我们这个的负载均衡策略是轮询的
https://i-blog.csdnimg.cn/direct/10de217e38dd40a2bd79a948604f37a1.png
发现打印的数量是相当的
第二个策略是加权的

    upstream ckoj {
        server 192.168.250.155:9202 weight=1;
        server 192.168.250.155:19202 weight=2;
    }

这样就可以了

然后保存文件重启

https://i-blog.csdnimg.cn/direct/9ce2b12fc1d64acb9252e875ef351c07.png
https://i-blog.csdnimg.cn/direct/90a9b950aa6846cd8242fd761730130b.png
发现打印的数量也是正确的

upstream bitoj {
 server 本机ip:9201;
 server 本机ip:9301;
 ip_hash;
}
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服务

我们在项目上创建一个部署的文件
https://i-blog.csdnimg.cn/direct/2cb89743814c41a0a81e045771c94235.png
默认把jar包存入ckoj-jar,还有dockerfile文件、
https://i-blog.csdnimg.cn/direct/dbfb5839865b4dd2b05b520057ba1e8f.png

每个小目录下面有自己的jaar包和dockerfile文件
https://i-blog.csdnimg.cn/direct/e98783276f8b4c2f83bcb364d923abe3.png
这些存的就是这些组件需要的文件

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

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

https://i-blog.csdnimg.cn/direct/219b4b07fc264a8d86a5e87a1dff27f3.png

https://i-blog.csdnimg.cn/direct/a084842cb4c442dd853434fa67ccd055.png
default.conf是nginx的配置文件
sh存储的是部署的脚本

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

https://i-blog.csdnimg.cn/direct/8d91c8c17760473da795e0eb77c32972.png
https://i-blog.csdnimg.cn/direct/494e4c56178f462aaa4d3cc40262869a.png

然后是脚本的内容

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

ip addr show docker0

https://i-blog.csdnimg.cn/direct/fd6ff6afe185483fbbdd75bab0071b15.png
所以到时候我们就要用这个地址和docker进行连接
配置参数–》远程访问打开

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这个就可以了

https://i-blog.csdnimg.cn/direct/2008a1a7437c462e8534a2b0e0d94d6a.png
重启服务

systemctl daemon-reload
service docker restart

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

总结