搭建AppRTC服务器 (AppRTC+Collider+Coturn) 2019

2023-11-22 15:08

本文主要是介绍搭建AppRTC服务器 (AppRTC+Collider+Coturn) 2019,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文介绍使用域名 HTTPS 的方式部署AppRTC服务,信令服务和STURN/TURN服务。
本文使用虚拟机桥接模式下的Ubuntu18.04系统和相关代理服务。
因为项目需要本地搭建一个AppRTC服务器,研究了好几天才基本弄完,但是也只是Web端可以访问,好多坑( ⊙ o ⊙ ),记录一下。

0 准备工作

【这部分配置代理方法被和谐掉了,自行解决】

0.1.3 npm代理方式*

设置镜像站

npm config set registry https://repo.huaweicloud.com/repository/npm/
npm cache clean -f

0.2 Google App Engine SDK,以及创建gcloud工程

GAE SDK是AppRTC部署工具,有好几个版本,我选用的是Node.js版本,不着急安,往下看。

0.2.1 Node.js & npm

可以安装Ubuntu仓库的版本,也可以使用官网介绍安装最新版本。

sudo apt-get install nodejs npm
0.2.2 Java

安装OpenJDK

sudo apt-get install openjdk-8-jdk
0.2.2 Google Cloud SDK

项目地址 https://cloud.google.com/sdk/docs/#linux ,Linux可以下载通用的二进制包,配置环境变量。方便起见,Ubuntu可以使用在线下载的方式

Ubuntu在线安装GCloud SDK,注意:需要代理的命令前加proxychains4。

## 添加源
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -## 安装
sudo apt-get update
sudo apt-get install google-cloud-sdk
sudo apt-get install google-cloud-sdk-app-engine-python
sudo apt-get install google-cloud-sdk-datastore-emulator
sudo apt-get install google-cloud-sdk-app-engine-python-extras
0.2.3 初始化Google Cloud
gcloud init
# proxychains4 gcloud init

提示登录Google账号,按Y确认,出现登录链接,把这个链接粘到浏览器,登陆后返回验证字符串,再粘到下面的。

如果电脑安装了浏览器会自动打开浏览器进行登录验证,若浏览器出现跳转错误,那就把浏览器先卸了。
如果还是出错,先执行proxychains gcloud auth login --no-launch-browser认证,然后再gcloud init

Go to the following link in your browser:https://accounts.google.com/o/oauth2/auth?...
Enter verification code: 

提示使用已存在的GCloud工程或者创建新工程。

Pick cloud project to use: [1] apprtc-237109[2] Create a new project

可以选创建新工程直接输入小写字母的工程名字,但是可能会创建失败。
如果创建失败,则可以在浏览器中自己创建工程,然后直接选已存在的工程即可。GCloud工程管理链接:
https://console.cloud.google.com/cloud-resource-manager 。

0.3 域名与证书

HTTPS 方式部署 AppRTC 需要证书,如果有域名的话可以申请 CA 证书,参考另一篇文章《快速申请 Let’s Encrypt 免费SSL证书 / CA证书》。
如果使用的服务器没有公网 IP,可以配置服务器和本机hosts文件,使其域名都指向该服务器IP。如果有公网 IP 应设置域名A记录指向服务器IP。

进入正题~
AppRTC是会议服务,Collider是信令服务,Coturn是中继服务。可以一个一个部署。

1. AppRTC

这一步先测试AppRTC服务,使用Google默认的信令和TURN服务。

1.1 下载源码

git clone https://github.com/webrtc/apprtc.git

1.2 安装node.js依赖

npm install
npm install grunt # 编译工具

如果出现连接问题的话要设置npm代理

npm config set proxy=http://127.0.0.1:1080
npm config set https-proxy http://127.0.0.1:1080

如果有其他错误,可以按照提示执行npm audit fix修复,可能会反复执行几遍npm installnpm audit fix

1.3 安装node.js依赖

sudo apt install python-pip
pip install -r requirements.txt

如果需要代理可以试试

proxychains pip install -r requirements.txt

1.4 安装JDK

前面没安装JDK的话,需要安装JDK。可以自行下载 Oracle JDK 安装,配置环境变量。方便起见可以在线安装OpenJDK。

apt-get install openjdk-8-jdk

1.5 编译

保证这步没有错误

# sudo npm install grunt -g # 先安装grunt
grunt build

1.6 部署运行

这一步介绍使用默认信令和TURN服务部署AppRTC,仅作测试使用,完全部署必须配置信令服务和TURN服务。
建议配置其他服务之前先保证此测试服务正常。

1.6.1 HTTP 方式
<path to gclud sdk>/dev_appserver.py --host <server-ip> ./out/app_engine

