Discuz! Board

标题: 严格按照戴维营的https方法,搭建一边apprtc服务器 [打印本页]

作者: zangcf    时间: 2016-8-6 16:15
标题: 严格按照戴维营的https方法,搭建一边apprtc服务器
网址:
http://www.jianshu.com/p/5431a7066f47

作者: zangcf    时间: 2016-8-6 16:31
标题: 环境准备和代码下载
在Ubuntu Linux 版本服务器上创建新用户apprtc,设置密码,并安装必要的软件包:
useradd -m apprtc
passwd apprtc
apt-get install openjdk-7-jdk
apt-get install python-webtest

mkdir apprtc_root
cd apprtc_root
git clone https://github.com/webrtc/apprtc.git




作者: zangcf    时间: 2016-8-6 17:29
标题: 安装NodeJS和grunt
本帖最后由 zangcf 于 2016-8-8 05:41 编辑

安装NodeJS和grunt
=========================
apt-get install nodejs
npm install -g npm

apt-get install nodejs-legacy

npm -g install grunt-cli





作者: zangcf    时间: 2016-8-8 05:44
标题: 3. 安装apprtc代码中的grunt依赖:
本帖最后由 zangcf 于 2016-8-8 06:17 编辑

执行下面命令:
  1. npm install然后再执行下面命令编译出apprtc这个GAE app.
  2. $ grunt build编译完成后,输出将放在~/apprtc_root/out目录下的app_engine目录

  3. 当然到这一步还没完,还需要配置constant.py服务器参数,
  4. ICE_SERVER_BASE_URL = 'https://api.diveinedu.com'ICE_SERVER_URL_TEMPLATE = '%s/apprtc/iceconfig.php?key=%s'ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')然后把下面命令放到一个脚本文件$HOME/start_apprtc.sh中:
  5. export PATH=$PATH:$HOME/google_appengineexport APPRTC_APP=$HOME/apprtc_root/out/app_engine/export HOST="--host=0.0.0.0"export ICE_SERVER_API_KEY="AIzaSyAJdh2HkajseEIltlZ3SIXO02Tze9sO3NY"dev_appserver.py $HOST $APPRTC_APP以后都只需要执行该脚本文件就可以启动会话房间服务:
  6. $ $HOME/start_apprtc.sh打开浏览器,访问服务器<a href="http://apprtc.diveinedu.com:8080" target="_blank">http://apprtc.diveinedu.com:8080</a>  ,就可以打开了.


  7. ===================
  8. 上面的配置有两个问题,第一,没有dev_appserver.py的环境
  9. 第二,ICE_SERVER_API_KEY需要后面确定
复制代码
准备包:google_appengine_1.9.35.zip解压缩,然后加入执行环境
  1. export PATH=$PATH:$HOME/google_appengine
  2. echo "export PATH=$PATH:$HOME/google_appengine" >> $HOME/.profile
复制代码
如果使用上面的脚本,上面准备环境步奏可以不要,因为sh脚本已经做了这个工作


作者: zangcf    时间: 2016-8-8 06:16
标题: 配置Nginx反向代理服务器
本帖最后由 zangcf 于 2016-8-8 06:54 编辑

配置Nginx反向代理服务器,提供默认HTTPS的访问, 新建Nginx虚拟主机配置文件,反向代理到8080端口

安装nginx的方法:
  1. apt-get install nginx
复制代码
配置/etc/nginx/site-available/apprtc.91xuepai.com
  1. #/etc/nginx/sites-enabled/apprtc.diveinedu.com
  2. upstream roomserver {
  3.         server localhost:8080;
  4. }      
  5. }


  6. server {
  7.         listen 80 ;
  8.         server_name apprtc.91xuepai.com;
  9.         return  301 https://$server_name$request_uri;
  10. }

  11. server {
  12.         listen 443 ;
  13.         ssl on;
  14.         ssl_certificate      /etc/nginx/apprtc.91xuepai.com.crt;
  15.         ssl_certificate_key  /etc/nginx/apprtc.91xuepai.com.key;

  16.         server_name apprtc.diveinedu.com;
  17.         access_log  /var/log/nginx/apprtc.91xuepai.com.log;
  18.         location / {
  19.                 proxy_pass http://roomserver$request_uri;
  20.                 proxy_set_header Host $host;
  21.         }

  22. }
