Skip to content

上节课我们从会议系统本身的基础配置出发,系统讲解并演示了会议系统部署到线上后云服务器需要注意的点,以及信令服务、流媒体服务、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了。

我们先大体上梳理下,前后分离部署的基础步骤:

本质上和基础服务容器化一样,都是制作自己的镜像,接下来我们按照上图中的内容步骤制作我们自己的镜像。

  1. 准备 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;
}
}
  1. 制作镜像基准文件 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
  1. 修改会议前端Prod环境信令服务地址。
Vue.prototype.$serverSocketUrl = process.env.NODE_ENV === 'development' ? 'ws://127.0.0.1:18080' : '/signal-api/'
  1. 准备好上述文件开始构建镜像。
# Dockerfile 所在目录执行命令 注意看下图
docker build -t test-online-meeting:1.0.2 .

  1. 启动容器。
# 这里 --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+各种开源流媒体组合打造多样性应用的课程,希望这节课仅仅是本课程的最后一节,更是你开启前端音视频的第一节课,是大家将技术带入实际工作的第一节课

加油!我们共同进步,后续有任何疑问评论区或者社群大家一起交流。课程会停止,但是技术会一直迭代更新,而我们更需要持续的进步。