注意:
离线安装GCloud,dev_appserver.py 文件位于google-cloud-sdk/bin/目录下,
在线安装的方式,位于/usr/lib/google-cloud-sdk/bin/目录下。若该目录已经添加到PATH,则可以直接执行dev_appserver.py

1.6.2 HTTPS 方式

需要证书,我使用的是域名apprtc.lmshao.com和相应的证书,不知道使用IP和自签名证书是否可行。因为使用的虚拟机没有公网IP,我把服务器的hosts的域名指到了服务器的IP了。
命令行指定域名和证书路径,和生成程序的路径./apprtc/out/app_engine

dev_appserver.py --host apprtc.lmshao.com ./apprtc/out/app_engine --ssl_certificate_path /cert/cert.pem --ssl_certificate_key_path /cert/key.pem --skip_sdk_update_check

我这里会提示默认服务地址:

  • http://apprtc.lmshao.com:8080
  • https://apprtc.lmshao.com:8081

我在我的Windows电脑上也设置了hosts,Chrome不支持WebRTC通过http方式链接,使用Chrome可以打开这个https的链接了。
到目前为止打开浏览器应该可以正常使用了,只是参会人数默认有2人限制。如果这一步出错,就不要进行下面的了,先把这步走通再继续。

1.6.3 常见问题

问题 1
Chrome浏览器不支持 HTTP 方式使用 WebRTC 服务器,会导致没法获取摄像头数据,Firefox有可能会支持。最好的方式是使用HTTPS方式部署
没有域名的话可以配置服务器和本机的hosts文件,把特定域名指向服务器的IP地址。

问题2
至此使用的是默认的Google 信令和TURN服务,客户端访问需要开PAC代理,否则没法正常视频会议。

2. Collider 信令服务

2.1 安装Golang

sudo apt-get install golang

2.2 配置Go工作区

创建快捷方式

export GOPATH=$HOME/goWorkspace/
mkdir $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

2.3 安装collidermain

安装依赖

go get collidermain
# proxychains go get collidermain

每次重新编译apprtc,都要安装一次

go install collidermain

2.4 运行 Collider 服务

命令行指定参数,通常使用的就是8089端口,tls使用加密方式secure websocket,这里指的是apprtc服务与collider之间的连接,room-server指的是AppRTC的服务地址,使用https方式的8081端口。

需要把证书和秘钥文件放在/cert目录下,即/cert/cert.pem /cert/key.pem

goWorkspace/bin/collidermain -port=8089 -tls=true -room-server="https://apprtc.lmshao.com:8081"

如果命令行未指定参数,则从文件中读取。所以也可以通过修改配置文件指定参数apprtc/src/collider/collidermain/main.go

var tls = flag.Bool("tls", true, "whether TLS is used")
var port = flag.Int("port", 8089, "The TCP port that the server listens on")
var roomSrv = flag.String("room-server", "https://263.net:8081", "The origin of the room server")

注意:
修改文件后,要重新编译apprtc、安装collidermain

cd apprtc
grunt build
go install collidermain

2.5 配置AppRTC 使用 Collider

修改apprtc/src/app_engine/constants.py,把WSS_INSTANCE_HOST_KEYhost_port_pair改为 Collider的地址apprtc.lmshao.com:8089

#WSS_INSTANCE_HOST_KEY = 'host_port_pair'
WSS_INSTANCE_HOST_KEY = '263.net:8089'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{WSS_INSTANCE_HOST_KEY: '263.net:8089',WSS_INSTANCE_NAME_KEY: 'wsserver-std',WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}, {WSS_INSTANCE_HOST_KEY: '263.net:8089',WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
}]

WSS_INSTANCES数组两个信令服务器可以删除一个

重新编译AppRTC

cd apprtc
grunt build
go install collidermain

先运行Collider

goWorkspace/bin/collidermain -port=8089 -tls=true -room-server="https://apprtc.lmshao.com:8081"
dev_appserver.py --host apprtc.lmshao.com ./apprtc/out/app_engine --ssl_certificate_path /cert/cert.pem --ssl_certificate_key_path /cert/key.pem --skip_sdk_update_check

如果不加Collider之前AppRTC可以正常工作,那么这时应该也可以参会。若不能参会,打开小飞机PAC代理试试。

3. Coturn TURN服务

3.1 在线安装

Ubuntu可以在线安装,能自动安装其他依赖项libevent等多个库。

sudo apt-get install coturn

3.1 离线安装*

安装libevent

$ wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
$ tar xvfz libevent-2.0.21-stable.tar.gz
$ cd libevent-2.0.21-stable
$ ./configure
$ make
$ sudo make install

安装SQLite3

安装CoTurn

$ wget https://coturn.net/turnserver/v4.5.0.8/turnserver-4.5.0.8.tar.gz
$ tar xvfz turnserver*.tar.gz
$ ./configure
$ make
$ sudo make install