复制代码
注意,要把这个站点配置文件link到site-enable
  1. root@iZ949sqo4m3Z:/etc/nginx/sites-available# ln -s ../sites-available/apprtc.91xuepai.com ./apprtc.91xuepai.com
复制代码
最后,准备key和crt文件
使用simplewebrtc的信令服务器来准备这两个文件:
  1. root@iZ949sqo4m3Z:~# cd singalserver/
  2. root@iZ949sqo4m3Z:~/singalserver# ls
  3. signalmaster-master  signalmaster-master.zip  test
  4. root@iZ949sqo4m3Z:~/singalserver# cd signalmaster-master/
  5. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master# ls
  6. config      LICENSE       package.json  README.md  server.js   test.js
  7. Dockerfile  node_modules  Procfile      scripts    sockets.js
  8. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master# cd config/
  9. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config# ls
  10. development.json  production.json
  11. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config# cd ..
  12. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master# ls
  13. config      LICENSE       package.json  README.md  server.js   test.js
  14. Dockerfile  node_modules  Procfile      scripts    sockets.js
  15. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master# cd ..
  16. root@iZ949sqo4m3Z:~/singalserver# ls
  17. signalmaster-master  signalmaster-master.zip  test
  18. root@iZ949sqo4m3Z:~/singalserver# cd test/
  19. root@iZ949sqo4m3Z:~/singalserver/test# ls
  20. config      LICENSE       package.json  README.md  server.js   test.js
  21. Dockerfile  node_modules  Procfile      scripts    sockets.js
  22. root@iZ949sqo4m3Z:~/singalserver/test# cd..
  23. cd..: command not found
  24. root@iZ949sqo4m3Z:~/singalserver/test# ls
  25. config      LICENSE       package.json  README.md  server.js   test.js
  26. Dockerfile  node_modules  Procfile      scripts    sockets.js
  27. root@iZ949sqo4m3Z:~/singalserver/test# ls
  28. config      LICENSE       package.json  README.md  server.js   test.js
  29. Dockerfile  node_modules  Procfile      scripts    sockets.js
  30. root@iZ949sqo4m3Z:~/singalserver/test# cd ..
  31. root@iZ949sqo4m3Z:~/singalserver# ls
  32. signalmaster-master  signalmaster-master.zip  test
  33. root@iZ949sqo4m3Z:~/singalserver# cd signalmaster-master/
  34. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master# ./scripts/generate-ssl-certs.sh
  35. Generating self-signed certificates...
  36. Generating RSA private key, 1024 bit long modulus
  37. ...........++++++
  38. ......++++++
  39. e is 65537 (0x10001)
  40. You are about to be asked to enter information that will be incorporated
  41. into your certificate request.
  42. What you are about to enter is what is called a Distinguished Name or a DN.
  43. There are quite a few fields but you can leave some blank
  44. For some fields there will be a default value,
  45. If you enter '.', the field will be left blank.
  46. -----
  47. Country Name (2 letter code) [AU]:CN
  48. State or Province Name (full name) [Some-State]:GD
  49. Locality Name (eg, city) []:SZ
  50. Organization Name (eg, company) [Internet Widgits Pty Ltd]:91xuepai
  51. Organizational Unit Name (eg, section) []:91xuepai
  52. Common Name (e.g. server FQDN or YOUR name) []:91xuepai
  53. Email Address []:710833814@qq.com

  54. Please enter the following 'extra' attributes
  55. to be sent with your certificate request
  56. A challenge password []:123456
  57. An optional company name []:123456
  58. Signature ok
  59. subject=/C=CN/ST=GD/L=SZ/O=91xuepai/OU=91xuepai/CN=91xuepai/emailAddress=710833814@qq.com
  60. Getting Private key
  61. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master# ls
  62. config      LICENSE       package.json  README.md  server.js   test.js
  63. Dockerfile  node_modules  Procfile      scripts    sockets.js
  64. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master# cd config/
  65. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config# ls
  66. development.json  production.json  sslcerts
  67. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config# cd sslcerts/
  68. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config/sslcerts# ls
  69. cert.pem  key.pem
  70. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config/sslcerts# cp key.pem
