WebRTC之服務(wù)器搭建

前言

在前面的WebRTC介紹中我們已經(jīng)介紹了WebRTC的編譯以及成功地把WebRTC在Android Studio中運(yùn)行了起來槽奕,詳情請猛擊<WebRTC之Android編譯>
《WebRTC導(dǎo)入Android Studio》

在后面的學(xué)習(xí)過程中,我們將進(jìn)一步使用WebRTC實(shí)現(xiàn)Android端的實(shí)時通信對話所森。為了方便后續(xù)的開發(fā)和測試夯接,今天我們來搭建WebRTC的服務(wù)器環(huán)境盔几。

安裝環(huán)境

筆者使用的云服務(wù)器是Ubuntu 16.04。

注意盡量使用與筆者相同版本的系統(tǒng)上鞠,不然可能因?yàn)榘惭b的各種環(huán)境版本不同而導(dǎo)致搭建失敗

需要在云服務(wù)器后臺開放(出入規(guī)則)端口: 3478芍阎、8080、8089轮听、80蕊程、443

本服務(wù)器的搭建教程主要來源于WebRTC的開源項(xiàng)目apprtc:https://github.com/webrtc/apprtc

1驼唱、安裝JDK

#如果是全新的系統(tǒng)則需要更新一下apt
apt-get update 
apt-get upgrade
# 安裝JDK8
apt-get install openjdk-8-jdk 
# 檢測下java是否安裝成功玫恳,如果成功輸出版本號則安裝成功
java -version

2、安裝node.js

apt install nodejs-legacy

# 查看一下版本 v4.2.6
node --version

apt-get install npm 
# 查看一下版本 3.5.2
npm --version

# 安裝gnurt掀序,盡量帶上版本號不恭,不然可能報(bào)node版本太低的錯
 npm -g install grunt-cli@1.3.2
# 查看下版本  grunt-cli v1.3.2
grunt --version

3财饥、安裝Python和Python-webtest (python2.7)

apt-get install python 
apt-get install python-webtest

python -V
#Python 2.7.12

4钥星、安裝go

apt install golang-go

# 查看版本 go version go1.6.2 linux/amd64
go version 

#創(chuàng)建go工作目錄
mkdir -p /root/webrtc/goWorkspace/src
#配置環(huán)境變量:在/etc/profile文件最后增加一行:
export GOPATH=/root/webrtc/goWorkspace
# 刷新一下環(huán)境變量
source /etc/profile

在使用vi命令行的時候可能會遇到方向鍵亂位的問題谦炒,由于ubuntu 預(yù)安裝的是tiny版本,所以會導(dǎo)致我們在使用時候產(chǎn)生上述不便缕探,但是我們安裝vim的full版本后撕蔼,鍵盤所在鍵在vi下就很正常了。
解決方法:卸載tiny 版本 sudo apt-get remove vim-common琳骡,安裝full 版本 sudo apt-get install vim

5讼溺、安裝google_appengine

#當(dāng)前目錄:root/webrtc/
wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.40.zip
# 安裝unzip
apt-get install unzip
unzip google_appengine_1.9.40.zip

#配置環(huán)境變量:在/etc/profile文件最后增加一行:
export PATH=$PATH:/root/webrtc/google_appengine
source /etc/profile

6怒坯、安裝libevent

#當(dāng)前目錄:root/webrtc/
#https://github.com/coturn/coturn/wiki/CoturnConfig
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure
make
make install

7剔猿、安裝apprtc

#當(dāng)前目錄:root/webrtc/
# 注意如果沒有g(shù)it的話归敬,需要apt install git安裝一下git
git clone git://github.com/webrtc/apprtc.git
#將collider的源碼軟連接到go的工作目錄下
ln -s /root/webrtc/apprtc/src/collider/collider $GOPATH/src
ln -s /root/webrtc/apprtc/src/collider/collidermain $GOPATH/src
ln -s /root/webrtc/apprtc/src/collider/collidertest $GOPATH/src
#編譯collidermain,需要你懂的上網(wǎng)
go get collidermain
go install collidermain

