WebRTC 云服务器搭建 AppRTC 环境
ztj100 2024-12-11 18:22 20 浏览 0 评论
apprtc 服务器搭建,搭建的主要目的是为了学习 Android 、Web 等各端基于 webrtc 音视频通信。
搭建得出了几点结论:
1、非 https 协议在 chrome 浏览器不支持打开音视频设备。
2、如果想要使各端都能通信,那么必须所有请求访问都使用 https 协议,证书可以在购买服务器平台上免费申请。
以下是最终效果图(手机跟 Web 互通需要所有 http 更换为 https 协议,该篇最终结果还未达到各端互通的条件,后续会更新补上)
搭建环境
- 服务器: 腾讯云
- 系统: centos
app2app
web2web
介绍
领取音视频开发资料包:音视频流媒体高级开发FFmpegWebRTCRTMPRTSPHLSRTP播放器
搭建 apprtc 需要用到以下几个服务。
apprtc AppRTC 是用来创建和管理通话状态的房间服务器。
coturn coturn 是一种 TURN 内网穿透服务器(也就是中转服务器),该服务器用于 VOIP 或通用数据流的 NAT 穿越和数据转发。
collider
collider 它是用 go 语言实现的基于 WebSocket 的信令服务器。 为了建立一个 webrtc 的通信过程,一般是需要有如下通信信息: 1、会话控制信息,用来开始和结束通话,即开始视频、结束视频这些操作指令。 2、发生错误时用来相互通告的消息 3、元数据,如各自的音视频解码方式、带宽。 4、网络数据,对方的公网 IP、端口、内网 IP 及端口。
搭建 AppRTC 服务的基本步骤
1、搭建 AppRTC 房间服务器
2、搭建 Coturn 穿透服务器
3、搭建 Collider 信令服务器
4、搭建 ICE 信息服务器
如何搭建 AppRTC
1、install JDK
yum install java-1.8.0-openjdk
#查看 Java 版本
java -version
2、install node.js
curl -sL https://rpm.nodesource.com/setup_10.x | bash -
yum install -y nodejs
# 确认是否成功
node --version
npm --version
# 构建 apprtc 用到
npm -g install grunt-cli
grunt --version
3、安装Python和Python-webtest (python2.7)
yum -y install epel-release
yum install python python-webtest python-pip
pip install --upgrade pip
4、安装google_appengine
wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.40.zip
unzip google_appengine_1.9.40.zip
#配置环境变量:在/etc/profile文件最后增加一行:
vim /etc/profile
#添加如下代码
export google_appengine_path=/root/webrtc/google_appengine
export PATH=$PATH:$google_appengine_path
#最后保存,使之生效
source /etc/profile
5、安装 go
yum install golang
#查看是否安装成功
go version
#创建go工作目录
mkdir -p /root/webrtc/goWorkspace/src
#配置环境变量:在 vim /etc/profile 文件最后增加一行:
export GOPATH=/root/webrtc/goWorkspace
#保存
source /etc/profile
6、安装libevent
#当前目录:root/webrtc/
#https://github.com/coturn/coturn/wiki/CoturnConfig
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure
make install
7、安装 AppRTC
#当前目录:root/webrtc/
git clone https://github.com/webrtc/apprtc.git
#将collider的源码软连接到go的工作目录下
ln -s /root/webrtc/apprtc/src/collider/collider $GOPATH/src
ln -s /root/webrtc/apprtc/src/collider/collidermain $GOPATH/src
ln -s /root/webrtc/apprtc/src/collider/collidertest $GOPATH/src
#编译collidermain
go get collidermain
go install collidermain
#go get collidermain: 被墙
#报错: package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket"
#执行:
#mkdir -p $GOPATH/src/golang.org/x/
#cd $GOPATH/src/golang.org/x/
#git clone https://github.com/golang/net.git net
#go install net
#再执行编译collidermain
#修改房间服务器为我们前面的房间服务器:
vim $GOPATH/src/collidermain/main.go
var roomSrv = flag.String(“room-server”, “https://49.235.159.44:8080”, “The origin of the room server”)
vim $GOPATH/src/collider/collider.go
#修改放入自己私有证书,目前这里放入腾讯云申请的 证书测试 app -> pc 通不了,固还是用自签名
e = server.ListenAndServeTLS(“/root/key/chat.codecocoa.com.pem”, “/root/key/chat.codecocoa.com.key”)
go get collidermain
go install collidermain
8、安装coturn
#目录:root/webrtc/
#https://github.com/coturn/coturn/wiki/Downloads
wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gz
tar xvfz turnserver-4.5.0.7.tar.gz
cd turnserver-4.5.0.7
#如果没有 openssl-devel 需要安装
yum install openssl-devel
./configure --prefix=./bin
make install
9、配置并运行 coturn Nat 穿透服务器
#内网:172.17.0.11 :DevYk:用户 12345 密码 & ctr+c 不会停止
nohup turnserver -L 172.17.0.11 -a -u DevYK:12345 -v -f -r nort.gov &
#或者 作者用的该方案
nohup turnserver -L 172.17.0.11 -a -u DevYK:12345 -v -f -r www.devyk.cn &
#netstat -ntulp 查看 5766,3478 端口是否启动
10、collider 信令服务器
配置防火墙,允许访问8089端口(tcp,用于客户端和collider建立websocket信令通信)
#创建自签名的数字证书
#如果没有openssl,需要安装
mkdir -p /cert
cd /cert
# CA私钥
openssl genrsa -out key.pem 2048
# 自签名证书
openssl req -new -x509 -key key.pem -out cert.pem -days 1095
#app 与 app 通信由于 ssl 问题需要将 tls =false
nohup $GOPATH/bin/collidermain -port=8089 -tls=true -room-server="https://49.235.159.44:8080" > /root/webrtc/collidermain.log 2>&1 &
#检查 8089 端口是否启动
netstat -ntulp
11. apprtc 房间服务器
配置防火墙,允许访问8080端口(tcp,此端口用于web访问)
配置文件修改(主要是配置apprtc对应的conturn和collider相关参数)
#49.235.159.44 外网ip
vim /root/webrtc/apprtc/src/app_engine/constants.py
#ICE_SERVER_OVERRIDE = None
# Enable by uncomment below and comment out above, then specify turn and stun
ICE_SERVER_OVERRIDE = [
{
"urls": [
"turn:49.235.159.44:3478?transport=udp",
"turn:49.235.159.44:3478?transport=tcp"
],
"username": "DevYK",
"credential": "12345"
},
{
"urls": [
"stun:49.235.159.44:8089"
]
}
]
#ICE_SERVER_OVERRIDE = None
#pc 必须使用 https
#ICE_SERVER_BASE_URL = 'https://49.235.159.44'
#在 APP 上因为没有 SSL 证书,那么只能用 http
ICE_SERVER_BASE_URL = 'http://49.235.159.44:8088'
ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
# Dictionary keys in the collider instance info constant.
WSS_INSTANCE_HOST_KEY = '49.235.159.44:8089'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{
WSS_INSTANCE_HOST_KEY: '49.235.159.44:8089',
WSS_INSTANCE_NAME_KEY: 'wsserver-std',
WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}
#,{
# WSS_INSTANCE_HOST_KEY: '49.235.159.44:8089',
# WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
# WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
#}
]
#编译
cd /root/webrtc/apprtc
npm install
grunt build
#如果出现下面错误,使用 cnpm 编译
/root/webrtc/apprtc/node_modules/mkdirp/lib/opts-arg.js
...
#npm 安装出现问题 使用 cnpm 安装
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install
grunt build
启动:
#172.31.247.136 : 内网ip
nohup dev_appserver.py --host=172.17.0.11 --port 8080 /root/webrtc/apprtc/out/app_engine --skip_sdk_update_check > /root/webrtc/apprtc.log 2>&1 &
#
检查 8080 Python 是否起来
netstat -ntulp
12、 配置 ICE Service
mkdir /root/webrtc/iceService
vim ice.js
var http = require('http');
var crypto = require('crypto')
var hmac = function(key, content) {
var method = crypto.createHmac('sha1', key)
method.setEncoding('base64')
method.write(content)
method.end()
return method.read()
}
http.createServer(function(request, response) {
//账户
var timestamp = Math.floor(Date.now() / 1000)
var turn_username = timestamp + ':DevYK'
//密码
var key = '12345'
var password = hmac(key, turn_username)
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
console.log(turn_username);
console.log(password);
// 发送响应数据 "ice服务器"
response.end('{"iceServers":[{"username":"'+turn_username+'","credential":"'+password+'","urls":["stun:49.235.159.44:3478","turn:49.235.159.44:3478"]}]}\n');
}).listen(8088);
// 终端打印如下信息
console.log('ICE Server running');
启动 ICE REST API 服务
nohup node ice.js &
#检查 8088 服务是否启动
netstat -ntulp
13、nginx 设置反向代理
nginx 已存在进行配置
11.1 配置反向代理
events {
worker_connections 1024;
}
http{
#apprtc 服务
upstream roomserver {
server 49.235.159.44:8080;
}
server {
listen 80;
server_name 49.235.159.44;
return 301 https://$server_name$request_uri;
}
server {
root /root/webrtc/nginx-1.17.8/html;
index index.php index.html index.htm;
listen 443 ssl;
#腾讯云证书
#ssl_certificate /root/ssl/1_www.devyk.cn_bundle.crt;
#ssl_certificate_key /root/ssl/2_www.devyk.cn.key;
#ssl_session_timeout 5m;
#请按照以下协议配置
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
#ssl_prefer_server_ciphers on;
#自签名
ssl_certificate /cert/cert.pem;
ssl_certificate_key /cert/key.pem;
server_name 49.235.159.44;
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;
}
}
}
11.1.1已安装但是没有配置 ssl
#开启 nginx 服务 error
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in
/bin/conf/nginx.conf
解决:
#切换到源码包:
cd /nginx/nginx-1.17.9
#查看nginx原有的模块
/bin/sbin/nginx -V
#在configure arguments:后面显示的原有的configure参数如下:
--prefix=./bin
重新编译, 加入 --with-http_ssl_module
./configure --prefix=./bin --with-http_ssl_module
#编译
make
ps: 这里千万别 make install 覆盖安装,因为之前还有 nginx 配置。
将之前的 nginx rm 替换为 objs/nginx
#在 nginx/1.17 模块下
rm -rf bin/sbin/nginx
cp objs/nginx bin/sbin/
最后重启服务
#启动
bin/sbin/nginx
#重启
bin/sbin/nginx -s reload
nginx 未安装配置
11.2 下载 nginx
wget http://nginx.org/download/nginx-1.17.9.tar.gz
tar -zxvf nginx-1.17.9.tar.gz
11.2.1编译 nginx
./configure --prefix=./bin --with-http_ssl_module
make install
11.2.2 配置 nginx.conf
vim /root/webrtc/nginx-1.17.8/bin/conf/nginx.conf
#apprtc 服务
events {
worker_connections 1024;
}
http{
upstream roomserver {
server 49.235.159.44:8080;
}
server {
listen 80;
server_name www.devyk.cn;
return 301 https://$server_name$request_uri;
}
server {
root /root/nginx/nginx-1.17.8/html;
index index.php index.html index.htm;
listen 443 ssl;
#腾讯云证书
#ssl_certificate /root/nginx/nginx-1.17.8-http-rtmp/ssl/rtc.crt;
#ssl_certificate_key /root/nginx/nginx-1.17.8-http-rtmp/ssl/rtc.key;
#自签名证书
ssl_certificate /cert/cert.pem;
ssl_certificate_key /cert/key.pem;
server_name 49.235.159.44;
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;
}
}
}
11.2.3 启动 nginx
#启动
bin/sbin/nginx
#重启
bin/sbin/nginx -s reload
搭建中遇见的问题
- 浏览器通话跨域问题 :pushState
vim /root/webrtc/apprtc/out/app_engine/js/apprtc.debug.js
#全局搜索 pushState 增加:
roomLink=roomLink.substring("http","https");
Websocket open error:
Messages:
WebSocket open error: WebSocket error.
WebSocket register error: WebSocket error.
PC 上如果遇见这个问题,一般需要检查 apprtc 、 constants.py 、签名的配置信息。
相关推荐
- sharding-jdbc实现`分库分表`与`读写分离`
-
一、前言本文将基于以下环境整合...
- 三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么
-
在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...
- MySQL8行级锁_mysql如何加行级锁
-
MySQL8行级锁版本:8.0.34基本概念...
- mysql使用小技巧_mysql使用入门
-
1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...
- MySQL/MariaDB中如何支持全部的Unicode?
-
永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...
- 聊聊 MySQL Server 可执行注释,你懂了吗?
-
前言MySQLServer当前支持如下3种注释风格:...
- MySQL系列-源码编译安装(v5.7.34)
-
一、系统环境要求...
- MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了
-
对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...
- MySQL字符问题_mysql中字符串的位置
-
中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...
- 深圳尚学堂:mysql基本sql语句大全(三)
-
数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...
- MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?
-
大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...
- 一文讲清怎么利用Python Django实现Excel数据表的导入导出功能
-
摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...
- 用DataX实现两个MySQL实例间的数据同步
-
DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...
- MySQL数据库知识_mysql数据库基础知识
-
MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...
- 如何为MySQL中的JSON字段设置索引
-
背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...
你 发表评论:
欢迎- 一周热门
-
-
MySQL中这14个小玩意,让人眼前一亮!
-
旗舰机新标杆 OPPO Find X2系列正式发布 售价5499元起
-
【VueTorrent】一款吊炸天的qBittorrent主题,人人都可用
-
面试官:使用int类型做加减操作,是线程安全吗
-
C++编程知识:ToString()字符串转换你用正确了吗?
-
【Spring Boot】WebSocket 的 6 种集成方式
-
PyTorch 深度学习实战(26):多目标强化学习Multi-Objective RL
-
pytorch中的 scatter_()函数使用和详解
-
与 Java 17 相比,Java 21 究竟有多快?
-
基于TensorRT_LLM的大模型推理加速与OpenAI兼容服务优化
-
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)