当前位置:   article > 正文

Webrtc系列三——Ubuntu 20.04上Apprtc服务搭建之一_webrtc服务器部署

webrtc服务器部署

        由于https://appr.tc已经不维护了,导致研究webrtc源代码变得不太方便。同时webrtc编译出来的AppRTCMobile也无法正常和浏览器进行一对一的实时通信,本人花了好长一些时间来解决这些问题,通过解决这些问题特写下这个文章,一方面起到记录使用,另一方面也可以作为他人参考使用,本文在Ubuntu 20.04.6 LTS上部署apprtc,使得两个chrome浏览器可以进行通信,也可以在webrtc for android的AppRTCMobile.apk和chrome浏览器进行通信。

        本文只考虑在一台机器中本地部署AppRTC服务器及turn服务的情况,如果需要在公网或者正式商用场景部署,需要考虑https和wss安全链接及其证书的申请和配置等。

图1: 本文搭建后的整体架构

一、前置条件

        本文假定同学已经具备了以下条件,如果不具备科学上网的条件,可以下载本人上传到网盘的所有资料,完成本文目标(两个chrome浏览器可以进行通信,也可以在webrtc for android的AppRTCMobile.apk和chrome浏览器进行通信)

  • Ubuntu 20.04.6 LTS 系统,配置好了vim,git,python2(Apprtc不支持3.x,后面有时间再来改apprtc支持python3)等环境
  • 具备科学上网
  • 已经安装好的JDK(1.8),openssh-server、make、libtool等

二、AppRTC安装

1.安装node.js

  1. mkdir ~/Desktop/webrtc
  2. # 也可以采用其他版本的nodejs,本文使用v10.16.0
  3. wget https://nodejs.org/dist/v10.16.0/node-v10.16.0-linux-x64.tar.xz
  4. # 解压
  5. tar -xvf node-v10.16.0-linux-x64.tar.xz
  6. # 进入目录
  7. cd node-v10.16.0-linux-x64/
  8. # 查看当前的目录
  9. pwd
  10. # 确认一下nodejs下bin目录是否有node 和npm文件,如果有就可以执行软连接,比如
  11. sudo ln -sf /home/louis/Desktop/webrtc/node-v10.16.0-linux-x64/bin/npm /usr/local/bin/
  12. sudo ln -sf /home/louis/Desktop/webrtc/node-v10.16.0-linux-x64/bin/node /usr/local/bin/
  13. # /home/louis/Desktop/webrtc这个路径你自己创建的路径
  14. # 查看是否安装,安装正常则打印版本号
  15. node -v
  16. npm -v
  17. # 有版本信息后安装 grunt-cli,先进到nodejs的bin目录, 要和自己的目录匹配
  18. cd /home/louis/Desktop/webrtc/node-v10.16.0-linux-x64/bin
  19. sudo npm install grunt-cli
  20. sudo ln -sf /home/louis/Desktop/webrtc/node-v10.16.0-linux-x64/bin/grunt /usr/local/bin/
  21. grunt --version
  22. # 显示grunt-cli v1.4.3

2.安装google_appengine

  1. cd ~/Desktop/webrtc/ # 进到webrtc目录
  2. wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.40.zip # 下载google_appengine
  3. unzip google_appengine_1.9.40.zip #解压
  4. export PATH=$PATH:/home/Desktop/webrtc/google_appengine #配置环境变量:在/etc/profile文件最后增加一行,和自己路径保持一致
  5. source /etc/profile

3.安装go

  1. cd ~/Desktop/webrtc/ # 进到webrtc目录
  2. wget http://www.golangtc.com/static/go/1.7/go1.7.linux-amd64.tar.gz
  3. #创建go工作目录
  4. mkdir -p ~/Desktop/webrtc/goworkspace/src
  5. #配置环境变量:在/etc/profile文件最后增加一行:
  6. sudo vim /etc/profile
  7. export GOPATH=/home/louis/Desktop/webrtc/goworkspace
  8. source /etc/profile

