天天看點

webrtc環境搭建

本文使用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

繼續閱讀