在執(zhí)行go get collidermain由于眾所周知的原因可能導(dǎo)致無法下載椅亚,可能會報(bào)以下的錯誤:

#報(bào)錯: package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket"

這時候我們只要單獨(dú)使用git下載net即可:

mkdir -p $GOPATH/src/golang.org/x/
cd $GOPATH/src/golang.org/x/
git clone git://github.com/golang/net.git net 
go install net

# 重新獲取一下collidermain
go get collidermain
go install collidermain

8呀舔、安裝coturn

#目錄:root/webrtc/
#https://github.com/coturn/coturn/wiki/Downloads
wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gz
tar xvfz turnserver-4.5.0.7.tar.gz
cd turnserver-4.5.0.7
./configure
make install

配置運(yùn)行服務(wù)器

1媚赖、coturn Nat穿透服務(wù)器

注意這里需要設(shè)置一下用戶名和密碼珠插,后面會配置apprtc的時候需要使用到丧失。

#啟動內(nèi)網(wǎng)ip惜互,這個是172開頭的训堆,在你云服務(wù)器的后臺可以查詢到坑鱼,比如筆者的是172.16.16.4絮缅,用戶名設(shè)置為flyer呼股,密碼為123456
nohup turnserver -L 172.16.16.4 -a -u flyer:123456 -v -f -r nort.gov &

# 可以通過命令lsof -i:3478查詢下是否啟動成功彭谁,成功的話一般會輸出以下信息
#COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
#turnserve 14754 root   16u  IPv4 112232      0t0  UDP instance-5i00bk4l:3478 
#turnserve 14754 root   17u  IPv4 112233      0t0  UDP instance-5i00bk4l:3478 
#turnserve 14754 root   32u  IPv4 112263      0t0  TCP instance-5i00bk4l:3478 (LISTEN)
#turnserve 14754 root   33u  IPv4 112267      0t0  TCP instance-5i00bk4l:3478 (LISTEN)

2缠局、collider 信令服務(wù)器

配置防火墻,允許訪問8089端口(tcp读处,用于客戶端和collider建立websocket信令通信)

#創(chuàng)建自簽名的數(shù)字證書罚舱,如果沒有openssl,需要安裝
mkdir -p /cert
cd /cert
# CA私鑰
openssl genrsa -out key.pem 2048 
# 自簽名證書
openssl req -new -x509 -key key.pem -out cert.pem -days 1095
nohup $GOPATH/bin/collidermain -port=8089 -tls=true  -room-server="https://你服務(wù)器的公網(wǎng)ip:8080" &

#使用命令lsof -i:8089檢查下是否啟動成功馆匿,如果成功則會輸出以下相似的信息
#COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
#colliderm 14817 root    3u  IPv6 112969      0t0  TCP *:8089 (LISTEN)

3燥滑、搭建apprtc房間服務(wù)器

主要是修改配置文件/root/webrtc/apprtc/src/app_engine/constants.py中的相關(guān)參數(shù)即可:

注意這里就需要使用到前面配置coturn Nat穿透服務(wù)器時鎖設(shè)置的用戶名和密碼

首先修改穿透服務(wù)器配置:

修改前
# ICE_SERVER_OVERRIDE  = [
#   {
#     "urls": [
#       "turn:hostname/IpToTurnServer:19305?transport=udp",
#       "turn:hostname/IpToTurnServer:19305?transport=tcp"
#     ],
#     "username": "TurnServerUsername",
#     "credential": "TurnServerCredentials"
#   },
#   {
#     "urls": [
#       "stun:hostname/IpToStunServer:19302"
#     ]
#   }
# ]