3.3 配置

创建用户

$ sudo turnadmin -a -u 用户名 -p 密码 -r 域(写你自己服务器的IP/域名)
$ sudo turnadmin -a -u liming -p 12345678 -r apprtc.lmshao.com

可以查看用户

$ turnadmin -l
liming[apprtc.lmshao.com]

3.4 启动CoTurn服务

参数可以直接命令行指定,也可以用配置文件,默认参数会使用配置文件/etc/turnserver.conf的参数。

sudo turnserver -v -L 192.168.198.135 -a -f -r apprtc.lmshao.com -u liming:12345678 --cer /cert/cert.pem --pkey /cert/key.pem
详细参数说明
参数说明
-v日志输出级别
-L绑定网卡IP
-a使用长期凭证机制,turn中继转发模式,必须使用长期凭证机制
-f指定 turn 消息使用 fingerprint
-r指定域名
-u用户名密码 -u user:password
–cert证书路径
–pkey秘钥路径
-c指定配置文件,否则使用默认配置文件/etc/turnserver.conf

最简单的启动参数

# 前台进程
$ turnserver -L <public_ip_address> -a -f -r <realm-name>
# 后台服务
$ turnserver -L <public_ip_address> -o -a -f -r <realm-name>
测试CoTurn服务
turnutils_uclient apprtc.lmshao.com -u liming -w 12345678
turnutils_uclient 域名 -u 用户名 -w 密码

正常情况下运行不出错的话,过一会会出现测试结果。

3.5 配置AppRTC启动CoTurn

编辑 apprtc/src/app_engine/constants.py,重新编译执行即可。

#ICE_SERVER_OVERRIDE = None# Enable by uncomment below and comment out above, then specify turn and stunICE_SERVER_OVERRIDE  = [{"urls": ["turn:apprtc.lmshao.com:3478?transport=udp","turn:apprtc.lmshao.com:3478?transport=tcp"],"username": "liming","credential": "12345678"},{"urls": ["stun:apprtc.lmshao.com:3478:3478"]}
]ICE_SERVER_BASE_URL = 'https://networktraversal.googleapis.com'
ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')

4. AppRTC & Collider & Coturn

4.1 AppRTC配置

至此,这个服务都配置好了,下面是完整的apprtc/src/app_engine/constants.py配置。

