美文网首页
搭建WebRtc服务器

搭建WebRtc服务器

作者: 唐洪峰 | 来源:发表于2018-01-08 09:47 被阅读0次

    搭建WebRtc服务器

    一、建立webrtc目录(服务器存放位置,发布时使用)

    1. 创建webrtc目录
    cd /opt
    sudo mkdir webrtc
    sudo chmod 777 -R webrtc
    

    二、安装nodejs
    两种方式:

    1. 方式一:
    sudo apt-get update
    sudo apt-get install nodejs-legacy nodejs
    sudo apt-get install npm
    
    1. 方式二:
      a. 下载:https://nodejs.org/en/download/
      点击“Linux Binaries (x86/x64)”下载
      b. 解压到当前目录(如当前为:/home/thf/)
    xz -d node-v8.9.1-linux-x64.tar.xz
    tar -xvf node-v8.9.1-linux-x64.tar
    

    c. 建立软连接

    sudo ln -s /home/thf/node-v8.9.1-linux-x64/bin/node /usr/local/bin/node
    sudo ln -s /home/thf/node-v8.9.1-linux-x64/bin/npm /usr/local/bin/npm
    

    三、安装Grunt环境
    暂时关掉系统的代理
    在ubuntu的“系统设置”的“网络设置"中将代理设置方式为none
    重启
    直接安装grunt-cli

    sudo npm -g install grunt-cli
    

    记得恢复代理为后续安装做准备
    四、安装Python和jdk

    sudo apt-get install python python-requests
    sudo apt-get install openjdk-8-jdk
    

    五、安装Google App Engine SDK for Python

    1. 下载https://cloud.google.com/sdk/docs/#linux
      选择对应版本下载
    2. 解压到指定(如:/opt/webrtc)目录
    sudo tar zxvf google-cloud-sdk-183.0.0-linux-x86_64.tar.gz -C /opt/webrtc
    sudo chmod 777 -R /opt/webrtc/google-cloud-sdk
    
    1. 配置
    sudo gedit /etc/profile
    

    将路径添加到PATH项上

    export PATH=$PATH:/opt/webrtc/google-cloud-sdk/bin
    

    六、下载服务器源码(房间服务器和信令服务器)

    1. 下载服务器源码 https://github.com/webrtc/apprtc
    2. 解压到指定目录(如:/home/thf/Projects/apprtc-master)后进入目录,配置编译依赖:
    npm install
    

    编译:

    grunt build --force
    

    七、配置房间服务器
    主要是src/app_engine目录下的apprtc.py和constants.py文件。
    对于src/app_engine目录下的文件每次修改后需执行命令grunt build重新编译,
    也可以直接编辑out/app_engine目录下的apprtc.py和constants.py避免重新编译。
    修改constants.py,TURN_BASE_URL需要填写本机的ip地址(注意:使用localhost会有错误):

    #TURN_BASE_URL = 'https://computeengineondemand.appspot.com'
    TURN_BASE_URL = 'http://10.10.29.56:7002'
    #TURN_URL_TEMPLATE = '%s/turn?username=%s&key=%s'
    TURN_URL_TEMPLATE = '%s/turn.php?username=%s&key=%s'
    #CEOD_KEY = '4080218913'
    CEOD_KEY = '1234'
    #ICE_SERVER_BASE_URL = 'https://networktraversal.googleapis.com'
    ICE_SERVER_BASE_URL = 'http://10.10.29.56:7002'
    WSS_INSTANCES = [{   
        #WSS_INSTANCE_HOST_KEY: 'apprtc-ws.webrtc.org:443',
        WSS_INSTANCE_HOST_KEY: '10.10.29.56:7001', 
        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_HOST_KEY: '10.10.29.56:7001',
        WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
        WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
    }]
    

    修改apprtc.py:

    if wss_tls and wss_tls == 'false':
      wss_url = 'ws://' + wss_host_port_pair + '/ws'
      wss_post_url = 'http://' + wss_host_port_pair
    else:
      #wss_url = 'wss://' + wss_host_port_pair + '/ws'
      wss_url = 'ws://' + wss_host_port_pair + '/ws'
      #wss_post_url = 'https://' + wss_host_port_pair
      wss_post_url = 'http://' + wss_host_port_pair
    def make_pc_config(ice_transports):
      config = {
      #'iceServers': [],
      'iceServers': [{"urls":"stun:10.10.29.56"},{"urls":"turn:lin@10.10.29.56","credential":"1234"}],
      'bundlePolicy': 'max-bundle',
      'rtcpMuxPolicy': 'require'
      };
    if ice_transports:
      config['iceTransports'] = ice_transports
      return config
    

    把原来的wss和https的scheme都改为ws和http,不要让客户端或者浏览器去使用SSL链接。若有第三方根证书的签名机构颁发的证书可忽略。
    修改完后重新执行:

    grunt build
    
    1. 将/home/thf/Projects/apprtc-master/out/app_engine目录拷贝到服务器目录/opt/webrtc/(发布时使用)
    2. 配置启动脚本(发布时使用)
      新建启动脚本startAppRtc.sh:
    export APPRTC_APP=/opt/webrtc/app_engine
    export HOST="--host=192.168.164.128"
    export PORT="--port=7000"
    dev_appserver.py $HOST $PORT --enable_host_checking false $APPRTC_APP
    

    调试阶段可直接配置启动脚本指向/home/thf/Projects/apprtc-master/out/app_engine(这样就不用每次修改编译后要重新拷贝到opt目录下)
    新建启动脚本startAppRtc.sh:

    export APPRTC_APP=/home/thf/Projects/apprtc-master/out/app_engine
    export HOST="--host=192.168.164.128"
    export PORT="--port=7000"
    dev_appserver.py $HOST $PORT --enable_host_checking false $APPRTC_APP
    

    如果GAE报白名单错误,则启动参数中添加:

    --enable_host_checking false
    

    八、安装GO环境

    下载GO安装包并解压

    wget https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz --no-check-certificate
    tar xvf go1.9.2.linux-amd64.tar.gz
    sudo mv go /usr/lib
    

    编辑打开文件/etc/profile(也可根据自己需求选择其他环境配置文件编辑),在文件末尾添加两行

    export GOROOT=/usr/lib/go
    export PATH=$PATH:$GOROOT/bin
    

    保存退出执行

    source /etc/profile
    

    九、配置信令服务器

    1. 新建目录(collider_root)用于存放Collider的go代码程序。
    sudo mkdir -p /opt/webrtc/collider_root
    sudo mkdir /opt/webrtc/collider_root/src
    sudo chmod 777 -R /opt/webrtc/collider_root
    
    1. /etc/profile中添加
    export GOPATH=/opt/webrtc/collider_root
    export PATH=$PATH:$GOPATH/bin
    
    1. 建立链接(也可以直接将~/Projects/apprtc-master/src/collider/目录中的collider、collidermain、collidertest直接拷贝到~/collider_root/src目录下)
    ln -sf ~/Projects/apprtc-master/src/collider/collider $GOPATH/src/
    ln -sf ~/Projects/apprtc-master/src/collidermain $GOPATH/src/
    ln -sf ~/Projects/apprtc-master/src/collider/collidertest $GOPATH/src/
    
    1. 编辑$GOPATH/collidermain/main.go,修改房间服务器为我们前面的房间服务器:
    //var roomSrv = flag.String("room-server", "https://appr.tc", "The origin of the room server")
    var roomSrv = flag.String("room-server", "http://10.10.29.56:7000", "The origin of the room server")
    
    1. 编辑$GOPATH/collider/collider.go,设置信令服务器所需要用的HTTPS的证书文件, 找到如下代码,注释后改为这样:
    //e = server.ListenAndServeTLS("/cert/cert.pem", "/cert/key.pem")
    e = server.ListenAndServeTLS("/etc/nginx/apprtc.diveinedu.com.crt", "/etc/nginx/apprtc.diveinedu.com.key")
    

    6、安装信令服务器依赖和collidermain

    go get collidermain
    go install collidermain
    

    若go get collidermain命令运行失败(https访问导致),那么则用下面这个麻烦的方法:
    自行下载:https://www.golangtc.com/static/download/packages/golang.org.x.net.tar.gz
    然后解压到/opt/webrtc/collider_root/src目录

    tar xvf golang.org.x.net.tar.gz
    mv golang.org /opt/webrtc/collider_root/src
    cd $GOPATH/src
    go install golang.org/x/net/websocket/
    go get collidermain
    go install collidermain
    

    7、运行

    /opt/webrtc/collider_root/bin/collidermain -port=7001 -tls=false
    

    8、测试

    go test collider
    

    十、STUN/TURN/ICE服务器的搭建

    1. 安装环境
    sudo apt-get install libssl-dev libevent-dev
    

    2、下载源码(详细阅读安装手册 INSTALL)

    cd /home/thf/Projects
    wget http://turnserver.open-sys.org/downloads/v4.5.0.7/turnserver-4.5.0.7.tar.gz
    tar xvfz turnserver-4.5.0.7.tar.gz
    
    1. 编译和安装
    cd turnserver-4.5.0.7
    ./configure
    make
    sudo make install
    
    1. turnserver配置
      a) turnserver源码的example/etc目录中有提供turnserver的默认配置文件,以供我们使用,我们需要分别拷贝turnserver所需要的三个配置文件:
      首先在/etc目录下创建turnserver配置的存放目录:
    sudo mkdir /etc/turnserver/
    

    注: 这一步并不是必须的,因为turnserver启动时可以指定任意目录的配置文件。
    b) 拷贝conf配置脚本
    进入turnserver目录

    cd turnserver-4.5.0.7
    sudo cp ./examples/etc/turnserver.conf /etc/turnserver/
    

    注: 在 examples 目录下的此配置文件,每个配置项均有说明,这样可以明白具体的参数含义;
    此配置文件自己也可以新建,然后将后面章节中的内容直接粘贴进去;
    c) 拷贝 pem 秘钥文件
    为了做些明显的区分,我们将*.pem秘钥文件也拷贝到/etc/turnserver/目录(也可由 openssl命令生成,这里我们偷个懒,直接用默认的):

    sudo cp ./examples/etc/turn_server_*.pem /etc/turnserver/
    

    这里我们拷贝的秘钥文件,将在上一步的 turnserver.conf 配置文件中指定。
    d) 生成turnserver用户(可选)
    通过turnadmin执行简单的命令,指定相应的用户名、密码、域名,既可将此账号添加到turnserver的数据库中;
    如下:

    sudo turnadmin -a -u 用户名 -p 密码 -r 域名
    

    执行成功后,通过turnadmin -l既可查看新创建的用户名及域名:

    sudo turnadmin -a -u thf -p 123456 -r thf.com
    turnadmin -l
    thf[thf.com]表明创建成功!
    

    其实这里我们指定的密码和域名暂时都是无关紧要的,因为后面我们在启动turnserver时,可以通过相关参数,给其指定固定的域名和密码。
    e) 配置 turnserver.conf
    建议:将之前拷贝的 turnserver.conf 文件备份,并新建一个 turnserver.conf 文件,将一下内容拷贝进入:

    #日志输出级别,turnserver 启动时加上 -v,可以得到更清晰的日志输出
    Verbose
    #消息验证,WebRTC 的消息里会用到
    #fingerprint
    #webrtc 通过 turn 中继,必须使用长验证方式
    #lt-cred-mech
    # ICE REST API 认证需要
    use-auth-secret
    # REST API 加密所需的 KEY
    # 这里我们使用“静态”的 KEY,Google 自己也用的这个
    static-auth-secret=1234
    #用户登录域,下面的写法可以不改变它,因为再启动 turnserver 时,可以通过指定参数覆盖它
    realm=<填写你自己的域名>
    #可为 TURN 服务提供更安全的访问
    stale-nonce
    # SSL 需要用到的, 生成命令:
    # sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
    listening-ip=192.168.164.128
    listening-port=7002
    tls-listening-port=7002
    #relay-ip=192.168.164.128
    external-ip=192.168.164.128
    relay-threads=50
    use-auth-secret
    static-auth-secret=1234
    #user=lin:1234
    #user=xml:1234
    #userdb=/etc/turnuserdb.conf
    max-bps=1000000
    cert=/etc/turnserver/turn_server_cert.pem
    pkey=/etc/turnserver/turn_server_pkey.pem
    #max-bps=102400 
    pidfile="/var/run/turnserver.pid"
    log-file=/home/thf/Projects/turnserver-4.5.0.7/turn.log
    #屏蔽 loopback, multicast IP地址的 relay
    no-loopback-peers
    no-multicast-peers
    #启用 Mobility ICE 支持(不懂)
    mobility
    #禁用本地 telnet cli 管理接口
    no-cli
    
    1. 启动 turnserver
      通过 turnserver 实现 Peers 默认通过 turn 中继转发媒体数据流,进行音视频通话,其中一个关键点是coturn 需要布置到一个同时连接到两个网络的服务器(公网)上,如网卡一:公网,网卡二:私网(暂且还用不到),且需要同时联通网络,否则会出现两个Peers 只要开始连接,turnserver就会报 Allocation timeout的错误,目前原因需要通过跟踪代码去分析,暂时还未明确具体原因。
      启动turnserver可以通过如下命令进行启动:
    turnserver -v -L 192.168.164.128 -a -f -r 192.168.164.128 -c /etc/turnserver/turnserver.conf
    

    以上命令:通过 -v 指定日志输出级别; -L 指定用于绑定的网卡 IP 地址;-a 指定使用长期凭证机制,turn中继转发模式,必须使用长期凭证机制;-f 指定 turn 消息使用 fingerprint;-r 指定使用的域名,将覆盖 turnserver.conf 文件中的配置;-C 指定配置文件路径。

    https://webrtc.github.io/samples/src/content/pee/rconnection/trickle-ice
    检验打洞服务器是否正常

    内网
    room-server :10.10.29.56:7000
    single_server:10.10.29.56:7001
    turn_server :10.10.29.56:7002

    注意:因本服务器搭建在虚拟机中,而主机处于局域网中,因此主机和虚拟机构成了第二级的局域网(不同网络结构请注意根据自己的IP的配置关系来配置IP)。

    本示例网络状况:
    主机和虚拟机组成的局域网IP分别为:
    主机:192.168.164.1
    虚拟机:192.168.164.128
    主机所处的局域网中主机的IP:10.10.29.56

    所以

    1. 服务器启动参数的中的服务器IP配置为服务器所在虚拟机的二级局域网IP:192.168.164.128
    2. 服务器之间的访问IP参数则要配置成主机所处的一级局域网IP:10.10.29.56
      另外,局域网内的两个终端通讯,是不需要启动STUN/TURN/ICE服务器的。

    本例的STUN/TURN/ICE服务器的打洞功能没有经过外网的实际检测,需要进一步验证。

    错误处理:

    1. 连接房间服务器的时候报错:
    python2.7/urllib2.py", line 1198, in do_open raise URLError(err)
    URLError:<urlopen error [Errno 111] Connection refused>
    

    处理方式:
    关掉系统的代理
    在ubuntu的“系统设置”的“网络设置"中将代理设置方式为none

    相关文章

      网友评论

          本文标题:搭建WebRtc服务器

          本文链接:https://www.haomeiwen.com/subject/jqvvnxtx.html