复制代码
然后copy到指定目录:
  1. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config/sslcerts# cp key.pem  /etc/nginx/apprtc.91xuepai.com.key
  2. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config/sslcerts# cp cert.pem /etc/nginx/apprtc.91xuepai.com.crt
  3. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config/sslcerts#
复制代码
最后,重启nginx
  1. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config/sslcerts# service nginx reload
  2. * Reloading nginx configuration nginx
  3.    ...done.
  4. root@iZ949sqo4m3Z:~/singalserver/signalmaster-master/config/sslcerts#
复制代码



作者: zangcf    时间: 2016-8-8 07:40
标题: 准备信令服务器
本帖最后由 zangcf 于 2016-8-8 08:09 编辑

这个配置比较复杂,主要牵扯到云端服务器能否翻墙的问题:
========================================================
1,首先找一个本地的ubuntu桌面系统,保证可以使用翻墙工具
2,下载go程序:进入网站下载 http://www.golangtc.com/download
go1.6.2.linux-amd64.tar.gz
3,安装go环境
解压缩
  1. <font color="#333333">tar xzvf </font><font color="#333333">go1.6.2.linux-amd64.tar.gz</font>
复制代码

将生成一个go的目录,使用su的权限
  1. <div class="blockcode"><blockquote>root@iZ949sqo4m3Z:~# mv go /usr/local/
  2. root@iZ949sqo4m3Z:~# vi .profile
  3. # ~/.profile: executed by Bourne-compatible login shells.

  4. if [ "$BASH" ]; then
  5.   if [ -f ~/.bashrc ]; then
  6.     . ~/.bashrc
  7.   fi
  8. fi
  9. export GOROOT="/usr/local/go"
  10. export GOPATH="$HOME/collider_root"

  11. export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/ga
  12. mes:/usr/local/games:/root/google_appengine:/root/google_appengine::$GOROOT/bin

  13. mesg n
  14. ~
  15. ~
  16. ~
  17. ~
  18. ~
  19. ~
  20. ~
  21. ~
  22. ~
  23. ".profile" 13L, 367C written                                 
  24. root@iZ949sqo4m3Z:~# source .profile
  25. root@iZ949sqo4m3Z:~# mkdir collider_root
  26. root@iZ949sqo4m3Z:~# cd collider_root/
  27. root@iZ949sqo4m3Z:~/collider_root# mkdir src
  28. root@iZ949sqo4m3Z:~/collider_root# cd src/
  29. root@iZ949sqo4m3Z:~/collider_root/src# echo $GOPATH
  30. /root/collider_root
  31. root@iZ949sqo4m3Z:~/collider_root/src# cp $HOME/apprtc_root/src/collider/collider ./
  32. cp: omitting directory ?root/apprtc_root/src/collider/collider?
  33. root@iZ949sqo4m3Z:~/collider_root/src# cp -r $HOME/apprtc_root/src/collider/collider ./
  34. root@iZ949sqo4m3Z:~/collider_root/src# cp -r $HOME/apprtc_root/src/collider/collidermain ./
  35. root@iZ949sqo4m3Z:~/collider_root/src# $HOME/apprtc_root/src/collider/collidertest
  36. -bash: /root/apprtc_root/src/collider/collidertest: Is a directory
  37. root@iZ949sqo4m3Z:~/collider_root/src# vi $GOPATH/src/collidermain/main.go
  38. // Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
  39. // Use of this source code is governed by a BSD-style license
  40. // that can be found in the LICENSE file in the root of the source
  41. // tree.

  42. package main

  43. import (
  44.         "collider"
  45.         "flag"
  46.         "log"
  47. )

  48. var tls = flag.Bool("tls", true, "whether TLS is used")
  49. var port = flag.Int("port", 443, "The TCP port that the server listens on")
  50. var roomSrv = flag.String("room-server", "https://120.76.203.222", "The origin of the room server")

  51. func main() {
  52.         flag.Parse()

  53.         log.Printf("Starting collider: tls = %t, port = %d, room-server=%s", *tls, *port, *roomSrv)
  54. "collidermain/main.go" 25L, 678C written                     
  55. root@iZ949sqo4m3Z:~/collider_root/src# vi $GOPATH/src/collider/collider.go
  56. // Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
  57. // Use of this source code is governed by a BSD-style license
  58. // that can be found in the LICENSE file in the root of the source
  59. // tree.

  60. // Package collider implements a signaling server based on WebSocket.
  61. package collider

  62. import (
  63.         "crypto/tls"
  64.         "golang.org/x/net/websocket"
  65.         "encoding/json"
  66.         "errors"
  67.         "io"
  68.         "io/ioutil"
  69.         "log"
  70.         "net/http"
  71.         "strconv"
  72.         "strings"
  73.         "time"
  74. )

  75. const registerTimeoutSec = 10
  76. /ListenAndServeTLS
  77.                                 tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  78.                                 tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  79.                                 tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  80.                                 tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  81.                                 tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  82.                         },
  83.                         PreferServerCipherSuites: true,
  84.                 }
  85.                 server := &http.Server{ Addr: pstr, Handler: nil, TLSConfig: config }

  86.                 e = server.ListenAndServeTLS("/etc/nginx/apprtc.91xuepai.com.crt
  87. ", "/etc/nginx/apprtc.91xuepai.com.key")
  88.         } else {
  89.                 e = http.ListenAndServe(pstr, nil)
  90.         }

  91.         if e != nil {
  92.                 log.Fatal("Run: " + e.Error())
  93.         }
  94. }

  95. // httpStatusHandler is a HTTP handler that handles GET requests to get the
  96. "collider/collider.go" 215L, 6275C written                    
  97. root@iZ949sqo4m3Z:~/collider_root/src#
