一蔚鸥、環(huán)境準備:
nodejs環(huán)境:
獲取nodejs 資源 :curl --silent --location
https://rpm.nodesource.com/setup_5.x | bash -
這里的5.x換成你需要安裝的版本
在執(zhí)行
yum install -y nodejs
python和jdk環(huán)境:
查看yum庫中的Java安裝包 .◆輸入:yum -y list java*
查找對應系統(tǒng) 下的安裝包下載
yum -y install java-1.8.0-openjdk-devel.x86_64
yum install python python-requests
二秋忙、安裝Google App Engine SDK for Python
1. 下載[https://cloud.google.com/sdk/docs/#linux](https://link.jianshu.com?t=https%3A%2F%2Fcloud.google.com%2Fsdk%2Fdocs%2F%23linux)
選擇對應版本下載
例如:https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-208.0.0-linux-x86_64.tar.gz
2. 解壓到指定目錄
``
sudo tar zxvf google-cloud-sdk-208.0.0-linux-x86_64.tar.gz
sudo chmod 777 -R /google-cloud-sdk
- 配置
sudo vi /etc/profile
將路徑添加到PATH項上
export PATH=$PATH:/root/webrtc/google-cloud-sdk/bin
source /etc/profile
三、房間服務器部署:
apprtc源碼下載:
git clone https://github.com/webrtc/apprtc.git
cd apprtc/
npm i -g grunt-cli
npm install
主要是src/app_engine目錄下的apprtc.py和constants.py文件畜吊。
對于src/app_engine目錄下的文件每次修改后需執(zhí)行命令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 = 'https://rtc.tlifang.com:3478'
TURN_URL_TEMPLATE = '%s/turn?username=%s&key=%s'
#CEOD_KEY = '4080218913'
CEOD_KEY = 'myvm'
ICE_SERVER_BASE_URL = 'https://rtc.tlifang.com'
ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
WSS_INSTANCES = [{
#WSS_INSTANCE_HOST_KEY: 'apprtc-ws.webrtc.org:443',
WSS_INSTANCE_HOST_KEY: 'rtc.tlifang.com:8089',
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: 'rtc.tlifang.com:8089',
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
把原來的wss和https的scheme都改為ws和http榜晦,不要讓客戶端或者瀏覽器去使用SSL鏈接冠蒋。若有第三方根證書的簽名機構頒發(fā)的證書可忽略。
修改完后重新執(zhí)行:
grunt build
四乾胶、安裝GO環(huán)境
方式一抖剿、
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install golang -y
方式二、
下載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
(可以選擇高點的版本或者其它方式安裝go環(huán)境)
sudo mv go /usr/lib
編輯打開文件/etc/profile(也可根據(jù)自己需求選擇其他環(huán)境配置文件編輯)胚吁,在文件末尾添加兩行
export GOROOT=/usr/lib/go
export PATH=$PATH:$GOROOT/bin
保存退出執(zhí)行
source /etc/profile
五牙躺、配置信令服務器
- 新建目錄(collider_root)用于存放apprtc里的Collider的go代碼程序。
sudo mkdir -p /root/webrtc/collider_root
sudo mkdir /root/webrtc/collider_root/src
sudo chmod 777 -R /root/webrtc/collider_root
- /etc/profile中添加
export GOPATH=/root/webrtc/collider_root
export PATH=$PATH:$GOPATH/bin
- 建立鏈接(也可以直接將/root/apprtc/src/collider/目錄中的collider腕扶、collidermain孽拷、collidertest直接拷貝到~/collider_root/src目錄下)
ln -sf ~/apprtc-master/src/collider/collider $GOPATH/src/
ln -sf ~/apprtc-master/src/collidermain $GOPATH/src/
ln -sf ~/apprtc-master/src/collider/collidertest $GOPATH/src/
- 編輯$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", "https://rtc.tlifang.com", "The origin of the room server")
- 編輯$GOPATH/collider/collider.go,設置信令服務器所需要用的HTTPS的證書文件, 找到如下代碼,注釋后改為這樣:
//e = server.ListenAndServeTLS("/cert/cert.pem", "/cert/key.pem")
e = server.ListenAndServeTLS("/etc/nginx/tlifang.com.crt", "/etc/nginx/tlifang.com.key")
6、安裝信令服務器依賴和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
7脓恕、運行
/opt/webrtc/collider_root/bin/collidermain -port=7001 -tls=false
六、STUN/TURN/ICE服務器的搭建
- 安裝環(huán)境
yum install openssl-devel
yum install libevent2
yum install libevent-devel
yum install sqlite
yum install sqlite-devel
yum install postgresql-devel
yum install postgresql-server
yum install mysql-devel
yum install mysql-server
yum install hiredis
yum install hiredis-devel
or
sudo apt-get install libssl-dev libevent-dev
2窿侈、下載源碼(詳細閱讀安裝手冊 INSTALL)
git clone https://github.com/coturn/coturn
cd coturn
./configure
make
make install
or
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
- 編譯和安裝
cd coturn
./configure
make
sudo make install
- coturn配置
a) coturn源碼的example/etc目錄中有提供coturn的默認配置文件炼幔,以供我們使用,我們需要分別拷貝turnserver所需要的三個配置文件:
首先在/etc目錄下創(chuàng)建turnserver配置的存放目錄:
sudo mkdir /etc/turnserver/
注: 這一步并不是必須的史简,因為turnserver啟動時可以指定任意目錄的配置文件乃秀。
b) 拷貝conf配置腳本
進入coturn目錄
cd coturn
sudo cp ./examples/etc/turnserver.conf /etc/turnserver/
``
注: 在 examples 目錄下的此配置文件,每個配置項均有說明圆兵,這樣可以明白具體的參數(shù)含義跺讯;
此配置文件自己也可以新建,然后將后面章節(jié)中的內容直接粘貼進去殉农;
c) 拷貝 pem 秘鑰文件
為了做些明顯的區(qū)分刀脏,我們將*.pem秘鑰文件也拷貝到/etc/turnserver/目錄(也可由 openssl命令生成,這里我們偷個懶超凳,直接用默認的):
sudo cp ./examples/etc/turn_server_*.pem /etc/turnserver/
這里我們拷貝的秘鑰文件愈污,將在上一步的 turnserver.conf 配置文件中指定。
d) 生成coturn用戶(可選)
通過turnadmin執(zhí)行簡單的命令轮傍,指定相應的用戶名暂雹、密碼、域名金麸,既可將此賬號添加到coturn的數(shù)據(jù)庫中擎析;
如下:
sudo turnadmin -a -u 用戶名 -p 密碼 -r 域名
執(zhí)行成功后,通過turnadmin -l既可查看新創(chuàng)建的用戶名及域名:
sudo turnadmin -a -u myvm -p myvm -r rtc.tlifang.com
turnadmin -l
thf[thf.com]表明創(chuàng)建成功!
其實這里我們指定的密碼和域名暫時都是無關緊要的揍魂,因為后面我們在啟動turnserver時桨醋,可以通過相關參數(shù),給其指定固定的域名和密碼现斋。
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
這里我們使用“靜態(tài)”的 KEY限书,Google 自己也用的這個
static-auth-secret=myvm
用戶登錄域虫蝶,下面的寫法可以不改變它,因為再啟動 turnserver 時倦西,可以通過指定參數(shù)覆蓋它
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-device=eth0
listening-ip=192.168.164.128 --內網(wǎng)ip
listening-port=3478
tls-listening-port=7002
relay-ip=192.168.164.128
external-ip=192.168.164.128 --外網(wǎng)ip
relay-threads=50
use-auth-secret
static-auth-secret=myvm
user=myvm:0x7e3a2ed35d3cf7f19e2f8b015a186f54
(0x7e3a2ed35d3cf7f19e2f8b015a186f54 通過turnadmin -k -u myvm -r rtc.tlifang.com -p myvm
-k 表示生成一個long-term credential key
-u 表示用戶名
-p 表示密碼
-r 表示Realm域能真,(這個值的設置可能會有影響)。)
user=myvm:myvm
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
5. 啟動 turnserver
通過 turnserver 實現(xiàn) Peers 默認通過 turn 中繼轉發(fā)媒體數(shù)據(jù)流扰柠,進行音視頻通話粉铐,其中一個關鍵點是coturn 需要布置到一個同時連接到兩個網(wǎng)絡的服務器(公網(wǎng))上,如網(wǎng)卡一:公網(wǎng)卤档,網(wǎng)卡二:私網(wǎng)(暫且還用不到)蝙泼,且需要同時聯(lián)通網(wǎng)絡,否則會出現(xiàn)兩個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 指定用于綁定的網(wǎng)卡 IP 地址;-a 指定使用長期憑證機制琢唾,turn中繼轉發(fā)模式,必須使用長期憑證機制盾饮;-f 指定 turn 消息使用 fingerprint采桃;-r 指定使用的域名,將覆蓋 turnserver.conf 文件中的配置丘损;-C 指定配置文件路徑普办。
[https://webrtc.github.io/samples/src/content/pee/rconnection/trickle-ice](https://link.jianshu.com?t=https%3A%2F%2Fwebrtc.github.io%2Fsamples%2Fsrc%2Fcontent%2Fpee%2Frconnection%2Ftrickle-ice)
檢驗打洞服務器是否正常
七、grunt build 里的request安裝問題解決方法:
sudo pip uninstall requests
sudo pip uninstall urllib3
sudo yum remove python-urllib3
sudo yum remove python-requests
sudo yum install python-urllib3
sudo yum install python-requests
八徘钥、Nginx反向代理搭建
yum install php
location / {
#root html;
#index testssl.html index.html index.htm;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:18085/;
}
location /v1alpha/iceconfig {
#add_header Access-Control-Allow-Origin *;
#proxy_redirect off;
#proxy_set_header Host host; #proxy_set_header X-Real-IPremote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:3033/v1alpha/iceconfig;
}
ice.js編寫
var express = require('express')
var crypto = require('crypto')
var app = express()
var hmac = function (key, content) {
var method = crypto.createHmac('sha1', key)
method.setEncoding('base64')
method.write(content)
method.end()
return method.read()
}
app.post('/v1alpha/iceconfig', function (req, resp) {
var query = req.query
var key = 'myvm'
var time_to_live = 600
var timestamp = Math.floor(Date.now() / 1000) + time_to_live
var turn_username = timestamp + ':buck'
var password = hmac(key, turn_username)
return resp.send({
iceServers: [
{
urls: [
'stun:rtc.tlifang.com:3478',
'turn:rtc.tlifang.com:3478'
],
username: turn_username,
credential: password
}
]
})
})
app.listen('3033', function () {
console.log('server started')
})