AppRTC是WebRTC视频通话的服务程序,一般可以将其作为参考实现,搭建AppRTC服务受限于很多条件,并不是太容易。在参考了官方操作和大量的博客之后,根据自己操作实践排除了很多网络博客上的错误方法,终于部署成功了一套环境。测试环境为阿里云的CentOS 7服务器,带公网IP和域名。
部署前的必要条件
部署前,首先要明确的是必要的依赖环境,必须满足以下需求:
- 公网服务器,如果非公网就只能在局域网玩玩了,此处暂不讨论局域网
- SSL证书,因为WebRTC必须在HTTPS环境下使用,因此通信WebSocket也必须支持
如果没有证书,但是有域名的话,可以去申请免费的证书,具体百度 Let’s Encrypt。本博客使用了Caddy服务器,此服务器可自行自动申请其证书,其证书存放在
/var/lib/caddy/acme/acme-v02.api.letsencrypt.org/sites/ |
下,按站点域名存放,假设本次部署使用的 example.com 域名,对应 8.8.8.8,其证书存放在
/var/lib/caddy/acme/acme-v02.api.letsencrypt.org/sites/example.com/ |
下,包含公钥文件 example.com.cert
和私钥文件 example.com.key
文件。
上面的 example.com 和 8.8.8.8 是域名和对应的IP,此处为举例,抹去了我的真实的地址。
安装编译环境
除了必要条件外,编译安装相关源码也需要一些编译环境,已知目前最终部署的程序为
- apprtc GAE的Python和NodeJS开发的房间服务器
- collider golang开发的信令服务器
- coturn c语言开发的stun/turn服务器
系统基础环境安装
因为上面的依赖以及后续使用发现,系统需要安装的依赖环境如下(已经安装了跳过)
yum install python #要求2.7版本 curl -sL https://rpm.nodesource.com/setup_10.x | bash – #安装比较高的10版本 npm -g install grunt-cli #grunt工具 yum install gcc-c++ make #C/C++编译器等 yum install golang #golang编译器 yum install java-1.8.0-openjdk #安装JDK,我选择了1.8版本 yum install libevent-devel #编译coturn需要 yum install git #可以下载Github源码 yum install sqlite-devel #编译coturn需要 |
GAE环境安装
准确的讲需要安装的是 Google app engine SDK for Python,但是因为众所周知的原因,我们并不能直接访问,但是我从其他地方获知了一个比较老的下载地址,可以离线安装,而且是可以下载的
wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-188.0.1-linux-x86_64.tar.gz |
虽然这个是Google Cloud SDK,但是我发现确实是可以用,并且可以更新,估计是现在进行了整合吧
tar xzvf google-cloud-sdk-188.0.1-linux-x86_64.tar.gz ./google-cloud-sdk/bin/gcloud components update |
这其中因为 AppRTC 是用GAE的Python开发的,依赖Python 2.7
环境。据说现在支持了3.7版本了,因为不能上官网,不确定。
编译构建版本
编译coturn
因为coturn是必须依赖的组件,我们优先处理这个,这个软件并不在仓库中,其依赖的libevent的版本与仓库中的一致,并不需要单独编译,因此只需要下载编译这个软件即可
因为这个软件中带了RPM的构建脚本,因此我这里打算进行RPM包的构建,首先安装RPM构建工具
yum install rpm-build |
开始下载源码进行编译构建安装包
wget https://github.com/coturn/coturn/archive/4.5.1.1.tar.gz mkdir -p ~/rpmbuild/SOURCES mv 4.5.1.1.tar.gz -p ~/rpmbuild/SOURCES/turnserver-4.5.1.1.tar.gz rpmbuild -ta ~/rpmbuild/SOURCES/turnserver-4.5.1.1.tar.gz |
等构建成功后,会在 ~/rpmbuild/RPMS/x86_64
目录下发现好几个安装包,只需要安装 turnserver 即可
rpm -ivh ~/rpmbuild/RPMS/x86_64/turnserver-4.5.1.1-0.el7.x86_64.rpm |
如果怕编译麻烦的,可在本站下载编译好的包进行安装
rpm -ivh https://cdn.xilixili.net/linux/turnserver-4.5.1.1-0.el7.x86_64.rpm |
至于配置,我们后面再讲。
编译collider
Collider是Go开发的服务,依赖websocket,依然不能访问其地址。因此只能下载镜像安装,此处以将Go的环境设置的当前用户目录下的go目录为例说明。另外Collider的代码在AppRTC之中,因此此处就直接下载AppRTC的源码了,后续不需要下载了。
export GOPATH=$HOME/go mkdir -p ~/go/src git clone https://github.com/apprtc/apprtc 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 mkdir -p $GOPATH/src/golang.org/x cd $GOPATH/src/golang.org/x git clone https://github.com/golang/net.git go get collidermain go install collidermain |
至此,程序编译好并且安装到了 $GOPATH/bin
下面。
配置启动服务
注意,下面所有提供网络的服务,要注意防火墙配置,特别是UDP端口,测试平台关闭了防火墙。
配置启动coturn
首先需要生成签名证书
mkdir /cert openssl req -x509 -newkey rsa:2048 -keyout /cert/turn_server_pkey.pem -out /cert/turn_server_cert.pem -days 99999 -nodes |
然后再生成用户,以 apprtc 为例
turnadmin -k -u apprtc -p apprtc |
执行之后会生成一个key,记住这个key,马上要用到。编辑 /etc/turnserver/turnserver.conf
文件,这个文件大部分的功能都默认是注释的,因此基本找到出处进行修改,大概如下
listening-ip=8.8.8.8 listening-port=3478 relay-ip=8.8.8.8 tls-listening-port=5349 external-ip=8.8.8.8 Verbose fingerprint lt-cred-mech use-auth-secret static-auth-secret=apprtc user=apprtc:0x949534a397bcf2e88470c86ad3749d9c(替换成上面的key) user=apprtc:apprtc cert=/cert/turn_server_cert.pem pkey=/cert/turn_server_pkey.pem |
保存之后,启动服务
systemctl enable turnserver systemctl start turnserver |
注意,很多教程说要配置 TRUN REST API,即自己需要实现个REST API服务,让AppRTC进行查询获取,通过分析和测试,发现第一这个服务必须是POST请求的,具体格式参考标准,第二是并不需要这个API也能正常使用,因此请不要折腾REST API了。
启动Collider服务
暂时以测试为主,后续可为此程序编写添加个systemd服务。
此服务需要对外提供WSS服务,因此需要证书,将之前的域名证书拷贝过去即可
cd /var/lib/caddy/acme/acme-v02.api.letsencrypt.org/sites/example.com/ cp example.com.cert cert.pem cp example.com.key key.pem chmod 755 /cert/* |
然后通过下面的命令启动服务
./collidermain -port=8089 -tls=true -room-server=”http://example.com:8080″ |
注意,我们设置的这个服务的端口是8089端口,AppRTC默认的HTTP端口是8080,HTTPS端口是8081,但是实际测试中发现AppRTC在使用HTTPS的时,会经常SSL异常,未查明原因。
配置启动AppRTC
配置AppRTC的配置文件 ~/apprtc/src/app_engine/constants.py
文件如下(仅列出修改项)
ICE_SERVER_OVERRIDE = [ { “urls”: [ “turn:8.8.8.8:3478?transport=udp”, “turn:8.8.8.8:3478?transport=tcp” ], “username”: “apprtc”, “credential”: “0x949534a397bcf2e88470c86ad3749d9c” #替换成上面的key }, { “urls”: [ “stun:8.8.8.8:3478” ] } ] ICE_SERVER_BASE_URL = ” ICE_SERVER_URL_TEMPLATE = ” ICE_SERVER_API_KEY = os.environ.get(‘ICE_SERVER_API_KEY’) # Dictionary keys in the collider instance info constant. WSS_INSTANCE_HOST_KEY = ‘example.com:8089’ WSS_INSTANCE_NAME_KEY = ‘vm_name’ WSS_INSTANCE_ZONE_KEY = ‘zone’ WSS_INSTANCES = [{ WSS_INSTANCE_HOST_KEY: ‘example.com:8089’, WSS_INSTANCE_NAME_KEY: ‘wsserver-std’, WSS_INSTANCE_ZONE_KEY: ‘us-central1-a’ }] |
上面的配置已经可以保证使用了,且在命令行指定SSL证书后,就能提供服务了,但是由于之前提到了SSL异常问题,即使在切换到HTTP之后并使用nginx代理后,出现了URL不匹配的错误,因此还不能直接使用,为了解决上面的问题,我修改了代码,首先配置 ~/apprtc/src/app_engine/constants.py
修改
REDIRECT_URL = ‘https://example.com:9090’ |
这里假设nginx代理的地址是 example.com:9090
,然后修改该目录下的 apprtc.py
文件,大概在300行左右,修改其中room_link的赋值为
room_link = constants.REDIRECT_URL + ‘/r/’ + room_id |
然后编译代码并运行代码,命令如下
cd ~/apprtc grunt build cd ~ google-cloud-sdk/bin/dev_appserver.py –host example.com ~/apprtc/out/app_engine/ –dev_appserver_log_level debug |
会看到输出显示
Starting module “default” running at: http://example.com:8080 |
也就是意味着服务提供的地址是 http://example.com:8080
安装配置nginx代理
如上,使用nginx代理https请求,端口为 9090,直接yum安装
yum install nginx |
配置 /etc/nginx/nginx.conf
文件
#server { # listen 80 default_server; # listen [::]:80 default_server; # server_name _; # root /usr/share/nginx/html; # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # location / { # } # error_page 404 /404.html; # location = /40x.html { # } # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } #} server { listen 9090 ssl default_server; server_name example.com; ssl_certificate “/cert/cert.pem”; ssl_certificate_key “/cert/key.pem”; location /{ proxy_pass http://example.com:8080; proxy_set_header Host $host; } } |
配置默认注释了原来默认配置的80端口的配置,添加了一个9090的代理服务,配置之后启动服务
systemctl enable nginx systemctl start nginx |
体验测试
通过 https://example.com:9090 访问AppRTC服务
再找另外一个用户同时打开浏览器,输入相同的号码并JOIN,即可实现视频通话。
另外在目录下的~/apprtc/src/web_app/html/params.html
网页中自定义了一些配置参数,可以在URL中自定义WebRTC的参数,比如打开高清摄像头、关闭音频等等,具体参考这个页面即可。
采用默认配置测试后,个人使用感觉效果如下
- 语音很清晰无噪音,两个用户使用手机外放离的很近的时候,可能是回声消除的原因会出噪音
- 视频感觉效果一般般,带宽占用也不高,毕竟是P2P模式,但并不是特别清晰
- 整体感觉和微信视频差不多,可能稍好一点
- 并没有找到测试turn的环境,这个环境下的效果不清楚
手机微信也可以的哦。