# Copyright 2015 Google Inc. All Rights Reserved."""AppRTC Constants.This module contains the constants used in AppRTC Python modules.
"""
import os# Deprecated domains which we should to redirect to REDIRECT_URL.
REDIRECT_DOMAINS =  ['apprtc.appspot.com', 'apprtc.webrtc.org', 'www.appr.tc'
]
# URL which we should redirect to if matching in REDIRECT_DOMAINS.
REDIRECT_URL = 'https://appr.tc'ROOM_MEMCACHE_EXPIRATION_SEC = 60 * 60 * 24
MEMCACHE_RETRY_LIMIT = 100LOOPBACK_CLIENT_ID = 'LOOPBACK_CLIENT_ID'# Turn/Stun server override. This allows AppRTC to connect to turn servers
# directly rather than retrieving them from an ICE server provider.# ICE_SERVER_OVERRIDE = None# Enable by uncomment below and comment out above, then specify turn and stunICE_SERVER_OVERRIDE  = [{"urls": ["turn:apprtc.lmsaho.com:3478?transport=udp","turn:apprtc.lmsaho.com:3478?transport=tcp"],"username": "liming","credential": "12345678"},{"urls": ["stun:apprtc.lmsaho.com:3478"]}
]ICE_SERVER_BASE_URL = 'https://networktraversal.googleapis.com'
ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/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 = 'apprtc.lmsaho.com:8089'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{WSS_INSTANCE_HOST_KEY: 'apprtc.lmsaho.com:8089',WSS_INSTANCE_NAME_KEY: 'wsserver-std',WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}
#, {
#    WSS_INSTANCE_HOST_KEY: 'apprtc.lmsaho.com:8089',
#    WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
#    WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
#}
]WSS_HOST_PORT_PAIRS = [ins[WSS_INSTANCE_HOST_KEY] for ins in WSS_INSTANCES]# memcache key for the active collider host.
WSS_HOST_ACTIVE_HOST_KEY = 'wss_host_active_host'# Dictionary keys in the collider probing result.
WSS_HOST_IS_UP_KEY = 'is_up'
WSS_HOST_STATUS_CODE_KEY = 'status_code'
WSS_HOST_ERROR_MESSAGE_KEY = 'error_message'RESPONSE_ERROR = 'ERROR'
RESPONSE_ROOM_FULL = 'FULL'
RESPONSE_UNKNOWN_ROOM = 'UNKNOWN_ROOM'
RESPONSE_UNKNOWN_CLIENT = 'UNKNOWN_CLIENT'
RESPONSE_DUPLICATE_CLIENT = 'DUPLICATE_CLIENT'
RESPONSE_SUCCESS = 'SUCCESS'
RESPONSE_INVALID_REQUEST = 'INVALID_REQUEST'IS_DEV_SERVER = os.environ.get('APPLICATION_ID', '').startswith('dev')BIGQUERY_URL = 'https://www.googleapis.com/auth/bigquery'# Dataset used in production.
BIGQUERY_DATASET_PROD = 'prod'# Dataset used when running locally.
BIGQUERY_DATASET_LOCAL = 'dev'# BigQuery table within the dataset.
BIGQUERY_TABLE = 'analytics'

注意修改完重新编译AppRTC

cd apprtc
grunt build
go install collidermain

4.2 启动服务

IP用户名密码改为相应的值。

Collider

nohup goWorkspace/bin/collidermain -port=8089 -tls=true -room-server="https://apprtc.lmshao.com:8081" >> log/collider.log &

Coturn

sudo turnserver -v -L 192.168.198.135 -o -a -f -r apprtc.lmshao.com -u liming:12345678 --cer /cert/cert.pem --pkey /cert/key.pem -l log/coturn.log

AppRTC

nohup dev_appserver.py --host apprtc.lmshao.com ./apprtc/out/app_engine --ssl_certificate_path /cert/cert.pem --ssl_certificate_key_path /cert/key.pem --skip_sdk_update_check >> log/apprtc.log &

浏览器访问有如下效果
AppRTC-1

4.3 Nginx反向代理

上面的部署如果使用 https://apprtc.263.net:8081访问没问题,一旦使用http://apprtc.263.net:8081 访问,AppRTC服务就会报错导致服务卡死,必须重启AppRTC服务。
可以使用Nginx反向代理方式,设置http自动跳转到https,并隐藏服务端口。

sudo apt-get install nginx

编辑默认配置文件
/etc/nginx/sites-available/default

# 跳转到 apprtc.lmshao.com:8081
upstream apprtc {server apprtc.lmshao.com:8081;
} # http 跳转到 https
server {listen 80;server_name apprtc.lmshao.com;rewrite ^(.*) https://$server_name$1 permanent;
}server {# SSL configuration#listen 443 ssl default_server;listen [::]:443 ssl default_server;server_name apprtc.lmshao.com;ssl_certificate /cert/cert.pem;ssl_certificate_key /cert/key.pem;index index.html index.htm index.nginx-debian.html;location / {#try_files $uri $uri/ =404;proxy_pass https://apprtc;# 必须加这句proxy_set_header Host $host;# 传递远端IPproxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
Nginx 服务管理
# 启动
sudo nginx
# 停止
sudo pkill -9 nginx

如果没出错的话,浏览器访问就可以参会了~
AppRTC-2

5. 总结

主要参考AppRTC的官方文档进行部署的,摸索了好几天,遇到了好多坑。目前Web参会没问题,Android Demo参会有问题,还没搞定。
东西太多,记录一下,如果能给后来者参考,少走弯路就更好了。
欢迎交流。

这篇关于搭建AppRTC服务器 (AppRTC+Collider+Coturn) 2019的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410987

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

速盾:直播 cdn 服务器带宽?

在当今数字化时代,直播已经成为了一种非常流行的娱乐和商业活动形式。为了确保直播的流畅性和高质量,直播平台通常会使用 CDN(Content Delivery Network,内容分发网络)服务器来分发直播流。而 CDN 服务器的带宽则是影响直播质量的一个重要因素。下面我们就来探讨一下速盾视角下的直播 CDN 服务器带宽问题。 一、直播对带宽的需求 高清视频流 直播通常需要传输高清视频

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

RTMP流媒体服务器 crtmpserver

http://www.oschina.net/p/crtmpserver crtmpserver又称rtmpd是Evostream Media Server(www.evostream.com)的社区版本采用GPLV3授权 其主要作用为一个高性能的RTMP流媒体服务器,可以实现直播与点播功能多终端支持功能,在特定情况下是FMS的良好替代品。 支持RTMP的一堆协议(RT

JavaFX环境的搭建和一个简单的例子

之前在网上搜了很多与javaFX相关的资料,都说要在Eclepse上要安装sdk插件什么的,反正就是乱七八糟的一大片,最后还是没搞成功,所以我在这里写下我搭建javaFX成功的环境给大家做一个参考吧。希望能帮助到你们! 1.首先要保证你的jdk版本能够支持JavaFX的开发,jdk-7u25版本以上的都能支持,最好安装jdk8吧,因为jdk8对支持JavaFX有新的特性了,比如:3D等;