复制代码


10,然后重复上面:
  1. go get collidermain
  2. go install collidermain
复制代码

11,运行信令服务器:
  1. $GOPATH/bin/collidermain -port=8089 -tls=true
复制代码

如何测试信令服务器是否可以工作呢?







作者: zangcf    时间: 2016-8-8 08:23
标题: 准备隧道服务器
1,准备编译环境和安装相应库
  1. apt-get install build-essential
  2. apt-get install -y libssl-dev libevent-dev libpq-dev mysql-client libmysqlclient-dev libhiredis-dev
复制代码
2,下载程序,编译安装:
准备文件,turnserver-3.2.3.95.tar.gz解压缩
  1. ./configure
  2. make
  3. sudo make install
复制代码
3, 配置


作者: zangcf    时间: 2016-8-9 18:26
标题: 对于turnserver,我决定还是按照戴维营的思路去搭建
本帖最后由 zangcf 于 2016-8-9 19:12 编辑

对于turnserver,我决定还是按照戴维营的思路去搭建
第一步,删除原来的turnserver
  1. root@iZ949sqo4m3Z:~/turnserver-3.2.3.95# make uninstall
  2. pkill turnserver || echo OK
  3. OK
  4. rm -rf /usr/local/share/doc/turnserver
  5. rm -rf /usr/local/share/turnserver
  6. rm -rf /usr/local/bin/turnserver
  7. rm -rf /usr/local/bin/turnadmin
  8. rm -rf /usr/local/bin/turnutils_peer
  9. rm -rf /usr/local/bin/turnutils_uclient
  10. rm -rf /usr/local/bin/turnutils_stunclient
  11. rm -rf /usr/local/man/man1/turnserver.1
  12. rm -rf /usr/local/man/man1/turnadmin.1
  13. rm -rf /usr/local/man/man1/turnutils.1
  14. rm -rf /usr/local/man/man1/turnutils_uclient.1
  15. rm -rf /usr/local/man/man1/turnutils_stunclient.1
  16. rm -rf /usr/local/man/man1/turnutils_peer.1
  17. rm -rf /usr/local/man/man1/rfc5766-turn-server.1
  18. rm -rf /usr/local/lib/libturnclient.a
  19. rm -rf /usr/local/share/examples/turnserver/
  20. rm -rf /usr/local/etc/turnserver.conf.default
  21. rm -rf /usr/local/etc/turnuserdb.conf.default
