本文使用apprtc搭建webrtc.
系統:ubuntu20.04
外網IP:xxx.xxx.xxx.xxx
内網IP: 192.168.0.96
1 環境搭建
webrtc的伺服器包括:房間伺服器(apprtc)、信令伺服器(collider)、防火牆打洞伺服器(coturn)、web/websocket代理伺服器(nginx)。
1.1 coturn
安裝
apt update
apt install coturn
配置
> vi /etc/default/coturn
TURNSERVER_ENABLED=1
> vi /etc/turnserver.conf
listening-port=3478
tls-listening-port=5349
listening-ip=192.168.0.96
relay-ip=192.168.0.96
external-ip=xxx.xxx.xxx.xxx
server-name=xxx.xxx.xxx.xxx
realm=xxx.xxx.xxx.xxx
lt-cred-mech
user=ouyang:123456
userdb=/var/lib/turn/turndb
cert=/usr/local/etc/turn_server_cert.pem
pkey=/usr/local/etc/turn_server_pkey.pem
no-stdout-log
no-stun
log-file=/var/tmp/turnserver.log
pidfile="/var/run/turnserver.pid"
重新開機
service coturn restart
測試
turnadmin -a -u ouyang -r xxx.xxx.xxx.xxx -p 123456
turnutils_uclient -v -t -T -u ouyang -w 123456 xxx.xxx.xxx.xxx
1.2 apprtc
1.1.1 安裝依賴環境
# 安裝nodejs
sudo apt install nodejs
# 安裝npm
sudo apt-get install npm
# 安裝grunt
sudo npm -g install grunt-cli
# 安裝python-pip子產品
wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
sudo python ez_setup.py --insecure
wget https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz#md5=35f01da33009719497f01a4ba69d63c9
tar -xf pip-9.0.1.tar.gz
cd pip-9.0.1
sudo python setup.py install
sudo ln -s /usr/local/python27/bin/pip /usr/bin/pip
# 安裝requests
pip install certifi urllib3 idna chardet
pip install openssl-python
git clone git://github.com/kennethreitz/requests.git
cd requests/
sudo python setup.py install
# 安裝GoogleAppEngine
sudo pip install WebTest
wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.50.zip
unzip google_appengine_1.9.50.zip
vi /etc/profile
# 添加”export PATH=$PATH:/home/webrtc/google_appengine”
source /etc/profile
# 安裝go
sudo apt install golang-go
# 檢測go版本
go version
# 建立go工作目錄
mkdir -p ~/webrtc/goworkspace/src
# 配置環境變量:在/etc/profile檔案最後增加一行:
vim /etc/profile
# 添加"export GOPATH=/home/lqf/webrtc/goworkspace"
source /etc/profile
1.1.2 apprtc安裝配置
# 代碼下載下傳
git clone https://github.com/webrtc/apprtc
# 連結collider源碼
ln -s ~/webrtc/apprtc/src/collider/collider $GOPATH/src
ln -s /home/ouyang/webrtc/apprtc/src/collider/collidermain $GOPATH/src
ln -s /home/ouyang/webrtc/apprtc/src/collider/collidertest $GOPATH/src
# 編譯collidermain
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
# 配置證書檔案
mkdir /cert
cd /cert
mv xxx.cert cert.pem
mv xxx.key key.pem
# 運作collidermain
$GOPATH/bin/collidermain -port=8089 -tls=false -room-server="http://xxx.xxx.xxx.xxx:8080"
安裝apprtc代碼中的grunt依賴
cd apprtc
npm install
grunt build //編譯
修改配置檔案
主要是src/app_engine目錄下的apprtc.py和constants.py檔案。對于src/app_engine目錄下的檔案每次修改後需執行指令grunt build重新編譯
修改檔案:src/app_engine/constants.py
#ICE_SERVER_OVERRIDE = None
ICE_SERVER_OVERRIDE = [
{
"urls": [
"turn:xxx.xxx.xxx.xxx:3478?transport=udp",
"turn:xxx.xxx.xxx.xxx:3478?transport=tcp"
],
"username": "ouyang",
"credential": "123456"
},
{
"urls": [
"stun:xxx.xxx.xxx.xxx:3478"
]
}
]
WSS_INSTANCES = [{
WSS_INSTANCE_HOST_KEY: 'xxx.xxx.xxx.xxx:8089',
WSS_INSTANCE_NAME_KEY: 'ouyang',
WSS_INSTANCE_ZONE_KEY: '123456'
}]
修改檔案:src/app_engine/apprtc.py
# iceServers will be filled in by the TURN HTTP request.
def make_pc_config(ice_transports, ice_server_override):
config = {
#'iceServers': [],
'iceServers': [{"urls":"stun:xxx.xxx.xxx.xxx"},{"urls":"turn:[email protected]","credential":"123456"}],
'bundlePolicy': 'max-bundle',
'rtcpMuxPolicy': 'require'
};
if ice_server_override:
config['iceServers'] = ice_server_override
if ice_transports:
config['iceTransports'] = ice_transports
return config
編譯
grunt build
運作房間伺服器
dev_appserver.py --host=0.0.0.0 ./out/app_engine
在浏覽器中通路房間伺服器
http://10.8.6.196:8080
1.3 nginx
1.3.1 安裝
sudo apt update
# 安裝依賴庫
sudo apt install build-essential libtool libpcre3 libpcre3-dev zlib1g-dev openssl
# 下載下傳nginx
wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar xvzf nginx-1.15.8.tar.gz
cd nginx-1.15.8
# 配置
./configure --with-http_ssl_module
# 編譯
make
# 安裝
sudo make install
注:
預設安裝目錄: /usr/local/nginx
啟動:sudo /usr/local/nginx/sbin/nginx
停止:sudo /usr/local/nginx/sbin/nginx -s stop
1.3.2 配置web代理
vi /usr/local/nginx/conf/conf.d/apprtc-https-proxy.conf
upstream roomserver {
server xxx.xxx.xxx.xxx:8080;
}
server {
listen 443 ssl;
ssl_certificate /root/cert/cert.pem;
ssl_certificate_key /root/cert/key.pem;
charset utf-8;
# ip位址或者域名
server_name xxx.xxx.xxx.xxx;
location / {
# 轉向代理的位址
proxy_pass http://roomserver$request_uri;
proxy_set_header Host $host;
}
}
1.3.3 配置websocket代理
vi /usr/local/nginx/conf/conf.d/apprtc-websocket-proxy.conf
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server xxx.xxx.xxx.xxx:8089;
}
server {
listen 8088 ssl;
ssl_certificate /root/cert/cert.pem;
ssl_certificate_key /root/cert/key.pem;
server_name xxx.xxx.xxx.xxx;
location /ws {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_connect_timeout 4s;
proxy_read_timeout 6000s;
proxy_send_timeout 6000s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
1.3.4 運作
加入配置檔案
vi /usr/local/nginx/conf/nginx.conf
include /usr/local/nginx/conf/conf.d/*.conf;
運作
# 停止
sudo /usr/local/nginx/sbin/nginx -s stop
# 啟動
sudo /usr/local/nginx/sbin/nginx
1.4 bug
# 問題1
Messages:Failed to start signaling: Failed to execute 'pushState' on 'History'
解決:
vi apprtc/src/web_app/js/appcontroller.js
AppController.prototype.displaySharingInfo_ = function(roomId, roomLink) {
roomLink=roomLink.replace("http","https");
this.roomLinkHref_.href = roomLink;
this.roomLinkHref_.text = roomLink;
this.roomLink_ = roomLink;
this.pushCallNavigation_(roomId, roomLink);
this.activate_(this.sharingDiv_);
};
# 問題2
Firefox 無法建立到 wss://xxx.xxx.xxx.xxx:8088/ws 伺服器的連接配接。
解決
在浏覽器上添加例外:
xxx.xxx.xxx.xxx:8089
xxx.xxx.xxx.xxx:443
2 運作
# 重新開機coturn
service coturn restart
# 啟動信令伺服器
$GOPATH/bin/collidermain -port=8089 -tls=false -room-server="http://xxx.xxx.xxx.xxx:8080" &
# 啟動房間伺服器
dev_appserver.py --host=0.0.0.0 ./out/app_engine &
# 重新開機nginx
sudo /usr/local/nginx/sbin/nginx -s stop
sudo /usr/local/nginx/sbin/nginx
3 測試
打開浏覽器
https://xxx.xxx.xxx.xxx
參考:
https://zhuanlan.zhihu.com/p/80936998
https://blog.csdn.net/ts_dchs/article/details/97402024
https://blog.csdn.net/lingshengxueyuan/article/details/100519054
https://github.com/webrtc/apprtc
https://github.com/webrtc/apprtc/blob/master/src/collider/README.md