由于我的项目中使用到了srs服务器,因此我们先来安装srs服务。
一、srs的安装
1935 RTMP的常用端口1985 API接口端口8080默认控制台访问端口在这里我映射到宿主机8085端口
docker run -d --name srs -p 1935:1935 -p 1985:1985 -p 8085:8080 ossrs/srs:5.0.30
执行完上面的再继续:
docker cp -a srs:/usr/local/srs/conf /home/srs5/
这一步的目的是从容器中拷贝配置文件到宿主机的 /home/srs5 目录,因为中间我们可能会配置一些其他的东西,如果在容器内部更改,那么不小心容器被删除,配置历史也就找不到了。
docker rm -f srs
移除旧的容器,因为我们的目标是从里面拷贝配置文件,因此拷贝完后,这个容器也就没有必要存在了,而我们正式用的容器则是需要挂载上面拷贝配置所启动的容器。
CANDIDATE为临时变量,当前服务器的IP,如果是公网服务器的话则为公网IP 用户webrtc UDP 包的传输
CANDIDATE="192.168.101.99" docker run --restart=always -d -v /home/srs5/conf/:/usr/local/srs/conf/ -p 1935:1935 -p 1985:1985 -p 8085:8080 \ --env CANDIDATE=$CANDIDATE -p 8000:8000/udp \ ossrs/srs:5.0.30 ./objs/srs -c conf/docker.conf
如果srs服务无响应,执行如下命令
- 查看所有容器
docker ps -a
- 删除srs容器
docker rm 【容器id/容器名】
最后按照上面的步骤,重新安装srs。通过 ip地址:8085可以访问到srs控制台。
二、coturn网络穿透服务器安装
1.准备步骤
首先安装各种依赖和软件
yum install git
yum install gcc
yum install gcc-c++
yum install openssl
yum install openssl-devel
yum install libevent2
yum install libevent-devel
遇到的所有选项都选y,一路y下去,安装完毕后
准备安装coturn包。注意,不要直接git clone coturn,会出现编译错误
此处安装稳定的版本,下载压缩包
wget https://github.com/coturn/coturn/archive/4.5.1.1.tar.gz
然后进行解压,编译,依次执行
tar -zxvf 4.5.1.1.tar.gz
cd coturn-4.5.1.1
./configure
make
make install
注意,如果cd coturn-4.5.1.1找不到文件夹的话,一般安装包的默认安装位置在阿里云的/usr/local目录下,切换到该目录下继续执行操作即可
如果成功了,可以通过which turnserver验证。如果出现路径即为成功,
2.配置文件夹
进入文件夹:
cd /usr/local/etc/
会看到一个叫做 turnserver.conf.default的配置文件。
通过命令将它备份:
cp turnserver.conf.default turnserver.conf
然后修改turnserver.conf文件内容
#中继服务器监听的IP地址,NAT环境下直接写私网IP地址,可以指定多个IP
listening-ip=172.30.124.174
listening-port=3478
#中继服务器转发地址(本地IP地址将用于传递数据包的给每个端),最好直接写 ip addr 输出的eth1的ip,不存在则直接公网IP
relay-ip=120.77.170.59
#外部IP,直接写公网IP地址
external-ip=120.77.170.59中继线程,如果服务器资源充足可以适当扩大,最大不能超过 50
relay-threads=2
#打开密码验证,使用短期证书机制。
lt-cred-mech
#UDP端口 下面默认就有 可以自定义自己想要的区间 这个就是中继流量转发的端口
min-port=17001
max-port=19001
#turn服务器的用户和凭据
user=longzai:123456
#打开下面DB关闭mysql DB ,
userdb=/var/lib/coturn/turndb
##mysql-userdb xxxxxxxxxxxxxxxxxxx ##注释这里可以不用管,公网需要的则可以配置对应的域名
realm=example.cn
配置日志输出,用户后面直接重定向到容器日志
log-file=stdout # 注释 sys-log
配置完成后,执行如下命令,启动服务
turnserver -v -r 你的公网ip:3478 -a -o -c /usr/local/etc/turnserver.conf
下图即为执行启动
可以通过webrtc.github.io/samples/src… 来测试服务是否启动成功。
注意:测试服务的返回信息可能不准确,还是要在代码里面使用来测试。
3.coturn的使用
let rtcPcParams = {
iceServers: [
{ url: "stun:stun.l.google.com:19302"},// 谷歌的公共服务
{urls: 'turn:x.x.x.x:3478', username:'longzai', credential:'123456'},//turn服务 自建 可以配置多个
]
},
---------------参数调用位置-----------------
pc = new PeerConnection(rtcPcParams)
三、SSL 证书自动签发
工具下载安装
# 注意下面的邮箱换成你自己的
curl https://get.acme.sh | sh -s email=1215618342@qq.com
开启自动更新
acme.sh --upgrade --auto-upgrade
切换 CA 类型
目前 acme.sh 支持四个正式环境 CA,分别是 Let's Encrypt、Buypass、ZeroSSL和 SSL.com,默认使用 ZeroSSL。我们一般使用Let's Encrypt就可以,既支持单域名,也支持通配符多域名证书(虽然通配符类型证书时间仅有3个月,但是好在我们有这个工具)。切换LE类型命令如下:
acme.sh --set-default-ca --server letsencrypt
泛域名仅支持 DNS 验证
申请 API 密钥(DNSPod Token) 腾讯云API Key申请,每个厂商的DNS验证参数配置是不一样的额,如果你的域名不是腾讯云的那么请查看此文档 。然后编辑 acme工具配置信息,如下:
cd ~/.acme.sh
vi account.conf
## 添加如下 dnspod 密钥
#腾讯云域名
export DP_Id="xxxx"
export DP_Key="12222222222"
#阿里云域名
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
证书申请
注意下面参数:dns_dp表示用腾讯云 dnspos验证 -d webrtc.link -d *.webrtc.link表示域名,自己的请配置自己的域名
如果域名为阿里云的则dns_dp替换为dns_ali
生成的证书和密钥将保存到/home/nginxWebUI/letsebcrypt/下
acme.sh --iacme.sh --issue --log --dns dns_dp -d webrtc.link -d *.webrtc.link --key-file /home/nginxWebUI/letsebcrypt/private.key --fullchain-file /home/nginxWebUI/letsebcrypt/cert.crt
出现下图,则说明证书生成成功。
项目部署
为了避免跨域和协议不同的问题,我这里通过后端项目来代理前端静态资源。后端服务端口为18080
const koa = require("koa");
const router = require("koa-router");
const staticAssets = require("koa-static");
const bodyparse = require("koa-bodyparser");
const cors = require("@koa/cors");
const fs = require("fs");
const path = require("path");
const fileRoutes = require("../router/index");
const errorHandler = require("./errorHandler");
const app = new koa();
// 定义中间件,解决刷新页面找不到资源,返回404的问题
app.use(async (ctx, next) => {
// history 中间件
const path = "/dist/"; // 需要判断的路径
await next(); // 等待请求执行完毕
if (ctx.response.status === 404) {
// 判断是否符合条件
ctx.type = "text/html; charset=utf-8"; // 修改响应类型
// 注意:这里路径是相对于项目根目录的
ctx.body = fs.readFileSync("./dist/index.html"); // 修改响应体
}
});
//代理静态资源
app.use(staticAssets("dist"));
let corsOptions = {
origin: function (ctx) {
return "*";
},
};
app.use(cors(corsOptions));
app.use(bodyparse());
app.fileRoutes = fileRoutes;
app.fileRoutes();
//监听错误,处理错误
app.on("error", errorHandler);
module.exports = app;
nginx启动https代理
server
{
server_name longzai1024.top;
listen 443 ssl http2;
ssl_certificate /home/nginxWebUI/letsebcrypt/cert.crt;
ssl_certificate_key /home/nginxWebUI/letsebcrypt/private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# http重定向到https
if ($scheme = http) {
return 301 https://$host:443$request_uri;
}
location / {
proxy_pass http://49.xxx.51.105:18080/;
#这里就是信令服务启动的服务地址,看上一步访问地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
## 信令核心配置 必须开启支持 websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect http:// https://;
}
#代理srs服务地址
location /rtc {
proxy_pass http://49.xxx.51.105:1985/;
#这里就是信令服务启动的服务地址,看上一步访问地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
## 信令核心配置 必须开启支持 websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect http:// https://;
}
}
注意:由于我们的项目时运行在https环境下的,项目中所有的请求,我们都需要使用https协议来请求域名。包括图片资源等。
参考链接: