WebRTC,是Web Real-Time Communication的缩写,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术,于2011年5月开放了工程的源代码,在行业内得到了广泛的支持和应用,成为下一代视频通话的标准。

这篇文章要搭建的,是基于webrtc的apprtc示例,GitHub地址:https://github.com/webrtc/apprtc 里面有讲一些安装步骤,但是不够仔细,楼主试了几天,填了很多坑之后,终于将环境搭起来了,过程比较艰辛,要安装的东西和注意的细节太多,值得写篇文章来记录一下~

准备工作

了解原理

需要搭建三个服务器,分别是房间服务器、信令服务器以及打洞服务器

  • 通话的房间服务器(Room Server)

    房间服务器是用来创建和管理通话会话的状态维护,是双方通话还是多方通话,加入与离开房间等等,我们暂时沿用Google部署在GAE平台上的AppRTC这个房间服务器实现,该GAE App的源码可以在github.com上获取.该实现是一个基于Python的GAE应用,我们需要下载Google GAE的离线开发包到我们自己的Linux服务器上来运行该项目,搭建大陆互联网环境下的房间服务器。

  • 通话的信令服务器(Signaling Server)

    信令服务器是用来管理和协助通话终端建立去中心的点对点通话的一个角色,主要功能如下,具体协议实现没有严格规定,只要能实现功能就行

    1. 用来控制通信发起或者结束的连接控制消息
    2. 发生错误时用来相互通告的消息
    3. 各自一方媒体流元数据,比如像解码器、解码器的配置、带宽、媒体类型等等
    4. 两两之间用来建立安全连接的关键数据
    5. 外界所能看到的网络上的数据,比如广域网IP地址、端口等
  • 防火墙打洞服务器(STUN/TURN/ICE Server)

    我们目前大部分人连接互联网时都处于防火墙后面或者配置私有子网的家庭(NAT)路由器后面,这就导致我们的计算机的IP地址不是广域网IP地址,故而不能相互之间直接通讯. 正因为这样的一个场景,我们得想办法去穿越这些防火墙或者家庭(NAT)路由器,让两个同处于私有网络里的计算机能够通讯起来。
    ICE协议是一个offer/answer模型的扩展,是综合TURN和STUN的综合性NAT穿越解决方案,通过在offer和answer的SDP(Session Description Protocol)里面包含多种IP地址和端口,然后对本地SDP和远程SDP里面的IP地址进行配对,然后通过P2P连通性检查进行连通性测试工作,如果测试通过即表明该传输地址对可以建立连接。有兴趣可以去搜索了解一下,这次要安装的ICESever是coTurn,它的功能比较丰富,是一个C/C++语言的开源项目,项目地址: https://code.google.com/archive/p/coturn/

环境准备

先说一下,楼主系统是ubuntu14.04,内网IP是125.216.242.151,后续很多命令都是基于ubuntu,很多配置中都要用到IP地址,而且需要填写机构或key的时候,楼主都是用的ID:jwcqc,另外,所有的下载或安装都在/server/目录下。

首先需要安装nodejs包管理和分发工具npm:

1
sudo apt-get install npm

其次是安装python-webtest:

1
sudo apt-get install python-webtest

科学上网

由于安装过程中像Google App Engine和编译安装collider都需要FQ,因此最好提前准备好 FQ 环境,否则安装过程中会遇到网络引起的各种错误。

作为示例,楼主系统是ubuntu14.04,已通过设置http代理实现科学上网,只需编辑 /etc/profile,填入以下三行即可:

1
2
3
export http_proxy=http://your_proxy.com:port/
export ftp_proxy=http://your_proxy.com:port/
export https_proxy=http://your_proxy.com:port/

然后 source /etc/profile 进行保存,可以使用curl www.google.com 测试一下是否设置成功。


环境搭建

房间服务器搭建

  1. 安装依赖

    1
    2
    3
    4
    sudo apt-get install nodejs
    sudo npm install -g npm
    sudo apt-get install nodejs-legacy
    sudo npm -g install grunt-cli
  2. 下载apprtc源码

找到一个目录用来存放源码(楼主下载时最新提交版本是3459f8c1ba69a8011f117de3b46b2f19372e1660),依次执行

1
2
3
git clone https://github.com/webrtc/apprtc.git
cd apprtc
npm install //install grunt and required grunt dependencies

  1. 修改配置文件

