上节课我们从会议系统本身的基础配置出发,系统讲解并演示了会议系统部署到线上后云服务器需要注意的点,以及信令服务、流媒体服务、WebRTC
网关服务、网络穿透服务如何配置在前端项目中,同时我们也实际操作,将信令服务和会议系统前端文件结合通过 Nginx
映射到指定的域名,并让其支持HTTPS
访问。
这节课,我们的核心是会议服务容器化,容器化对于现在云原生时代而言是必要的,通过容器我们可以更方便的管理和迁移我们的各种服务。
基础服务容器化
首先从信令服务出发,将信令服务容器化。容器化的方式我们则通过 Docker 容器来承载基础服务,那么第一步应该是制作特定的Dockerfile
文件。
Dockerfile
文件是自有服务制作 Docker 镜像的核心文件,我们现在用到的 Docker 镜像都离不开该文件。
- 第一行:信令服务需要依赖
Node
环境,因此我们的基准镜像选择node:14.21.0-buster
。 - 第二行:需要注意的是时区,如果当前服务依赖对时间有严格要求的,请注意时区配置。
Docker
容器默认时区是 UTC ,此时如果获取服务器时间则比北京时间少8小时。 - 第三行:
CMD
表示自定义的命令,这里我输出的是一段话。 - 第四行:拷贝文件夹到容器内部。我们所有的核心
服务
就是这个文件夹,因此需要将这些文件拷贝到镜像中去,后面根据镜像启动容器的时候才可以找到对应的服务
。 - 第五行:设置工作空间,即容器默认启动的工作目录。
- 第六行:
ENTRYPOINT
,容器启动后需要执行的命令。这个命令只有在启动容器的时候才会执行,构建镜像的时候不会。
FROM node:14.21.0-buster
ENV TZ=Asia/Shanghai
CMD "echo 信令服务器启动 dist目录为音视频前端目录,请使用nginx代理后访问,代理前端口:18080"
COPY ./server /server
WORKDIR /server
ENTRYPOINT ["node", "/app.js"]
整体目录
构建 Docker 镜像
# 在Dockerfile文件同目录执行下面语句 -t 表示指定的标签+版本号 ;不要网络后面那个点
root@VM-4-3-ubuntu:/home/ubuntu/suke-nrtc# docker build -t suke-media-nrtc:2.0 .
Sending build context to Docker daemon 70.83MB
Step 1/6 : FROM node:14.21.0-buster
---> bd24482b8c86
Step 2/6 : ENV TZ=Asia/Shanghai
---> Using cache
---> 1331b3ea89ea
Step 3/6 : CMD "echo 信令服务器启动 dist目录为音视频前端目录,请使用nginx代理后访问,代理前端口:18080"
---> Using cache
---> 1a642db0ce12
Step 4/6 : COPY ./server /server
---> Using cache
---> c0e2a8a0009e
Step 5/6 : WORKDIR /server
---> Using cache
---> dfcf81c0644c
Step 6/6 : ENTRYPOINT ["node", "app.js"]
---> Using cache
---> b0ddd996a31d
Successfully built b0ddd996a31d
Successfully tagged suke-media-nrtc:2.0
构建完成后启动容器
--name
:指定容器名称;--restart
:自动重启,比如服务器关机重启后,容器会自动重启;-p: 宿主机端口:容器内部服务暴露端口
;最后面参数为上一步构建的镜像+版本
。
sudo docker run -d --name suke-media-nrtc --restart=always -p 18080:18080 suke-media-nrtc:2.0
前后端分离容器化部署
上一步容器化部署是将会议前端和信令服务结合一起部署的,但是有些人并不想前端和后端信令服务绑定到一起,因此就需要拆分部署,也就是所谓的前端和后端分离部署,这个时候就需要用到Nginx
了。
我们先大体上梳理下,前后分离部署的基础步骤:
本质上和基础服务容器化一样,都是制作自己的镜像,接下来我们按照上图中的内容步骤制作我们自己的镜像。
- 准备 Nginx 配置文件
nginx.conf
。
server_name
绑定自己的域名即可。注意下面的两个路径
/usr/web/nginx/ssl
、/usr/web/nginx/html
,一个是SSL
证书位置,一个是前端静态文件夹。
/signal-api/
为Nginx
代理路径。被代理的服务地址:proxy_pass http://x.x.x.x;
。
server {
listen 19003 ssl;
server_name localhost;
client_max_body_size 1024M;
ssl_certificate /usr/web/nginx/ssl/cert.crt;
ssl_certificate_key /usr/web/nginx/ssl/private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
root /usr/web/nginx/html;
index index.html index.htm;
}
location /signal-api/ {
proxy_pass http://x.x.x.x:18088; # 信令服务地址配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- 制作镜像基准文件 Dockerfile。
# 基准镜像
FROM nginx
# 拷贝前端资源
COPY ./dist /usr/web/nginx/html/
# 拷贝SSL证书
COPY ./ssl /usr/web/nginx/ssl/
# 拷贝 nginx配置文件
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 声明暴露端口
EXPOSE 19003
- 修改会议前端
Prod
环境信令服务地址。
Vue.prototype.$serverSocketUrl = process.env.NODE_ENV === 'development' ? 'ws://127.0.0.1:18080' : '/signal-api/'
- 准备好上述文件开始构建镜像。
# Dockerfile 所在目录执行命令 注意看下图
docker build -t test-online-meeting:1.0.2 .
- 启动容器。
# 这里 --rm 为 停止后自动删除退出容器 仅用于测试 正式部署去掉--rm 并使用 -d 后台进程执行
# 19003 为前面声明的 Nginx 配置文件中的端口,同时宿主机端口也是19003 【-p 宿主机端口:容器内服务端口】
docker run --rm -p 19003:19003 test-online-meeting:1.0.2
这里SSL
证书为自签名测试证书,因此浏览器不信任,不过可以继续访问。正式环境请使用443端口
+域名的正式SSL
证书。
注意事项
前后端分离部署后,对于服务管理和迁移虽然方便了很多,而且所有的过程仅需要脚本就能自动化部署,搭配现有的各种自动化工具也是很方便的,比如 Jenkins、k8s、k3s 等,但是对于不熟悉的人而言会遇到很多问题。
nginx
路径配置问题。这个算是前后端分离部署后所有项目必须要解决的一个问题,不仅仅是我们的会议系统。比如我前面配置的location /signal-api/ {}
信令服务路径,那么你在前端线上环境也要同步做出更改,否则前端无法找到对应的 API 接口服务。- 端口映射问题。
nginx
暴露端口必须要在启动容器的时候映射出去,否则服务无法访问。 - 静态资源频繁变更问题。上面我们一开始就将静态资源打到镜像里面了,这种方法对于频繁更改的文件而言并不是很友好,因此我们可以优化下,将静态资源通过动态挂载的方式绑定到宿主机文件系统中。
# /home/html/dist 为宿主机文件位置 /usr/web/nginx/html/为容器内nginx映射的资源位置。
docker run --rm -p 19003:19003 -v /home/html/dist:/usr/web/nginx/html/ test-online-meeting:1.0.2
最后
在实际的企业应用部署中,大多数服务部署都和这两节部署实战课所讲的方式大同小异,希望学完部署实战的内容,不仅仅对于我们自身会议系统的部署有所帮助,对于大家在实际工作中所有的服务部署都能起到推进作用。
这节课是我们课程的最后一节,从第一节的基础知识,到使用WebRTC
打造三种架构直播会议系统实战,再到系统的部署实战,我们算是从 0 到 1 系统性地熟悉了 WebRTC
这门技术,这也算是目前为止全网第一本将WebRTC
+各种开源流媒体组合打造多样性应用的课程,希望这节课仅仅是本课程的最后一节,更是你开启前端音视频的第一节课,是大家将技术带入实际工作的第一节课。
加油!我们共同进步,后续有任何疑问评论区或者社群大家一起交流。课程会停止,但是技术会一直迭代更新,而我们更需要持续的进步。