#修改后
ICE_SERVER_OVERRIDE  = [
   {
     "urls": [
       "turn:你服務(wù)器的公網(wǎng)ip:3478?transport=udp",
       "turn:你服務(wù)器的公網(wǎng)ip:3478?transport=tcp"
     ],
     "username": "coturn Nat穿透服務(wù)器的用戶名",
     "credential": "coturn Nat穿透服務(wù)器密碼"
   },
   {
     "urls": [
       "stun:你服務(wù)器的公網(wǎng)ip:3478"
     ]
   }
 ]


然后修改ICE配置:

#未修改前
ICE_SERVER_BASE_URL = 'https://appr.tc'
#修改后
ICE_SERVER_BASE_URL = 'https://你服務(wù)器的公網(wǎng)ip'

最后修改WSS_INSTANCE_HOST_KEY:


#修改前
WSS_INSTANCE_HOST_KEY = 'host_port_pair'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{
    WSS_INSTANCE_HOST_KEY: 'apprtc-ws.webrtc.org:443',
    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_NAME_KEY: 'wsserver-std-2',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
}]

# 修改后
WSS_INSTANCE_HOST_KEY = '你服務(wù)器的公網(wǎng)ip:8089'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{
    WSS_INSTANCE_HOST_KEY: '你服務(wù)器的公網(wǎng)ip:8089',
    WSS_INSTANCE_NAME_KEY: 'wsserver-std',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}]

最后修改完成保存即可铭拧。

編譯下apprtc

#編譯
cd /root/webrtc/apprtc

# 以下這一步可能會報(bào)錯赃蛛,提示node版本太低
# 如果報(bào)錯我們需要使用npm install -g n和sudo n stable更新以下node然后再繼續(xù)執(zhí)行以下命令即可
npm install --no-fund
# 這一步有可能報(bào)錯,下面有解決方法
grunt build

在上面執(zhí)行grunt build的時候有可能會報(bào)錯提示requests模塊不存在搀菩,我們使用pip安裝一下即可呕臂,

報(bào)錯信息:

ImportError: No module named requests
Warning: Command failed: python ./build/build_app_engine_package.py src out/app_engine
Traceback (most recent call last):
File "./build/build_app_engine_package.py", line 12, in <module>
import requests
ImportError: No module named requests
Use --force to continue.

Aborted due to warnings.

##### 安裝pip
cd /root/webrtc
wget https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg  --no-check-certificate
chmod +x setuptools-0.6c11-py2.7.egg
./setuptools-0.6c11-py2.7.egg
wget https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz 
tar -xf pip-1.5.4.tar.gz
cd pip-1.5.4
python setup.py install
pip install requests
# 安裝完成后再執(zhí)行編譯:
cd /root/webrtc/apprtc
# 重新執(zhí)行下編譯
grunt build

啟動apprtc

#注意以下內(nèi)網(wǎng)ip是172開頭的
nohup dev_appserver.py --host=服務(wù)器的內(nèi)網(wǎng)ip /root/webrtc/apprtc/out/app_engine --skip_sdk_update_check &

到了這一步WebRTC的服務(wù)器基本就算搭建完成了,這時候在你的瀏覽器輸入http://服務(wù)器公網(wǎng)IP:8080/如果能順利打開肪跋,那么恭喜你環(huán)境算是搭建成功啦!!!

4歧蒋、安裝nginx代理https

為什么需要安裝nginx,因?yàn)閏hrome瀏覽器不支持在非https方式下打開音/視頻設(shè)備州既。
而且apprtc中的信令服務(wù)器(collider)也不支持非 https 服務(wù)。

但是我們在前面配置中都是使用http的服務(wù)吴叶,沒有直接配置成https的阐虚,因此我們需要使用nginx做一次代理,實(shí)現(xiàn)https的服務(wù)蚌卤。
當(dāng)然如果在前面的配置中我們直接使用https的服務(wù)实束,那么這一步就沒有必要了奥秆,但是需要我們有第三方的證書,而不是使用私有證書咸灿。

下面下載安裝以下nginx:

