AppRTC(WebRTC)服务器搭建
轉自:https://www.jianshu.com/p/a19441034f17
前言
最近研究了幾天 appr.tc 服務器的搭建,主要目的是想在本地搭建一套 webrtc 服務器環境,可以做一些webrtc相關的實驗。
經過幾天的折騰,得到以下幾點結論:
一、最新的 appr.tc服務器是不能使用 非 https服務的。主要有兩種原因:1. chrome瀏覽器不支持在非https方式下打開音/視頻設備。2. appr.tc中的信令服務器(collider)不支持非 https 服務。
二、appr.tc搭建的服務可以使各端互通,但條件是必須使用第三方證書。第三方證書可以在阿里云申請或諾頓等安全公司申請。如果你是在公司內網搭建服務,那么可以使用nginx做個代理,將證書放到代理服務器端,這樣你本地服務器可以使用私有證書,這樣就沒任何問題了。
三、如果體用了第三方證書,并配有域名的話,請將下面所有的 IP:Port替換成你自己的域名。使用域名+路徑的方式,可以將不同的路徑映射到不同的端口上。
下面我就來描述一下如何搭建 appr.tc 服務。
搭建AppRTC Server的基本步驟
幾個重要的庫
在具體介紹 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 -port=8089 -tls=true -room-server="https://ip:port"當然,你還可以修改 collider/collidermain/main.go 文件,文件中的tls, port, room-server分別對應上面命令行中的參數。也就是說,如果在啟動命令中不加任何參數,它就會使用 main.go中設置的參數,否則使用命令行中指定的參數。
room-server 指的是 apprtc 服務,所以這里要指定 apprtc的端口,https 默認是 8081
注:在網上看到很多文章說 collider 可以將tls設置為 false,經我親測,將 tls設置為 false后,collider就不能正常工作了,如果有成功的可以與我聯系。
安裝并啟動 Coturn TURN server
-
首先,下載Coturn源碼
-
編譯并安裝
./configure --prefix=/usr/local/turnserver sudo make && sudo make install
進入到Coturn源碼目錄下 -
創建用戶
sudo turnadmin -a -u 用戶名 -p 密碼 -r 域(寫你自己服務器的IP)使用上面命令創建的用戶是一個長期用戶,所以在下面配置文件中的lt-cred-mech要設置上。創建好用戶后,可以使用下面的命令查看創建的用戶
turnadmin -l -
設置好 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=<填寫你自己的服務器的IP>#這個特別關鍵,如果這里不是你的服務器的IP,數據就不通 #可為 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 你的服務器的IP通過 -v 指定日志輸出級別; -L 指定用于綁定的網卡 IP 地址;-a 指定使用長期憑證機制,turn中繼轉發模式,必須使用長期憑證機制;-f 指定 turn 消息使用 fingerprint;-r 指定使用的域名,將覆蓋 turnserver.conf 文件中的配置;
-
測試 Coturn 服務
- 打開 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/這個網址
- 在該網址上增加 turn 服務。如 turn:IP:3478
- 填入用戶名和密碼。
布署與啟動 room 服務(appr.tc)
-
下載 Google app engine SDK for Python
下載之后不需要按照常 Google 官方文檔中的說明操作,只需要將它的 bin 目錄添加環境變量中即可。即添加 "export PATH=$PATH:/xxx/xxx/bin到 ~/.bashrc 文件中。這樣就可以訪問 dev_appserver.py 這個工具了。
-
安裝 node.js
sudo apt-get install nodejs或通過源碼安裝。
-
安裝 grunt
sudo apt-get install npm sudo npm -g install grunt-cli -
打開 apprtc/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')上面的配置是為了動態獲取 stun/turn 服務器的密碼,所以其IP地址與端口號應該與下面的 ICE REST API 服務中的一樣,即端口號為 3033。
以及
# 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' }]上面這個配置是為了使房間服務器與信令服務器 collider 進行通訊,所以配置的 IP 和 端口要與上面設置collider時的一樣。
-
安裝 JDK
sudo apt install openjdk-8-jdk
通過java -version 判斷是否已經安裝了 JDK,如果沒有安裝的話,先裝 JDK安裝上。別外 JDK只能安裝 JDK7 或 JDK8,太高或太低的版本都不行。 -
編譯 apprtc
sudo npm install # 安裝 apprtc 中需要的 nodejs 依賴包,其存放在 package.json 文件中 sudo grunt build
修改了 appr.tc 的代碼后,使用 grunt build 進行編譯,在 apprtc 目錄下執行下面命令: -
布署room server
<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
配置 ICE REST API 服務
實現 js 代碼
var https = require('https') var fs = require('fs') var express = require('express') var crypto = require('crypto') var app = express()var option = {key : fs.readFileSync('/cert/key.pem'),cert: fs.readFileSync('/cert/cert.pem'), }var hmac = function (key, content) {var method = crypto.createHmac('sha1', key)method.setEncoding('base64')method.write(content)method.end()return method.read() }app.get('/iceconfig', function (req, resp) {var query = req.queryvar key = '4080218913'var time_to_live = 3600*24var timestamp = Math.floor(Date.now() / 1000) + time_to_livevar turn_username = timestamp + ':' + 'garrylea'var password = hmac(key, turn_username)resp.header("Access-Control-Allow-Origin", "*"); //設置跨域訪問return resp.send({iceServers: [{urls: ['turn:ip:3478?transport=tcp','turn:ip:3478?transport=udp','turn:ip:3479?transport=tcp','turn:ip:3479?transport=udp',],username: turn_username,credential: password}]}) })var server = https.createServer(option, app);server.listen('3033', function () {console.log('server started') })上面代碼中有幾點要說明:
啟動 ICE REST API 服務
node index.js配置服務器遇到的問題
- 私有證書問題。使用私有證書導致只能瀏覽器之間進行通訊。移動端與瀏覽器之間不能通訊。解決辦法是花錢申請第三方證書。
- 地址映射錯誤。使用域名后,映射的地址出錯了。比如通過apprtc.xxxx.com/iceconfig映射到 192.168.31.6:3033這個地址是不對的,應該映射到 192.168.31.3033/iceconfig這樣才行。
- turn服務不通問題。后來經多方查詢,是由于設置的域不對,之前設置的是north.gov,應該設置為你的服務器的IP地址就可以了。
- ICE REST API 使用http問題。應該改為https才能訪問。也就是說所有的地址都應該是https的,而不能有的是https,有的是http。
- 用戶退出報錯。原因是由于在 collider服務的 src/collider/collidermain/main.go文件設置的room-server地址不是域名的方式,也就是說不是第三方證書的方式,這樣就造成用戶退出時,命令服務器通知 room-server時,由于證書的原因導致出錯。
- 換成域名后瀏覽器報 Failed to start signaling: Failed to execute 'pushState' on 'History': A history state object with URL這樣的錯誤。可以在 src/web_app/js/appcontroller.js 文件中將 window.history.pushState({'roomId': roomId, 'roomLink': roomLink}, roomId, roomLink);這一句注釋掉就好了。
小結
總的來說,配置 appr.tc 服務還是蠻復雜的。在網上看了很多文章沒有一個可以配通過的。在配置的過程中每一個參數都要仔細的琢磨生怕配錯。
總之來之不易,希望可以幫到用到的人。
?
總結
以上是生活随笔為你收集整理的AppRTC(WebRTC)服务器搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS开发 开发者账户介绍
- 下一篇: 飞控打信息打印