4.AppRTC下载和安装

  1. cd ~/Desktop/webrtc/
  2. git clone https://github.com/webrtc/apprtc.git
  3. # 如果github的连接下不了就用gitee的链接
  4. # git clone https://gitee.com/sabergithub/apprtc.git
  5. #将collider的源码软连接到go的工作目录下
  6. ln -sf /home/louis/Desktop/webrtc/apprtc/src/collider/collider $GOPATH/src
  7. ln -sf /home/louis/Desktop/webrtc/apprtc/src/collider/collidermain $GOPATH/src
  8. ln -sf /home/louis/Desktop/webrtc/apprtc/src/collider/collidertest $GOPATH/src
  9. #下一步在编译 go get collidermain
  10. #报错: package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket"
  11. #所以先执行:
  12. mkdir -p $GOPATH/src/golang.org/x/
  13. cd $GOPATH/src/golang.org/x/
  14. git clone https://github.com/golang/net.git net
  15. cd $GOPATH/src/golang.org/x/net
  16. git checkout v0.16.0 # 切换到老一点的tag v0.16.0,不然编译不过
  17. go install net
  18. #编译collidermain
  19. cd ~/Desktop/webrtc/goworkspace/src
  20. go get collidermain
  21. go install collidermain

5.turn服务器的配置

  1. cd ~/Desktop/webrtc/
  2. sudo apt-get install libssl-dev
  3. sudo apt-get install libevent-dev
  4. wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gz #可以使用其他版本
  5. tar xfz turnserver-4.5.0.7.tar.gz
  6. cd turnserver-4.5.0.7
  7. ./configure
  8. make
  9. sudo make install

三、Nginx代理服务器的安装

  1. sudo apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev openssl
  2. cd ~/Desktop/webrtc/
  3. #下载nginx 本文以1.15.8版本为例
  4. wget http://nginx.org/download/nginx-1.15.8.tar.gz
  5. tar xvzf nginx-1.15.8.tar.gz
  6. cd nginx-1.15.8/
  7. # 要支持https请添加--with-http_ssl_module参数
  8. ./configure --with-http_ssl_module
  9. # 编译
  10. make
  11. #安装
  12. sudo make install

四、配置

1. 开启所有需要的端口

  1. sudo ufw allow 3478/tcp
  2. sudo ufw allow 3478/udp
  3. sudo ufw allow 8080/tcp
  4. sudo ufw allow 8080/udp
  5. sudo ufw allow 8089/tcp
  6. sudo ufw allow 8089/udp
  7. sudo ufw allow 3033/tcp
  8. sudo ufw allow 3033/udp

2. 房间服务器配置

