- 1. 前言
- 2. WebRTC资料准备
- 3. AppRTC资料准备
- 4. docker创建Ubuntu16.04镜像部署并导出
- 4.1 安装docker
- 4.2 docker获取Ubuntu16.04镜像
- 4.3 准备工作
- 4.4 安装AppRTC所需软件
- 4.4.1 创建目录
- 4.4.2 安装JDK
- 4.4.3 安装node.js
- 4.4.4 安装python和python-webtest(python2.7)
- 4.4.5 安装google_appengine
- 4.4.6 安装go
- 4.4.7 安装apprtc
- 4.4.8 安装coturn
- 4.4.9 安装nginx
- 4.5 配置与运行
- 4.5.1 coturn打洞+中继服务器
- 4.5.2 collider信令服务器
- 4.5.3 apprtc房间服务器
- 4.5.4 nginx代理
- 4.6 解决跨域问题
- 5. docker方式运行方案及实践
- 5.1 导入导出镜像以及上传仓库
- 5.2 不同容器运行不同服务测试
- 5.3 一个容器运行所有服务
- 6. 效果展示(MacOS、Windows和鸿蒙OS都可以)
- 7. 最后
之前我们已经在阿里云服务器上搭建了turn/stun服务(javascript:void(0)),也使用webRTC测试过rtsp转webRTC播放视频(javascript:void(0)),实时性很好,这里我们再搭建官网的全功能WebRTC应用程序AppRTC应用服务做一下实时音视频通话的测试。
之前说了很多webrtc的内容,但是一直没有系统说过如何学习,其实就像很久前就说过的从官网了解并获取资料:https://webrtc.org/ 借助 WebRTC,您可以为应用添加基于开放标准运行的实时通信功能。它支持在对等设备之间发送视频、语音和通用数据,使开发者能够构建强大的语音和视频通信解决方案。这项技术适用于所有现代浏览器以及所有主要平台的原生客户端。WebRTC 采用的技术是开放网络标准,以常规 Javascript API 的形式在所有主流浏览器中提供。对于原生客户端(例如 Android 和 iOS 应用),可以使用具备相同功能的库。WebRTC 项目属于开源项目,受 Apple、Google、Microsoft 和 Mozilla 等公司支持。本页面由 Google WebRTC 团队维护。 示例:https://webrtc.github.io/samples/ WebRTC 有许多不同的用例,从使用摄像头或麦克风的基本 Web 应用,到更高级的视频通话应用和屏幕共享。我们收集了大量的代码示例,以便更好地说明该技术的工作原理及其用途。 使用指南:https://webrtc.org/getting-started/overview
GitHub:https://github.com/webrtc/apprtc/
AppRTC 房间+Web服务器使用python+js语言 AppRTC Collider信令服务器采用go语言 Coturn 采用C语言 在部署到公网时需要通过Nginx做Web和Websocket的代理连接 实际开发:把信令+房间管理都是写到一个服务器(我们后续可以尝试将这些服务都用go来实现)
参考:https://chromium.googlesource.com/external/webrtc/apprtc/+/098481a24a37529565fe4bb416a11c84d04370f4/README.mdjavascript:void(0)
自行搜索解决(个人感觉你可以将其当成git来学,虽然两者是不同的东西,但是我感觉分布式的思想和命令行操作这块两者惊人的相似
- 安装vim
- 更新源
- 安装ssh
- 安装ifconfig工具
- 安装git
复制以下源到sources.list
4.4.1 创建目录
注意后续的目录,因为我们是docker中直接root用户,所有后续目录是/root/webrtc,后续的目录都是采用该目录。 安装需要的各种工具(除了apt之外还可以下载安装包或者源码自己编译安装)
4.4.2 安装JDK
4.4.3 安装node.js
4.4.4 安装python和python-webtest(python2.7)
ubuntu 一般都会自带python 2.7 输入 输出版本则已经有了 如果没有则安装:
4.4.5 安装google_appengine
4.4.6 安装go
安装go:
创建go工作目录
4.4.7 安装apprtc
4.4.8 安装coturn
4.4.9 安装nginx
默认安装目录:/usr/local/nginx 启动:/usr/local/nginx/sbin/nginx 停止:/usr/local/nginx/sbin/nginx -s stop 重新加载配置文件:/usr/local/nginx/sbin/nginx -s reload /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
4.5.1 coturn打洞+中继服务器
配置防火墙,允许访问3478端口(含tcp和udp,此端口用于nat穿透),实际还有带加密的端口;
- 1.命令行运行
- 2.docker运行
我们后面会通过docker运行该服务,大致命令:
4.5.2 collider信令服务器
- 1.命令行运行方式
配置防火墙,允许访问8089端口(tcp,用于客户端和collider建立websocket信令通信)
-room-server=“http://192.168.2.143:8090” 实际是连接房间服务器的地址(如果部署在本地可以使用localhost)
- 2.docker运行
我们后面会通过docker运行该服务,大致命令:
4.5.3 apprtc房间服务器
先安装python的request模块
- 安装pip
- 修改配置文件
配置防火墙,允许访问8090端口(tcp,此端口用于web访问) 配置文件修改(主要是配置apprtc对应的conturn和collider相关参数)vim /root/webrtc/apprtc/src/app_engine/constants.py 修改后(填的都是外网IP,为了适合更多数朋友测试,我这里用的是内网的环境,在公网部署填入公网IP或域名即可;stun/turn可以使用网上免费的,国内也有很多免费的,就可以本地不启动stun/turn服务了,wss服务主要是信令服务器需要,如果信令服务是跑在本地就使用本机地址,后面配置证书使用nginx代理即可)
进到apprtc目录(这个web后端后面我们尝试改成go实现来替代python实现):
- 3.命令行启动
- 4.docker启动运行
此时可以通过谷歌浏览器访问测试:
虽然可以访问网页,但是无法进入房间无法获取音视频权限,还需要后续配置ssl。
4.5.4 nginx代理
- 1.生成证书
之后需要输入国家省市地区公司名个人名邮件等,可以随意,这里是自签名证书,商用时需要申请域名证书,上节我们在阿里云上申请免费ssl证书已经总结过了。
- 2.web代理
反向代理apprtc,使之支持https访问,如果http直接访问apprtc,则客户端无法启动视频音频采集(必须得用https访问) – 配置web服务器 (1)配置自己的证书
(2)配置主机域名或者主机IP server_name 192.168.2.143; 完整配置文件:/usr/local/nginx/conf/conf.d/apprtc-https-proxy.conf
编辑nginx.conf文件,在末尾}之前添加包含文件
- 3.配置websocket代理
ws是不安全的连接 类似http wss是安全的连接,类似https 完整配置文件:/usr/local/nginx/conf/conf.d/apprtc-websocket-proxy.conf
重启nginx加载配置文件()。
浏览器通话跨域问题 :pushState Messages:Failed to start signaling: Failed to execute ‘pushState’ on ‘History’ 解决方法: 修改文件apprtc/src/web_app/js/appcontroller.js
最终结果(大概443行):
然后重新build:
重新运行:
docker运行这里我们可以有三种方式:
- 1.可以将我们安装的这些内容导出并导入为一个新的统一镜像,在新镜像中分别运行各个服务,根据运行不同的服务形成不同的容器,但是这显然有的服务没有运行,该镜像会比较大,好处是在部署的服务器上利用该镜像可以随时运行其它服务;
- 2.在统一镜像中一次性运行所有服务,这对服务器的性能要求高一些,但是部署难度会降低,直接一个docker命令运行所有服务,而且达到开箱即用的效果;
- 3.将不同的服务形成不同的镜像,一个镜像只包含一个服务的依赖,这样做带来了docker镜像管理的难度,我们需要学习一些docker管理的软件,但这是docker希望的样子,更符合云化和微服务化的要求和目的,我们可以利用集群的能力避免服务宕机可能带来的风险;
我们这里由于只做初步测试将使用第一种和第二种方式。
实际上我们也可以通过Dockerfile方式构建镜像,但是上述依赖太复杂了,写Dockerfile比较麻烦,我通常喜欢拉取一个基础镜像,然后bash进入后安装依赖,之后导出再导入形成一个新镜像(后续可以尝试第三种方式并根据不同的服务形成四个Dockerfile,这样更符合docker的设计目的,尽可能的将可复用的内容都单独容器化)。
docker hub上传失败的话可以选择国内的免费仓库,比如阿里云的,请自行搜索如何上传阿里云仓库 阿里云镜像上传参考地址:https://docs.docker.com/
使用三个容器运行三个服务并将端口映射出来,之后在外部使用nginx做代理进行httpswss的代理即可。
我们也可以将coturn打洞中继服务默认运行在镜像内,或者直接使用一些免费的stun/turn服务;之后信令服务和nginx代理在容器内直接以服务运行,docker外部只暴露web服务启动即可(或者使用bash -c将上述三条命令放到一起启动一个容器即可)。
如果你是按照外部运行nginx,其它的服务运行在docker容器中的话可以直接使用我这里的镜像,修改其中的 修改其中localhost的部分,修改为你的公网ip,修改后参考上面的编译运行方式重新运行启动(因为没有对turn进行配置,所以域名可能也不行,需要单独做域名配置)
测试Google浏览器443端口在Windows、MacOS、Android下是可用的(直接微信页面打开也可以),免费的ssl证书会报警告,不用理会。
目前我会在阿里云服务器上保留一段时间用于测试,各位i也可以测试一下:
MacOS:
Windows(微信直接打开链接也可以,Google浏览器打开也可以):
鸿蒙OS平板:
Android和ios使用浏览器都报了错误,房间链接失败了,看着似乎是信令的问题,后面我们分析源码的时候再来试一下(而且退出房间后似乎ws/wss链接断开不及时,退出后再次使用一个房间号很可能会提升房间已满)。
docker的好处就在这里了,一次部署,只要在支持docker的环境再次部署就容易多了,再也不同担心部署过程中的环境依赖问题了,这让运维实施和开发都少了头疼的一件事(在我环境上是好的.)。