接下来需要修改项目中的 /apprtc/src/app_engine/constants.py,修改的部分内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//turn打洞服务器配置
TURN_BASE_URL = 'https://125.216.242.151'
TURN_URL_TEMPLATE = '%s/turn?username=%s&key=%s'
CEOD_KEY = 'jwcqc' //主要要与之后turn服务器中的配置一致
//ICE服务器配置
ICE_SERVER_BASE_URL = 'https://125.216.242.151'
ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
WSS_INSTANCE_HOST_KEY = '125.216.242.151:8089' //信令服务器配置,这里分配8089端口
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{
WSS_INSTANCE_HOST_KEY: '125.216.242.151:8089',
WSS_INSTANCE_NAME_KEY: 'wsserver-std',
WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}, {
WSS_INSTANCE_HOST_KEY: '125.216.242.151:8089',
WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
}]

修改之后,进入到apprtc根目录,开始build

1
grunt build

注意每一次对源代码的修改,都需要重新再编译一次,编译过后,会得到一个out目录,可以进去查看之前的修改是否生效。

  1. 安装googleappengine

运行还依赖 Google App Engine SDK for Python,地址点我(需要FQ),选择一个目录,先后运行如下命令:

1
2
3
4
5
6
7
8
9
10
//下载
wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.40.zip
//解压
unzip google_appengine_1.9.40.zip
//设置环境变量
vim /etc/profile
//添加进profile
export PATH="$PATH:/root/google_appengine/"
//保存环境变量
source /etc/profile

  1. 开启roomserver

执行完上面4步后,房间服务器的安装与配置便已完成,接下来就是运行了,进入到google_appengine根目录下,执行:

1
sudo ./dev_appserver.py --host=125.216.242.151 /server/apprtc/out/app_engine //楼主的apprtc位于server目录下

如果嫌运行时间过长,想在后台运行程序,只需用nohup comand &操作即可

1
sudo nohup ./dev_appserver.py --host=125.216.242.151 /server/apprtc/out/app_engine &

运行完按回车返回前台,nohup以日志形式输出在运行此命令目录下的nohup.out文件

运行成功的话可在浏览器中打开 125.216.242.151:8080 进行访问

信令服务器Collider搭建

  1. 安装Go语言运行环境

下载地址:https://golang.org/doc/install?download=go1.7.3.linux-amd64.tar.gz
下载完成后解压,楼主解压在了/server/目录下,接着再在server目录下创建gopath目录,开始配置go环境:

1
vim /etc/profile

添加以下内容:

1
2
3
export GOROOT=/server/go
export GOPATH=/server/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

使用 source /etc/profile 保存,然后可以运行 go version 查看是否配置正确。

  1. 拷贝与修改

首先拷贝 /apprtc/src/collider 下的三个文件夹到 /server/gopath/src 目录下:

1
2
3
cp /server/apprtc/src/collider/collider /server/gopath/src
cp /server/apprtc/src/collider/collidermain /server/gopath/src
cp /server/apprtc/src/collider/collidertest /server/gopath/src

修改 /server/gopath/src/collidermain/main.go文件,修改房间服务器IP:

1
var roomSrv = flag.String("room-server", "https://125.216.242.151", "The origin of the room server")

再编辑 /server/gopath/src/collidermain/main.gocollider.go 文件,设置信令服务器所需要用的HTTPS的证书文件(证书的创建在第3步,注意目录对应上):

1
e = server.ListenAndServeTLS("/server/cert/jwcqc.crt", "/server/cert/jwcqc.key")

  1. 创建信令服务器证书

创建第2步中用到的ssl证书jwcqc.crt和jwcqc.key,本示例的证书创建在/server/cert下,进入到此目录,然后依次执行:

1
2
3
4
5
openssl genrsa -des3 -out jwcqc.key 2048
openssl req -new -key jwcqc.key -out jwcqc.csr
cp jwcqc.key jwcqc.key.org
openssl rsa -in jwcqc.key.org -out jwcqc.key
openssl x509 -req -days 365 -in jwcqc.csr -signkey jwcqc.key -out jwcqc.crt

期间会让输入地理位置、机构、密匙等信息,按照提示输入即可,楼主的密码全部设的是:jwcqc

  1. 编译collider源码

进入 /server/gopath 目录,准备编译安装collider(需要FQ)

1
2
go get collidermain
go install collidermain

成功编译后会在gopath目录下生成bin和pkg目录。

  1. 运行collider服务器

