搭建WebRtc服務器

搭建WebRtc服務器

1、創建webrtc目錄(服務器存放位置,發佈時使用)php

  1. 建立webrtc目錄
cd /opt
sudo mkdir webrtc
sudo chmod 777 -R webrtc

2、安裝nodejs
兩種方式:node

  1. 方式一:
sudo apt-get update
sudo apt-get install nodejs-legacy nodejs
sudo apt-get install npm
  1. 方式二:
    a. 下載:https://nodejs.org/en/download/
    點擊「Linux Binaries (x86/x64)」下載
    b. 解壓到當前目錄(如當前爲:/home/thf/)
xz -d node-v8.9.1-linux-x64.tar.xz
tar -xvf node-v8.9.1-linux-x64.tar

c. 創建軟鏈接python

sudo ln -s /home/thf/node-v8.9.1-linux-x64/bin/node /usr/local/bin/node
sudo ln -s /home/thf/node-v8.9.1-linux-x64/bin/npm /usr/local/bin/npm

3、安裝Grunt環境
暫時關掉系統的代理
在ubuntu的「系統設置」的「網絡設置"中將代理設置方式爲none
重啓
直接安裝grunt-clilinux

sudo npm -g install grunt-cli

記得恢復代理爲後續安裝作準備
4、安裝Python和jdknginx

sudo apt-get install python python-requests
sudo apt-get install openjdk-8-jdk

5、安裝Google App Engine SDK for Pythongit

  1. 下載https://cloud.google.com/sdk/docs/#linux
    選擇對應版本下載
  2. 解壓到指定(如:/opt/webrtc)目錄
sudo tar zxvf google-cloud-sdk-183.0.0-linux-x86_64.tar.gz -C /opt/webrtc
sudo chmod 777 -R /opt/webrtc/google-cloud-sdk
  1. 配置
sudo gedit /etc/profile

將路徑添加到PATH項上github

export PATH=$PATH:/opt/webrtc/google-cloud-sdk/bin

6、下載服務器源碼(房間服務器和信令服務器)golang

  1. 下載服務器源碼 https://github.com/webrtc/apprtc
  2. 解壓到指定目錄(如:/home/thf/Projects/apprtc-master)後進入目錄,配置編譯依賴:
npm install

編譯:web

grunt build --force

7、配置房間服務器
主要是src/app_engine目錄下的apprtc.py和constants.py文件。
對於src/app_engine目錄下的文件每次修改後需執行命令grunt build從新編譯,
也能夠直接編輯out/app_engine目錄下的apprtc.py和constants.py避免從新編譯。
修改constants.py,TURN_BASE_URL須要填寫本機的ip地址(注意:使用localhost會有錯誤):數據庫

#TURN_BASE_URL = 'https://computeengineondemand.appspot.com'
TURN_BASE_URL = 'http://10.10.29.56:7002'
#TURN_URL_TEMPLATE = '%s/turn?username=%s&key=%s'
TURN_URL_TEMPLATE = '%s/turn.php?username=%s&key=%s'
#CEOD_KEY = '4080218913'
CEOD_KEY = '1234'
#ICE_SERVER_BASE_URL = 'https://networktraversal.googleapis.com'
ICE_SERVER_BASE_URL = 'http://10.10.29.56:7002'
WSS_INSTANCES = [{   
    #WSS_INSTANCE_HOST_KEY: 'apprtc-ws.webrtc.org:443',
    WSS_INSTANCE_HOST_KEY: '10.10.29.56:7001', 
    WSS_INSTANCE_NAME_KEY: 'wsserver-std',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
  }, {
    #WSS_INSTANCE_HOST_KEY: 'apprtc-ws-2.webrtc.org:443',
    WSS_INSTANCE_HOST_KEY: '10.10.29.56:7001',
    WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
}]

修改apprtc.py:

if wss_tls and wss_tls == 'false':
  wss_url = 'ws://' + wss_host_port_pair + '/ws'
  wss_post_url = 'http://' + wss_host_port_pair
else:
  #wss_url = 'wss://' + wss_host_port_pair + '/ws'
  wss_url = 'ws://' + wss_host_port_pair + '/ws'
  #wss_post_url = 'https://' + wss_host_port_pair
  wss_post_url = 'http://' + wss_host_port_pair
def make_pc_config(ice_transports):
  config = {
  #'iceServers': [],
  'iceServers': [{"urls":"stun:10.10.29.56"},{"urls":"turn:lin@10.10.29.56","credential":"1234"}],
  'bundlePolicy': 'max-bundle',
  'rtcpMuxPolicy': 'require'
  };
if ice_transports:
  config['iceTransports'] = ice_transports
  return config

把原來的wss和https的scheme都改成ws和http,不要讓客戶端或者瀏覽器去使用SSL連接。如有第三方根證書的簽名機構頒發的證書可忽略。
修改完後從新執行:

grunt build
  1. 將/home/thf/Projects/apprtc-master/out/app_engine目錄拷貝到服務器目錄/opt/webrtc/(發佈時使用)
  2. 配置啓動腳本(發佈時使用)
    新建啓動腳本startAppRtc.sh:
