Webrtc服务器搭建(基于公网环境)
webrtc服務器環境搭建
(基于公網環境)
Last Modified Date: 2017/8/2
目錄
1. 搭建平臺
2. 軟件安裝
3. 搭建房間服務器(Room Server)
4. 搭建信令服務器(Collider Server)
5. 搭建STUN\TURN服務器
6. 配置Nginx服務器
7. 運行測試
8. 附錄
1. 搭建平臺
- 操作系統: Ubuntu 16.04 server(64bits)
- Google webrtc的服務器Demo:詳見https://github.com/webrtc/apprtc
- 域名: webrtc.olcms.com
- IP地址: 需要是公網地址
2. 軟件安裝
- 安裝JDK:
- 安裝nodejs相關包:
- 安裝Python和Python-webtest:
注: 若已安裝過上述軟件,可忽略;如上述未提及的軟件需要安裝,請自行安裝。
3. 搭建房間服務器(Room Server)
- 下載apprtc源碼(操作所在目錄/root/)
若npm install報錯,請自行解決。
- 修改文件
1.修改/root/apprtc/src/app_engine/constants.py
- 編譯(在apprtc目錄下進行)
編譯完成之后,會生成out目錄,房間服務器編譯完成。
注(編譯成功可忽略):此處編譯需要翻墻,若編譯時無法翻墻,可下載手動下載https://api.callstats.io/static/callstats.min.js,并把文件callstats.min.js放到目錄/root/apprtc/out/app_engine/third_party/callstats/下。然后修改/root/apprtc/build/build_app_engine_package.py文件:
# Download callstats.............response = requests.get(urls[fileName])#if response.status_code == 200: #把此處注釋掉print 'Downloading %s to %s...' % (urls[fileName], path)with open(path + fileName, 'w') as to_file:to_file.write(response.text)#else: #把此處注釋掉# raise NameError('Could not download: ' + filename + ' Error:' + \ #把此處注釋掉#str(response.status_code)) #把此處注釋掉然后繼續進行編譯即可。
安裝和配置google app engine
1.下載google app engine
需翻墻,下載地址https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.50.zip),或者通過其他地方下載。2.配置google app engine 路徑
解壓google_appengine_1.9.50.zip
編輯/etc/profile文件,在文件最后添加語句:
export PATH="$PATH:/root/google_appengine/"(當前安裝目錄是/root/google_appengine,請根據自己的安裝目錄進行配置)
保存profile文件,進行以下操作生效
- 運行房間服務器(room server)
在目錄/root/google_appengine目錄下找到dev_appserver.py腳本,執行以下語句
若想后臺運行,則執行
nohup ./dev_appserver.py --host=webrtc.olcms.com /root/apprtc/out/app_engine &在瀏覽器中訪問房間服務器
https://webrtc.olcms.com
4. 搭建信令服務器(Collider Server)
- 安裝go語言編譯器
- 復制collider源代碼
(此源碼在房間服務器源碼目錄下/root/apprtc/src/collider/)
在/root目錄下新建文件夾
配置編譯環境,此配置是暫時有效的
export GOPATH=/root/goWorkspace/把/root/apprtc/src/collider/目錄下的三個目錄(collider、collidermain、collidertest)復制到/root/goWorkspace/src/目錄下
cp -rf /root/apprtc/src/collider/* /root/goWorkspace/src- 修改代碼
1.編輯文件/root/goWorkspace/src/collidermain/main.go,修改房間服務器的地址
2.編輯文件/root/goWorkspace/src/collider/collider.go,修改下面這句:
e = server.ListenAndServeTLS("/cert/cert.pem", "/cert/key.pem")修改為
e = server.ListenAndServeTLS("/etc/letsencrypt/live/webrtc.olcms.com/fullchain.pem", "/etc/letsencrypt/live/webrtc.olcms.com/privkey.pem")其中fullchain.pem和privkey.pem為SSL證書,具體證書路徑根據實際路徑進行配置,SSL證書生成見后續Nginx配置。
- 編譯信令服務器
進入目錄/root/goWorkspace/src/,此處編譯需要翻墻。
編譯成功后,在/root/goWorkspace/下會生成bin和pkg目錄。
若此處編譯時無法翻墻,可手動下載需要的文件。在/root/goWorkspace/src/目錄下,
然后再進行編譯即可。
- 運行信令服務器
進入/root/goWorkspace/bin/目錄,運行信令服務器
若想后臺運行,則執行
nohup ./collidermain -port=8089 -tls=true &5. 搭建STUN\TURN服務器
- 安裝coturn
- 進行相關配置
- 編輯文件/etc/default/coturn,把TURNSERVER_ENABLED=1的注釋去掉。
- 編輯文件/etc/turnserver.conf,把以下內容加入到文件最后(或者在文件中找到相應的選項,進行配置)
上述文件中 0x7e3a2ed35d3cf7f19e2f8b015a186f54的生成方法:
turnadmin -k -u inesadt -r north.gov -p inesadt
-k 表示生成一個long-term credential key
-u 表示用戶名
-p 表示密碼
-r 表示Realm域,(這個值的設置可能會有影響)。
coturn的證書生成(即配置文件中cert和pkey)
sudo openssl req -x509 -newkey rsa:2048 -keyout /usr/local/etc/turn_server_pkey.pem –out /usr/local/etc/turn_server_cert.pem -days 99999 –nodes- 啟動coturn服務器
6. 配置Nginx服務器
- 安裝Nginx
- 配置Nginx
編輯配置文件/etc/nginx/sites-available/default
生成SSL證書
1.使用let’s encrypt頒發的免費SSL證書,安裝軟件
2.生成SSL證書
certbot --nginx certonlySSL證書生成的目錄/etc/letsencrypt/live/webrtc.olcms.com/,下面會有四個證書(cert.pem,chain.pem,fullchain.pem,privkey.pem)
PS:詳見https://certbot.eff.org/#ubuntuxenial-nginx
- 安裝php和php-fpm
- 編輯配置文件/etc/nginx/sites-available/default
- 編寫turn.php文件和iceconfig.php文件,并把文件放到目錄/var/www/html/目錄下
turn.php文件內容
<?php $request_username = $_GET["username"]; if(empty($request_username)) { echo "username == null"; exit; } $request_key = $_GET["key"]; $time_to_live = 600; $timestamp = time() + $time_to_live;//失效時間 $response_username = $timestamp.":".$_GET["username"]; $response_key = $request_key; if(empty($response_key)) $response_key = "code_key"; //constants.py中CEOD_KEY $response_password = getSignature($response_username, $response_key); $jsonObj = new Response(); $jsonObj->username = $response_username; $jsonObj->password = $response_password; $jsonObj->ttl = 86400;//此處需配置自己的服務器$jsonObj->uris= array("stun:webrtc.olcms.com:3478","turn:webrtc.olcms.com:3478?transport=udp","turn:webrtc.olcms.com?transport=tcp");echo json_encode($jsonObj); /** * 使用HMAC-SHA1算法生成簽名值 * * @param $str 源串 * @param $key 密鑰 * * @return 簽名值 */function getSignature($str, $key) {$signature = "";if (function_exists('hash_hmac')) {$signature = base64_encode(hash_hmac("sha1", $str, $key, true));} else {$blocksize = 64;$hashfunc = 'sha1';if (strlen($key) > $blocksize) {$key = pack('H*', $hashfunc($key));}$key = str_pad($key, $blocksize, chr(0x00));$ipad = str_repeat(chr(0x36), $blocksize);$opad = str_repeat(chr(0x5c), $blocksize);$hmac = pack('H*', $hashfunc(($key ^ $opad) . pack('H*', $hashfunc(($key ^ $ipad) . $str))));$signature = base64_encode($hmac);}return $signature;}class Response { public $username = ""; public $password = ""; public $ttl = ""; public $uris = array(""); } ?>iceconfig.php文件內容
<?php $request_username = "inesadt"; //配置成自己的turn服務器用戶名if(empty($request_username)) { echo "username == null"; exit; } $request_key = "inesadt"; //配置成自己的turn服務器密碼$time_to_live = 600; $timestamp = time() + $time_to_live;//失效時間 $response_username = $timestamp.":".$_GET["username"]; $response_key = $request_key; if(empty($response_key)) $response_key = "CEOD_KEY";//constants.py中CEOD_KEY $response_password = getSignature($response_username, $response_key); $arrayObj = array();$arrayObj[0]['username'] = $response_username;$arrayObj[0]['credential'] = $response_password;//配置成自己的stun/turn服務器$arrayObj[0]['urls'][0] = "stun:webrtc.olcms.com:3478";$arrayObj[0]['urls'][1] = "turn:webrtc.olcms.com:3478?transport=tcp";$arrayObj[0]['uris'][0] = "stun:webrtc.olcms.com:3478";$arrayObj[0]['uris'][1] = "turn:webrtc.olcms.com:3478?transport=tcp";$jsonObj = new Response(); $jsonObj->lifetimeDuration = "300.000s";$jsonObj->iceServers = $arrayObj;echo json_encode($jsonObj); /** * 使用HMAC-SHA1算法生成簽名值 * * @param $str 源串 * @param $key 密鑰 * * @return 簽名值 */function getSignature($str, $key) {$signature = "";if (function_exists('hash_hmac')) {$signature = base64_encode(hash_hmac("sha1", $str, $key, true));} else {$blocksize = 64;hashfunc = 'sha1';if (strlen($key) > $blocksize) {$key = pack('H*', $hashfunc($key));}$key = str_pad($key, $blocksize, chr(0x00));$ipad = str_repeat(chr(0x36), $blocksize);$opad = str_repeat(chr(0x5c), $blocksize);$hmac = pack( 'H*', $hashfunc( ($key ^ $opad) . pack( 'H*', $hashfunc( ($key ^ $ipad) . $str ) ) ) ); $signature = base64_encode($hmac);}return $signature;}class Response {public $lifetimeDuration = "";public $iceServers = array("");} ?>- 重啟Nginx服務器和php7.0-fpm
7. 運行測試
PC瀏覽器(Android手機瀏覽器)之間的視頻通信測試
訪問 https://webrtc.olcms.com
1.PC瀏覽器:Firefox 54.0.1(64bits),Android手機瀏覽器:Firefox 54.0.1測試OK
2.PC瀏覽器:Google Chrome 59.0.3071.115(64bits),Android手機瀏覽器:Google Chrome 59.0.3071.125
測試OK
Android APK客戶端之間以及客戶端與瀏覽器之間
1.獲取Android APK下載webrtc源碼,在源碼目錄下webrtc/examples/androidapp,進行編譯即可生成Android APK
2.測試Android APK客戶端之間
測試OK
3.測試Android APK客戶端與瀏覽器(Chrome、Firefox)之間
測試OK
附錄
- 運行過程中的問題
- Failed to start signaling: Failed to execute ‘pushState’ on ‘History’: A history state object with URL ‘http://192.168.6.54/r/198676628’ cannot be created in a document with origin ‘https://192.168.6.54’ and URL ‘https://192.168.6.54/
解決方法1:
房間服務器編譯完成后,在/root/apprtc/out/app_engine/js/apprtc.debug.js文件中找到window.history.pushState({‘roomId’: roomId, ‘roomLink’: roomLink}, roomId, roomLink),把這句話注釋掉,重新運行即可。(如果重新編譯,需要重新修改)
解決方法2:
在/root/apprtc/src/web_app/js/appcontroller.js文件中找到window.history.pushState({‘roomId’: roomId, ‘roomLink’: roomLink}, roomId, roomLink),把這句話注釋掉,然后重新編譯,重新運行房間服務器即可。
回到目錄
參考:
1.http://io.diveinedu.com/2015/02/05/%E7%AC%AC%E5%85%AD%E7%AB%A0-WebRTC%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA.html
2. http://www.jianshu.com/p/3a43233b9c39
總結
以上是生活随笔為你收集整理的Webrtc服务器搭建(基于公网环境)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决maven无法下载依赖的问题
- 下一篇: hcnp介绍