进入 /server/gopath/bin 目录,用如下命令运行collider服务器:

1
./collidermain -port=8089 -tls=true

coTurn服务器搭建

下载安装

最后一步是安装coTurn打洞服务器,下载地址 http://turnserver.open-sys.org/downloads/ 找到适合自己系统的下载即可,楼主下载的是 http://turnserver.open-sys.org/downloads/v4.4.5.3/turnserver-4.4.5.3-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz

然后解压到 /server/turnserver/下:

1
tar -zxvf turnserver-4.4.5.3-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz

解压后会得到INSTALL安装须知和.deb包,可以使用 cat INSTALL 查看一下安装手册,根据指导进行安装:

1
2
3
sudo apt-get update
sudo apt-get install gdebi-core
sudo gdebi *.deb

生成签名证书

这里同样生成在了/server/cert/目录下,密码全部是jwcqc:

1
sudo openssl req -x509 -newkey rsa:2048 -keyout /server/cert/turn_server_pkey.pem -out /server/cert/turn_server_cert.pem -days 99999 -nodes

接下来运行

1
turnadmin -k -u jwcqc -r north.gov -p jwcqc

拷贝生成得到的key,下一步会用到。

编辑配置文件

首先编辑 /etc/default/coturn 将 TURNSERVER_ENABLED=1 的注释去掉,
再编辑 /etc/turnserver.conf,在末尾加入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
listening-device=eth0
listening-port=3478
relay-device=eth0
min-port=49152
max-port=65535
Verbose
fingerprint
lt-cred-mech
use-auth-secret
static-auth-secret=jwcqc
user=jwcqc:0x949534a397bcf2e88470c86ad3749d9c(替换成上一步通过turnadmin生成的key)
user=jwcqc:jwcqc
stale-nonce
cert=/server/cert/turn_server_cert.pem
pkey=/server/cert/turn_server_pkey.pem
no-loopback-peers
no-multicast-peers
mobility
no-cli

最后一步,进入/apprtc/src/web_app/js/utils.js,修改requestIceServers函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
function requestIceServers(iceServerRequestUrl, iceTransports) {
return new Promise(function(resolve, reject) {
var servers = [{
credential: "jwcqc",
username: "jwcqc",
urls: [
"turn:125.216.242.151:3478?transport=udp",
"turn:125.216.242.151:3478?transport=tcp"
]
}];
resolve(servers);
});
}

由于修改了代码,因此需要进入apprtc目录下执行 grunt build 重新编译。

启动coturn服务器

1
service coturn start

至此,三个服务器便已全部搭建完成并启动,接下来要做的,就是安装并配置Nginx反向代理服务器,提供默认HTTPS的访问。

Nginx服务器安装与配置

安装

这里采用在线安装的方式:

1
sudo apt-get install nginx

所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下,启动程序文件在/usr/sbin/nginx,日志放在了/var/log/nginx中,分别是access.log和error.log,并已经在/etc/init.d/下创建了启动脚本nginx,默认的虚拟主机的目录设置在了/usr/share/nginx/www。

也可以采用源代码安装方式,下载地址 http://nginx.org/download/ 下载过后解压缩,再进入到解压后的文件夹,先后执行./configure指令,再 make,再 make install 即安装完成,安装成功之后,nginx放置在/usr/local/nginx目录下,主要的配置文件为conf目录下的nginx.conf,nginx的启动文件在sbin目录下的nginx文件。

接下来修改配置文件:vim /etc/nginx/sites-enabled/local

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
upstream roomserver {
server 125.216.242.151:8080;
}
server {
listen 80 ;
server_name 125.216.242.151;
return 301 https://$server_name$request_uri;
}
server {
root /usr/share/nginx/html;
index index.php index.html index.htm;
listen 443 ;
ssl on;
ssl_certificate /server/cert/jwcqc.crt;
ssl_certificate_key /server/cert/jwcqc.key;
server_name 125.216.242.151;
access_log /var/log/nginx/jwcqc.log;
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

在线安装的启动过程:

1
sudo /etc/init.d/nginx start

源代码安装的启动过程:

1
2
cd /usr/local/nginx
sbin/nginx

然后就可以通过 http://localhost 进行访问了,默认是80端口


最后,终于!!! 打开一个谷歌浏览器,访问 http://125.216.242.151 ,选择默认随机生成的房间号或自己手动输入房间号,即可以多台电脑进入这个房间进行测试了。