webrtc+srs项目部署中遇到的问题

1,363 阅读2分钟

由于我的项目中使用到了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服务无响应,执行如下命令

  1. 查看所有容器

docker ps -a

  1. 删除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协议来请求域名。包括图片资源等。

参考链接:

www.bilibili.com/read/cv1667…

juejin.cn/book/716841…