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 的工具集。ofollow,noindex">
gcloud
包括本地佈署server以及佈署和管理你的應用的命令列工具。
其實我並不這麼認為,我覺得使用它增加了我的學習成本。當遇要問題時,我其實對它是束手無策的。
我們可以認為它就是一套佈署工具,可以幫我們佈署和啟動服務程式。我們使用它佈署啟動 room 伺服器。
AppRTC
房間與信令伺服器。該伺服器包括了房間的業務邏輯和信令處理邏輯。其中在 AppRTC中的 collier 目錄中是信令伺服器的實現。
除了 collider 命令伺服器外,其它的程式碼都是用python寫的。
Collider
是一種用 go 語言實現的基於 Socket/">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 上 CloneAppRTC 。在程式碼中包括了 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中設定的引數,否則使用命令列中指定的引數。
-
安裝 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)
- 下載Python" target="_blank" rel="nofollow,noindex">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相關的配置。這塊內容可以參考其它網友的文章。