以下通过git diff的方式说明本人修改了那些部分以便支持本文目标。

  1. diff --git a/src/app_engine/apprtc.py b/src/app_engine/apprtc.py
  2. index 933bd7c..54126e3 100755
  3. --- a/src/app_engine/apprtc.py
  4. +++ b/src/app_engine/apprtc.py
  5. @@ -149,8 +149,8 @@ def get_wss_parameters(request):
  6. wss_url = 'ws://' + wss_host_port_pair + '/ws'
  7. wss_post_url = 'http://' + wss_host_port_pair
  8. else:
  9. - wss_url = 'wss://' + wss_host_port_pair + '/ws'
  10. - wss_post_url = 'https://' + wss_host_port_pair
  11. + wss_url = 'ws://' + wss_host_port_pair + '/ws'
  12. + wss_post_url = 'http://' + wss_host_port_pair
  13. return (wss_url, wss_post_url)
  14. def get_version_info():
  15. diff --git a/src/app_engine/constants.py b/src/app_engine/constants.py
  16. index 682331b..9e44c4b 100644
  17. --- a/src/app_engine/constants.py
  18. +++ b/src/app_engine/constants.py
  19. @@ -37,23 +37,42 @@ ICE_SERVER_OVERRIDE = None
  20. # ]
  21. # }
  22. # ]
  23. -ICE_SERVER_BASE_URL = 'https://appr.tc'
  24. +#ICE_SERVER_BASE_URL = 'https://appr.tc'
  25. +ICE_SERVER_BASE_URL = 'http://192.168.0.104:3033'
  26. ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
  27. ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
  28. HEADER_MESSAGE = os.environ.get('HEADER_MESSAGE')
  29. ICE_SERVER_URLS = [url for url in os.environ.get('ICE_SERVER_URLS', '').split(',') if url]
  30. # Dictionary keys in the collider instance info constant.
  31. -WSS_INSTANCE_HOST_KEY = 'host_port_pair'
  32. +#WSS_INSTANCE_HOST_KEY = 'host_port_pair'
  33. +WSS_INSTANCE_HOST_KEY = '192.168.0.104:8089'#根据自身的ip和端口来决定
  34. WSS_INSTANCE_NAME_KEY = 'vm_name'
  35. WSS_INSTANCE_ZONE_KEY = 'zone'
  36. WSS_INSTANCES = [{
  37. - WSS_INSTANCE_HOST_KEY: 'apprtc-ws.webrtc.org:443',
  38. + WSS_INSTANCE_HOST_KEY: '192.168.0.104:8089',
  39. WSS_INSTANCE_NAME_KEY: 'wsserver-std',
  40. WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
  41. }, {
  42. - WSS_INSTANCE_HOST_KEY: 'apprtc-ws-2.webrtc.org:443',
  43. + WSS_INSTANCE_HOST_KEY: '192.168.0.104:8089',
  44. WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
  45. WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
  46. }]
  47. diff --git a/src/web_app/html/index_template.html b/src/web_app/html/index_template.html
  48. index ade4c22..d032f20 100644
  49. --- a/src/web_app/html/index_template.html
  50. +++ b/src/web_app/html/index_template.html
  51. @@ -137,6 +137,15 @@
  52. <script src="/js/storage.js"></script>
  53. <script type="text/javascript">
  54. + var servers=[{
  55. + credential:"louis",
  56. + username:"louis",
  57. + urls:[
  58. + "turn:192.168.0.104:3478?transport=udp",
  59. + "turn:192.168.0.104:3478?transport=tcp"
  60. + ]
  61. + }];
  62. +
  63. var loadingParams = {
  64. errorMessages: {{ error_messages }},
  65. isLoopback: {{ is_loopback }},
  66. @@ -147,7 +156,8 @@
  67. {% endif %}
  68. mediaConstraints: {{ media_constraints | safe }},
  69. offerOptions: {{ offer_options | safe }},
  70. - peerConnectionConfig: {{ pc_config | safe }},
  71. + //peerConnectionConfig: {{ pc_config | safe }},
  72. + peerConnectionConfig: { "rtcpMuxPolicy":"require","iceServers":servers,"bundlePolicy":"max-bundle"},
  73. peerConnectionConstraints: {{ pc_constraints | safe }},
  74. iceServerRequestUrl: '{{ ice_server_url }}',
  75. iceServerTransports: '{{ ice_server_transports }}',
  76. diff --git a/src/web_app/js/appcontroller.js b/src/web_app/js/appcontroller.js
  77. index 16a75d5..b01321e 100644
  78. --- a/src/web_app/js/appcontroller.js
  79. +++ b/src/web_app/js/appcontroller.js
  80. @@ -429,11 +429,12 @@ AppController.prototype.onKeyPress_ = function(event) {
  81. };
  82. AppController.prototype.pushCallNavigation_ = function(roomId, roomLink) {
  83. - window.history.pushState({'roomId': roomId, 'roomLink': roomLink}, roomId,
  84. - roomLink);
  85. + // window.history.pushState({'roomId': roomId, 'roomLink': roomLink}, roomId,
  86. + // roomLink);//编译报错
  87. };
  88. AppController.prototype.displaySharingInfo_ = function(roomId, roomLink) {
  89. + roomLink=roomLink.replace("http","https"); //浏览器通话跨域问题 :pushState Messages:Failed to start signaling: Failed to execute ‘pushState’ on ‘History’
  90. this.roomLinkHref_.href = roomLink;
  91. this.roomLinkHref_.text = roomLink;
  92. this.roomLink_ = roomLink;

以上修改需要重新在apprtc目录下编译

  1. cd ~/Desktop/webrtc/apprtc
  2. sudo grunt build

3.nginx代理配置

(1)产生证书
  1. sudo mkdir -p /cert
  2. cd /cert
  3. # CA私钥
  4. openssl genrsa -out key.pem 2048
  5. # 自签名证书
  6. openssl req -new -x509 -key key.pem -out cert.pem -days 9999
(2)配置web服务器

配置文件/usr/local/nginx/conf/conf.d/apprtc-websocket-proxy.conf 

  1. upstream roomserver {
  2.    server 192.168.0.104:8080;
  3. }
  4. server {
  5.     listen 443 ssl;
  6.     ssl_certificate /cert/cert.pem;
  7.     ssl_certificate_key /cert/key.pem; 
  8.     charset utf-8;
  9.     # ip地址或者域名
  10.     server_name 192.168.0.104;
  11.     location / {
  12.         # 转向代理的地址
  13.         proxy_pass http://roomserver$request_uri;
  14.         proxy_set_header Host $host;
  15.     }
  16. }

编辑nginx.conf文件,在末尾}之前添加包含文件 

include /usr/local/nginx/conf/conf.d/*.conf;
}

(3)配置websocket代理

完整配置文件:/usr/local/nginx/conf/conf.d/apprtc-websocket-proxy.conf

  1. map $http_upgrade $connection_upgrade {
  2.     default upgrade;
  3.     '' close;
  4. }
  5. upstream websocket {
  6.     server 192.168.0.104:8089;
  7. }
  8. server {
  9.     listen 8088 ssl;
  10.     ssl_certificate /cert/cert.pem;
  11.     ssl_certificate_key /cert/key.pem;
  12.     server_name 192.168.0.104;
  13.     location /ws {
  14.         proxy_pass http://websocket;
  15.         proxy_http_version 1.1;
  16.         proxy_connect_timeout 4s; #配置点1
  17.         proxy_read_timeout 6000s; #配置点2,可以考虑这个时间配置长一点
  18.         proxy_send_timeout 6000s; #配置点3
  19.         proxy_set_header Upgrade $http_upgrade;
  20.         proxy_set_header Connection $connection_upgrade;
  21.     }
  22. }

4.turn web服务器

为能支持webrtc for android的AppRTCMobile.apk能正常和浏览器连接,需要增加一个http的turn访问服务器,通过nodejs启动它,本人将其命名为ice.js,在此之前,需要nodejs安装一下

sudo npm install express

完整的turn web服务代码如下,监听3033端口,将客户端的turn url请求返回正常的turn服务器信息

  1. var express = require('express')
  2. var crypto = require('crypto')
  3. var app = express()
  4. var hmac = function (key, content) {
  5. var method = crypto.createHmac('sha1', key)
  6. method.setEncoding('base64')
  7. method.write(content)
  8. method.end()
  9. return method.read()
  10. }
  11. function handleIceRequest(req, resp) {
  12. console.log('handleIceRequest louis louis')
  13. var query = req.query
  14. var key = '4080218913'
  15. var time_to_live = 600
  16. var timestamp = Math.floor(Date.now() / 1000) + time_to_live
  17. var turn_username = timestamp + ':ninefingers'
  18. var password = hmac(key, turn_username)
  19. console.log('handleIceRequest req' + req)
  20. return resp.send({
  21. iceServers: [
  22. {
  23. urls: [
  24. 'stun:192.168.0.104:3478',//根据自身的ip修改
  25. 'turn:192.168.0.104:3478'//根据自身的ip修改
  26. ],
  27. username: turn_username,
  28. credential: password
  29. }
  30. ]
  31. })
  32. }
  33. app.get('/v1alpha/iceconfig', handleIceRequest)
  34. app.post('/v1alpha/iceconfig', handleIceRequest)
  35. app.listen('3033', function () {
  36. console.log('server started')
  37. })

5.turn服务配置

直接给出配置文件

  1. #本地监听的网卡设备,这里根据自己的实际情况填写
  2. listening-device=ens37 #网卡名
  3. listening-port=3478 #端口
  4. #本地用于转发的网卡设备,这里根据自己的实际情况填写
  5. relay-device=ens37
  6. #指定的转发端口的分配范围,测试时,可以将防火墙全部关闭,防止 UDP 端口被屏蔽
  7. min-port=3480
  8. max-port=3500
  9. #日志输出级别,turnserver 启动时加上 -v,可以得到更清晰的日志输出
  10. Verbose
  11. #消息验证,WebRTC 的消息里会用到
  12. fingerprint
  13. #webrtc 通过 turn 中继,必须使用长验证方式
  14. lt-cred-mech
  15. # ICE REST API 认证需要(如果打开了这行,turn就不工作了)
  16. use-auth-secret
  17. # REST API 加密所需的 KEY
  18. # 这里我们使用“静态”的 KEY,Google 自己也用的这个
  19. static-auth-secret=louis
  20. #用户登录域,下面的写法可以不改变它,因为再启动 turnserver 时,可以通过指定参数覆盖它
  21. realm=<填写你自己的服务器的IP>#这个特别关键,如果这里不是你的服务器的IP,数据就不通
  22. #可为 TURN 服务提供更安全的访问(这个我没用,不知道干啥的)
  23. #stale-nonce
  24. #在Coturn代码中的/etc/examples/目录下有秘钥文件,可以直接用
  25. #cert=/home/louis/Desktop/webrtc/turnserver-4.5.0.7/examples/etc/turn_server_cert.pem
  26. #pkey=/home/louis/Desktop/webrtc/turnserver-4.5.0.7/examples/etc/turn_server_pkey.pem
  27. cert=/cert/cert.pem
  28. pkey=/cert/key.pem
  29. #屏蔽 loopback, multicast IP地址的 relay
  30. no-loopback-peers
  31. no-multicast-peers
  32. #启用 Mobility ICE 支持(不懂)
  33. mobility
  34. #禁用本地 telnet cli 管理接口
  35. no-cli

五、启动服务 

为了方便启动,本人做了一个shell脚本 start.sh,可以用来启动所有的服务,脚本内容如下:

  1. #/usr/bin/bash
  2. sudo kill -9 `ps -elf| grep turnserver | awk '{print$4}'`
  3. sudo kill -9 `ps -elf| grep collidermain | awk '{print$4}'`
  4. sudo kill -9 `ps -elf| grep dev_appserver.py | awk '{print$4}'`
  5. sudo kill -9 `ps -elf| grep ice.js | awk '{print$4}'`
  6. cd /home/louis/Desktop/webrtc/apprtc
  7. sudo grunt build
  8. cd -
  9. sleep 1
  10. sudo turnserver -L 0.0.0.0 -z -S -u louis:louis -v -f -r 192.168.0.104 -c /home/louis/Desktop/webrtc/turnserver.conf 2>&1 > turnserver.log &
  11. sleep 1
  12. sudo node /home/louis/Desktop/webrtc/apprtc/ice.js &
  13. sleep 1
  14. sudo /home/louis/Desktop/webrtc/goworkspace/bin/collidermain -port=8089 -tls=false -room-server="http://192.168.0.104:8080" 2>&1 > signal.log &
  15. #sudo /home/louis/Desktop/webrtc/goworkspace/bin/collidermain -port=8089 -tls=false -room-server="http://192.168.0.104:8080" &
  16. sleep 1
  17. #sudo /home/louis/Desktop/webrtc/google_appengine/dev_appserver.py --host=0.0.0.0 /home/louis/Desktop/webrtc/apprtc/out/app_engine --skip_sdk_update_check &
  18. sudo /home/louis/Desktop/webrtc/google_appengine/dev_appserver.py --host=0.0.0.0 /home/louis/Desktop/webrtc/apprtc/out/app_engine --skip_sdk_update_check 2>&1 > roomserver.log &
  19. sleep 1
  20. sudo /usr/local/nginx/sbin/nginx -s stop
  21. sudo /usr/local/nginx/sbin/nginx
  22. sleep 1
  23. ps -elf | grep -E "turn|dev_app|nginx|http|collidermain|ice.js"

此次所有的安装和配置工作都已经完成了,接下来将在“Webrtc系列四——Ubuntu 20.04上Apprtc服务搭建之二”中测试所有的链路和给出本人的所有代码。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/850928
推荐阅读
相关标签
  

闽ICP备14008679号