AppRTC(WebRTC)服务器搭建
前言
最近研究了几天 appr.tc 服务器的搭建,主要目的是想在本地搭建一套 webrtc 服务器环境,可以做一些webrtc相关的实验。
经过几天的折腾,得到以下几点结论:
一、最新的 appr.tc服务器是不能使用 非 https服务的。主要有两种原因:1. chrome浏览器不支持在非https方式下打开音/视频设备。2. appr.tc中的信令服务器(collider)不支持非 https 服务。
二、appr.tc服务器的搭建仅支持浏览器之间互通,移动端与浏览器之间是无法互通的,主要是ssl 证书问题。如果那位对 ssl证书比较熟悉的话,可以与我联系,咱们一起再重新做个实验。
下面我就来描述一下如何搭建 appr.tc 服务。
几个重要的库
在具体介绍 appr.tc服务如何搭建之前,我们先来了解几个基本概念。
Google Cloud SDK
按照 google 官方的说法,Google Cloud SDK 是一套非常好用的使用 python 管理 App Engine applications 的工具集。gcloud
包括本地布署server以及布署和管理你的应用的命令行工具。
其实我并不这么认为,我觉得使用它增加了我的学习成本。当遇要问题时,我其实对它是束手无策的。
我们可以认为它就是一套布署工具,可以帮我们布署和启动服务程序。我们使用它布署启动 room 服务器。
AppRTC
房间与信令服务器。该服务器包括了房间的业务逻辑和信令处理逻辑。其中在 AppRTC中的 collier 目录中是信令服务器的实现。
除了 collider 命令服务器外,其它的代码都是用python写的。
Collider
是一种用 go 语言实现的基于 WebSocket 的命令服务器。要了解 WebSocket 协议可以看这篇文章 WebSocket协议:5分钟从入门到精通。
Coturn
Coturn 是一种TURN服务器(也就是中转服务器),该服务器用于VoIP或通用数据流的NAT穿越和数据转发。
所以总结起来 appr.tc服务包括了room服务器(apprtc)、信令服务器(collider)、NAT穿越与数据转发服务器(coturn)
grunt
grunt是一种可以帮助我们解决 JavaScript 的开发过程中,经常会遇到一些重复性的任务,比如合并文件、压缩代码、检查语法错误、将Sass代码转成CSS代码等等。
Grunt能够按照预先设定的顺序自动运行一系列的任务。这可以简化工作流程,减轻重复性工作带来的负担。
Grunt基于Node.js,安装之前要先安装Node.js
如何搭建 appr.tc 服务器
- 从 git 上 Clone AppRTC。在代码中包括了 room服务器和collider信令服务器。
- 安装、布署、启动 Collider ,这一步比较复杂。
- 安装 Go 工具,并创建工作空间。在 ubuntu 下安装 Go 比较简单,如
apt install golang-1.10-go
。 创建的 go 工作空间,如:export GOPATH=$HOME/goWorkspace/ 。它包括两个子目录,分别是bin
和src
。- bin : 该子目录中存放编译后的可执行文件。
- src : 该子目录中存放 go 项目源文件。
- 链接 collider 目录下的子目录到 $GOPATH/src下
ln -s `pwd`/apprtc/src/collider/collider $GOPATH/src ln -s `pwd`/apprtc/src/collider/collidermain $GOPATH/src ln -s `pwd`/apprtc/src/collider/collidertest $GOPATH/src
- 安装依赖
go get collidermain
- 编译安装 collidermain
go install collidermain
- 布署 collider 服务
- 创建 /collider 和 /cert 目录 (如:sudo mkdir -p /collider, sudo mkdir -p /cert)
- 拷由 $GOPATH/bin/collidermain 到 /collider 目录
- 创建 ssl 证书。创建证书的命令如下:
sudo openssl req -x509 -newkey rsa:2048 -keyout key.pem -out /etc/cert.pem -days 99999 -nodes
- 将证书命名为 cert.pem 和 key.pem 并拷到 /cert 目录中。注:文件名和目录可以到 collider/collider.go文件中修改(通过搜索关键字 cert 找到修改的位置)
- 启动 collider 信令服务器
当然,你还可以修改 collider/collidermain/main.go 文件,文件中的tls, port, room-server分别对应上面命令行中的参数。也就是说,如果在启动命令中不加任何参数,它就会使用 main.go中设置的参数,否则使用命令行中指定的参数。/collider/collidermain -port=8089 -tls=true -room-server="https://ip:port"
- 安装 Go 工具,并创建工作空间。在 ubuntu 下安装 Go 比较简单,如
注:在网上看到很多文章说 collider 可以将tls设置为 false,经我亲测,将 tls设置为 false后,collider就不能正常工作了,如果有成功的可以与我联系。
- 安装并启动 Coturn TURN server
-
首先,下载Coturn源码
-
编译并安装
进入到Coturn源码目录下./configure --prefix=/usr/local/turnserver sudo make && sudo make install
-
设置好 Coturn 配置
#本地监听的网卡设备,这里根据自己的实际情况填写 listening-device=eth1 listening-port=3478 #本地用于转发的网卡设备,这里根据自己的实际情况填写 relay-device=eth1 #指定的转发端口的分配范围,测试时,可以将防火墙全部关闭,防止 UDP 端口被屏蔽 min-port=3480 max-port=3500 #日志输出级别,turnserver 启动时加上 -v,可以得到更清晰的日志输出 Verbose #消息验证,WebRTC 的消息里会用到 fingerprint #webrtc 通过 turn 中继,必须使用长验证方式 lt-cred-mech # ICE REST API 认证需要(如果打开了这行,turn就不工作了) # use-auth-secret # REST API 加密所需的 KEY # 这里我们使用“静态”的 KEY,Google 自己也用的这个(如果找开这个就不工作了) #static-auth-secret=4080218913 #用户登录域,下面的写法可以不改变它,因为再启动 turnserver 时,可以通过指定参数覆盖它 realm=<填写你自己的域名> #可为 TURN 服务提供更安全的访问(这个我没用,不知道干啥的) #stale-nonce #在Coturn代码中的/etc/examples/目录下有秘钥文件,可以直接用 cert=/usr/local/turnserver/etc/turn_server_cert.pem pkey=/usr/local/turnserver/etc/turn_server_pkey.pem #屏蔽 loopback, multicast IP地址的 relay no-loopback-peers no-multicast-peers #启用 Mobility ICE 支持(不懂) mobility #禁用本地 telnet cli 管理接口 no-cli
-
启动Coturn服务
sudo turnserver -v /etc/turnserver.conf
还可以用下面的命令启动,这样就不用写配置文件了,命令如下:
sudo turnserver -v -L ip -a -f -r north.gov
通过 -v 指定日志输出级别; -L 指定用于绑定的网卡 IP 地址;-a 指定使用长期凭证机制,turn中继转发模式,必须使用长期凭证机制;-f 指定 turn 消息使用 fingerprint;-r 指定使用的域名,将覆盖 turnserver.conf 文件中的配置;
-
创建用户
sudo turnadmin -a -u 用户名 -p 密码 -r 域(随便写一个)
可以使用下面的命令查看创建的用户
turnadmin -l
-
测试 Coturn 服务
- 打开
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
这个网址 - 在该网址上增加 turn 服务。如 turn:172.16.126.139:3478
- 填入用户名和密码。
- 打开
-
- 布署与启动 room 服务(appr.tc)
- 下载 Google app engine SDK for Python
- 安装 node.js
sudo apt-get install nodejs sudo apt-get install nodejs-legacy
- 安装 grunt
sudo apt-get install npm sudo npm -g install grunt-cli
- 打开 src/app_engine/constants.py 修改以下内容:
以及ICE_SERVER_BASE_URL = 'https://ip:port' ICE_SERVER_URL_TEMPLATE = '%s/iceconfig?key=%s' ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
# Dictionary keys in the collider instance info constant. WSS_INSTANCE_HOST_KEY = 'host_port_pair' WSS_INSTANCE_NAME_KEY = 'vm_name' WSS_INSTANCE_ZONE_KEY = 'zone' WSS_INSTANCES = [{ WSS_INSTANCE_HOST_KEY: 'IP:PORT', WSS_INSTANCE_NAME_KEY: 'wsserver-std', WSS_INSTANCE_ZONE_KEY: 'us-central1-a' }]
- 编译 apprtc
修改了 appr.tc 的代码后,使用 grunt build 进行编译,在 apprtc 目录下执行下面命令:sudo npm install sudo grunt build
- 使用下面的命令进行布署
<path to sdk>/dev_appserver.py --host 0.0.0.0 --enable_host_checking=no --ssl_certificate_path=/xxx/cert.pem --ssl_certificate_key_path=/xxx/key.pem ./out/app_engine
小结
总的来说,配置 appr.tc 服务还是蛮复杂的。到现在为止我没有解决移动端与浏览器之间互通的问题。总是报证书错误。
在网上有看到说自己私签的证书在移动端是无法正常工作的,不知是否是这个样子?
另外,由于不能进行浏览器与移动端互通,所以上面的步骤中还少了 ICE REST API相关的配置。这块内容可以参考其它网友的文章。