export APPRTC_APP=/opt/webrtc/app_engine
export HOST="--host=192.168.164.128"
export PORT="--port=7000"
dev_appserver.py $HOST $PORT --enable_host_checking false $APPRTC_APP

調試階段可直接配置啓動腳本指向/home/thf/Projects/apprtc-master/out/app_engine(這樣就不用每次修改編譯後要從新拷貝到opt目錄下)
新建啓動腳本startAppRtc.sh:

export APPRTC_APP=/home/thf/Projects/apprtc-master/out/app_engine
export HOST="--host=192.168.164.128"
export PORT="--port=7000"
dev_appserver.py $HOST $PORT --enable_host_checking false $APPRTC_APP

若是GAE報白名單錯誤,則啓動參數中添加:

--enable_host_checking false

8、安裝GO環境

下載GO安裝包並解壓

wget https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz --no-check-certificate
tar xvf go1.9.2.linux-amd64.tar.gz
sudo mv go /usr/lib

編輯打開文件/etc/profile(也可根據本身需求選擇其餘環境配置文件編輯),在文件末尾添加兩行

export GOROOT=/usr/lib/go
export PATH=$PATH:$GOROOT/bin

保存退出執行

source /etc/profile

9、配置信令服務器

  1. 新建目錄(collider_root)用於存放Collider的go代碼程序。
sudo mkdir -p /opt/webrtc/collider_root
sudo mkdir /opt/webrtc/collider_root/src
sudo chmod 777 -R /opt/webrtc/collider_root
  1. /etc/profile中添加
export GOPATH=/opt/webrtc/collider_root
export PATH=$PATH:$GOPATH/bin
  1. 創建連接(也能夠直接將~/Projects/apprtc-master/src/collider/目錄中的collider、collidermain、collidertest直接拷貝到~/collider_root/src目錄下)
ln -sf ~/Projects/apprtc-master/src/collider/collider $GOPATH/src/
ln -sf ~/Projects/apprtc-master/src/collidermain $GOPATH/src/
ln -sf ~/Projects/apprtc-master/src/collider/collidertest $GOPATH/src/
  1. 編輯$GOPATH/collidermain/main.go,修改房間服務器爲咱們前面的房間服務器:
//var roomSrv = flag.String("room-server", "https://appr.tc", "The origin of the room server")
var roomSrv = flag.String("room-server", "http://10.10.29.56:7000", "The origin of the room server")
  1. 編輯$GOPATH/collider/collider.go,設置信令服務器所須要用的HTTPS的證書文件, 找到以下代碼,註釋後改成這樣:
//e = server.ListenAndServeTLS("/cert/cert.pem", "/cert/key.pem")
e = server.ListenAndServeTLS("/etc/nginx/apprtc.diveinedu.com.crt", "/etc/nginx/apprtc.diveinedu.com.key")

六、安裝信令服務器依賴和collidermain

go get collidermain
go install collidermain

若go get collidermain命令運行失敗(https訪問致使),那麼則用下面這個麻煩的方法:
自行下載:https://www.golangtc.com/static/download/packages/golang.org.x.net.tar.gz
而後解壓到/opt/webrtc/collider_root/src目錄

tar xvf golang.org.x.net.tar.gz
mv golang.org /opt/webrtc/collider_root/src
cd $GOPATH/src
go install golang.org/x/net/websocket/
go get collidermain
go install collidermain

七、運行

/opt/webrtc/collider_root/bin/collidermain -port=7001 -tls=false

八、測試

go test collider

10、STUN/TURN/ICE服務器的搭建

  1. 安裝環境
sudo apt-get install libssl-dev libevent-dev

二、下載源碼(詳細閱讀安裝手冊 INSTALL)

cd /home/thf/Projects
wget http://turnserver.open-sys.org/downloads/v4.5.0.7/turnserver-4.5.0.7.tar.gz
tar xvfz turnserver-4.5.0.7.tar.gz
  1. 編譯和安裝
cd turnserver-4.5.0.7
./configure
make
sudo make install
  1. turnserver配置
    a) turnserver源碼的example/etc目錄中有提供turnserver的默認配置文件,以供咱們使用,咱們須要分別拷貝turnserver所須要的三個配置文件:
    首先在/etc目錄下建立turnserver配置的存放目錄:
sudo mkdir /etc/turnserver/

注: 這一步並非必須的,由於turnserver啓動時能夠指定任意目錄的配置文件。
b) 拷貝conf配置腳本
進入turnserver目錄

cd turnserver-4.5.0.7
sudo cp ./examples/etc/turnserver.conf /etc/turnserver/

注: 在 examples 目錄下的此配置文件,每一個配置項均有說明,這樣能夠明白具體的參數含義;
此配置文件本身也能夠新建,而後將後面章節中的內容直接粘貼進去;
c) 拷貝 pem 祕鑰文件
爲了作些明顯的區分,咱們將*.pem祕鑰文件也拷貝到/etc/turnserver/目錄(也可由 openssl命令生成,這裏咱們偷個懶,直接用默認的):

sudo cp ./examples/etc/turn_server_*.pem /etc/turnserver/