复制代码
下载安装包
  1. tar xzvf turnserver-4.4.1.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz
复制代码


使用dpkg安装
  1. dpkg -i coturn_4.4.1.2-1_amd64.deb
复制代码


修改coturn的配置文件:
  1. root@iZ949sqo4m3Z:/etc/default# vi coturn
复制代码
  1. root@iZ949sqo4m3Z:/etc/default# vi coturn
  2. #
  3. # Uncomment it if you want to have the turnserver running as
  4. # an automatic system service daemon
  5. #
  6. TURNSERVER_ENABLED=1
复制代码

生成user的密码:
  1. root@iZ949sqo4m3Z:~# turnadmin -k -u 91xuepai -p 91xuepai
  2. 0x35a8061d1c85cd9f367d6dae569710ba
  3. root@iZ949sqo4m3Z:~#
复制代码

修改配置文件/etc/turnserver.conf

作者: zangcf    时间: 2016-8-9 19:23
标题: RE: 严格按照戴维营的https方法,搭建一边apprtc服务器
再次修改apprtc的constants.py文件
  1. This module contains the constants used in AppRTC Python modules.
  2. """
  3. import os

  4. ROOM_MEMCACHE_EXPIRATION_SEC = 60 * 60 * 24
  5. MEMCACHE_RETRY_LIMIT = 100

  6. LOOPBACK_CLIENT_ID = 'LOOPBACK_CLIENT_ID'

  7. # TODO: Remove once clients support ICE_SERVER.
  8. TURN_BASE_URL = 'https://120.76.203.222'
  9. TURN_URL_TEMPLATE = '%s/turn.php?username=%s&key=%s'
  10. CEOD_KEY = '91xuepai'

  11. ICE_SERVER_BASE_URL = 'https://120.76.203.222'
  12. ICE_SERVER_URL_TEMPLATE = '%s/apprtc/iceconfig.php?key=%s'
  13. #ICE_SERVER_URL_TEMPLATE = '%s/turn.php?username=%s&key=%s'
  14. ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
复制代码
turn的配置和ICE的配置关系是什么样子?是都配置呢?还是二选一的配置呢?

作者: zangcf    时间: 2016-8-9 19:46
下面启动服务器:
第一,nginx启动
按照我的判断nginx应该是自动启动的,可以查看80端口的占用情况可知。
  1. root@iZ949sqo4m3Z:~/apprtc_root/src/app_engine# netstat -apn | grep 80
  2. tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      906/nginx      
  3. tcp        0      0 120.76.203.222:51209    140.205.140.205:80      ESTABLISHED 1039/AliYunDun  
  4. tcp6       0      0 :::80                   :::*                    LISTEN      906/nginx      
  5. unix  2      [ ACC ]     STREAM     LISTENING     8680     1039/AliYunDun      /tmp/Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>
  6. root@iZ949sqo4m3Z:~/apprtc_root/src/app_engine#
复制代码
确实如此

第二步,启动隧道服务器
  1. service coturn start;
复制代码
第三步,启动信令服务器
因为上面修改过信令服务器,所以需要重新安装:
  1. root@iZ949sqo4m3Z:~/apprtc_root/src/app_engine# go get collidermain
  2. root@iZ949sqo4m3Z:~/apprtc_root/src/app_engine# go install collidermain
复制代码
然后再运行:
  1. root@iZ949sqo4m3Z:~/apprtc_root/src/app_engine# $GOPATH/bin/collidermain -port=8089 -tls=true
  2. 2016/08/09 19:33:22 Starting collider: tls = true, port = 8089, room-server=https://120.76.203.222
  3. 2016/08/09 19:33:22 Run: http2: TLSConfig.CipherSuites index 4 contains an HTTP/2-approved cipher suite (0xc030), but it comes after unapproved cipher suites. With this configuration, clients that don't support previous, approved cipher suites may be given an unapproved one and reject the connection.
复制代码
第四步,运行房间服务器
这个配置还是有问题,看样子,我还得再次重来一遍





欢迎光临 Discuz! Board (http://47.89.242.157:9000/bbs/discuz/) Powered by Discuz! X3.2