# 下載nginx
wgwt http://nginx.org/download/nginx-1.16.1.tar.gz
# 解壓
tar xvf nginx-1.16.1.tar.gz
# 安裝PCRE
apt-get install libpcre3-dev
cd nginx-1.16.1
./configure --with-http_ssl_module
make install
#默認(rèn)安裝在/usr/local/nginx
#配置nginx.conf
vim /usr/local/nginx/conf/nginx.conf

修改nginx配置/usr/local/nginx/conf/nginx.conf

events {
    worker_connections 1024;
}
http{
    upstream roomserver {
        server 你服務(wù)器的公網(wǎng)ip:8080;
    }
    server {
        listen 80;
        server_name 你服務(wù)器的公網(wǎng)ip;  
        return  301 https://$server_name$request_uri;
    }
    server {
        root /usr/share/nginx/html;
        index index.php index.html index.htm;
        listen      443 ssl;
        ssl_certificate /cert/cert.pem;
        ssl_certificate_key /cert/key.pem;
        server_name 4你服務(wù)器的公網(wǎng)ip;
        location / {
            proxy_pass http://roomserver$request_uri;
            proxy_set_header Host $host;
        }
        location ~ .php$ {
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
        }
    }
}

啟動nginx:

/usr/local/nginx/sbin/nginx

這時候再次在瀏覽器輸入服務(wù)器的ip就能打開apprtc了构订,打開后大概如圖這樣子的:


image

然后點(diǎn)擊加入房間,允許相關(guān)權(quán)限就能通過攝像頭看到自己的畫面了...

吐槽兩句

不得不說為了準(zhǔn)備一個WebRTC的開發(fā)測試環(huán)境還是有點(diǎn)坑的避矢,雖然說按照步驟來不難鲫咽,但是需要搭建的內(nèi)容實(shí)在是太多,而且極容易一步錯步步錯谷异。

筆者也是嘗試了好幾天分尸,查了很多的資料做了很多嘗試才搭建成功。最后還是為互聯(lián)網(wǎng)人的網(wǎng)絡(luò)不能互聯(lián)而WTF發(fā)泄一下...

共勉!!!

關(guān)注我歹嘹,一起進(jìn)步箩绍,人生不止coding!3呱稀材蛛!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怎抛,隨后出現(xiàn)的幾起案子卑吭,更是在濱河造成了極大的恐慌,老刑警劉巖马绝,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豆赏,死亡現(xiàn)場離奇詭異,居然都是意外死亡富稻,警方通過查閱死者的電腦和手機(jī)掷邦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椭赋,“玉大人抚岗,你說我怎么就攤上這事∧恼” “怎么了宣蔚?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長认境。 經(jīng)常有香客問我胚委,道長,這世上最難降的妖魔是什么元暴? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任篷扩,我火速辦了婚禮兄猩,結(jié)果婚禮上茉盏,老公的妹妹穿的比我還像新娘鉴未。我一直安慰自己,他們只是感情好鸠姨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布铜秆。 她就那樣靜靜地躺著,像睡著了一般讶迁。 火紅的嫁衣襯著肌膚如雪连茧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天巍糯,我揣著相機(jī)與錄音啸驯,去河邊找鬼。 笑死祟峦,一個胖子當(dāng)著我的面吹牛罚斗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宅楞,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼针姿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厌衙?” 一聲冷哼從身側(cè)響起距淫,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婶希,沒想到半個月后榕暇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喻杈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年拐揭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奕塑。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡堂污,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出龄砰,到底是詐尸還是另有隱情盟猖,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布换棚,位于F島的核電站式镐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏固蚤。R本人自食惡果不足惜娘汞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夕玩。 院中可真熱鬧你弦,春花似錦惊豺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旷偿,卻和暖如春烹俗,著一層夾襖步出監(jiān)牢的瞬間守伸,已是汗流浹背乘粒。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幢尚,地道東北人茫负。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓磁浇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親朽褪。 傳聞我的和親對象是個殘疾皇子置吓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容