這裏咱們拷貝的祕鑰文件,將在上一步的 turnserver.conf 配置文件中指定。
d) 生成turnserver用戶(可選)
經過turnadmin執行簡單的命令,指定相應的用戶名、密碼、域名,既可將此帳號添加到turnserver的數據庫中;
以下:

sudo turnadmin -a -u 用戶名 -p 密碼 -r 域名

執行成功後,經過turnadmin -l既可查看新建立的用戶名及域名:

sudo turnadmin -a -u thf -p 123456 -r thf.com
turnadmin -l
thf[thf.com]代表建立成功!

其實這裏咱們指定的密碼和域名暫時都是可有可無的,由於後面咱們在啓動turnserver時,能夠經過相關參數,給其指定固定的域名和密碼。
e) 配置 turnserver.conf
建議:將以前拷貝的 turnserver.conf 文件備份,並新建一個 turnserver.conf 文件,將一下內容拷貝進入:

#日誌輸出級別,turnserver 啓動時加上 -v,能夠獲得更清晰的日誌輸出
Verbose
#消息驗證,WebRTC 的消息裏會用到
#fingerprint
#webrtc 經過 turn 中繼,必須使用長驗證方式
#lt-cred-mech
# ICE REST API 認證須要
use-auth-secret
# REST API 加密所需的 KEY
# 這裏咱們使用「靜態」的 KEY,Google 本身也用的這個
static-auth-secret=1234
#用戶登陸域,下面的寫法能夠不改變它,由於再啓動 turnserver 時,能夠經過指定參數覆蓋它
realm=<填寫你本身的域名>
#可爲 TURN 服務提供更安全的訪問
stale-nonce
# SSL 須要用到的, 生成命令:
# sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
listening-ip=192.168.164.128
listening-port=7002
tls-listening-port=7002
#relay-ip=192.168.164.128
external-ip=192.168.164.128
relay-threads=50
use-auth-secret
static-auth-secret=1234
#user=lin:1234
#user=xml:1234
#userdb=/etc/turnuserdb.conf
max-bps=1000000
cert=/etc/turnserver/turn_server_cert.pem
pkey=/etc/turnserver/turn_server_pkey.pem
#max-bps=102400 
pidfile="/var/run/turnserver.pid"
log-file=/home/thf/Projects/turnserver-4.5.0.7/turn.log
#屏蔽 loopback, multicast IP地址的 relay
no-loopback-peers
no-multicast-peers
#啓用 Mobility ICE 支持(不懂)
mobility
#禁用本地 telnet cli 管理接口
no-cli
  1. 啓動 turnserver
    經過 turnserver 實現 Peers 默認經過 turn 中繼轉發媒體數據流,進行音視頻通話,其中一個關鍵點是coturn 須要佈置到一個同時鏈接到兩個網絡的服務器(公網)上,如網卡一:公網,網卡二:私網(暫且還用不到),且須要同時聯通網絡,不然會出現兩個Peers 只要開始鏈接,turnserver就會報 Allocation timeout的錯誤,目前緣由須要經過跟蹤代碼去分析,暫時還未明確具體緣由。
    啓動turnserver能夠經過以下命令進行啓動:
turnserver -v -L 192.168.164.128 -a -f -r 192.168.164.128 -c /etc/turnserver/turnserver.conf

以上命令:經過 -v 指定日誌輸出級別; -L 指定用於綁定的網卡 IP 地址;-a 指定使用長期憑證機制,turn中繼轉發模式,必須使用長期憑證機制;-f 指定 turn 消息使用 fingerprint;-r 指定使用的域名,將覆蓋 turnserver.conf 文件中的配置;-C 指定配置文件路徑。

https://webrtc.github.io/samples/src/content/pee/rconnection/trickle-ice
檢驗打洞服務器是否正常

內網
room-server :10.10.29.56:7000
single_server:10.10.29.56:7001
turn_server :10.10.29.56:7002

注意:因本服務器搭建在虛擬機中,而主機處於局域網中,所以主機和虛擬機構成了第二級的局域網(不一樣網絡結構請注意根據本身的IP的配置關係來配置IP)。

本示例網絡情況:
主機和虛擬機組成的局域網IP分別爲:
主機:192.168.164.1
虛擬機:192.168.164.128
主機所處的局域網中主機的IP:10.10.29.56

因此

  1. 服務器啓動參數的中的服務器IP配置爲服務器所在虛擬機的二級局域網IP:192.168.164.128
  2. 服務器之間的訪問IP參數則要配置成主機所處的一級局域網IP:10.10.29.56
    另外,局域網內的兩個終端通信,是不須要啓動STUN/TURN/ICE服務器的。

本例的STUN/TURN/ICE服務器的打洞功能沒有通過外網的實際檢測,須要進一步驗證。

錯誤處理:

  1. 鏈接房間服務器的時候報錯:
python2.7/urllib2.py", line 1198, in do_open raise URLError(err)
URLError:<urlopen error [Errno 111] Connection refused>

處理方式: 關掉系統的代理 在ubuntu的「系統設置」的「網絡設置"中將代理設置方式爲none

相關文章
相關標籤/搜索