通过Frp将内网服务开放在公网,完美避免服务器和个人PC的性能和网络矛盾,Frp简单来说也是反向代理的一种

使用场景:

直播推流是对CPU单核和多核要求都高的场景,单核编码帧画面,决定延迟和画质;多核并发编码,影响效率。大家在租用云服务器的时候,CPU内核和RAM是影响价格的重要因素之二。从处理器的角度来看,低廉服务器的CPU年代久,架构老,硬件编码能力弱;我们的个人电脑内核数更多(相较于我们租用云服务器的划分内核数),而且Intel的核显编解码能力大家有目共睹,能胜任一般情况下的推流和编解码场景。从RAM的角度来看,我们希望服务器能跑更多的服务,每个服务的内存占用尽量降低,但是推流和编解码是占用内存较大的场景,会增加我们机器的负载;而在现在的个人电脑上,16G都有隐隐不够用的而向32G发展趋势,可以说应付推流和编解码的占用轻轻松松,退一步讲,即使8G/4G,对于Linux和Docker也是相当自由且富裕的(请读者忽略挡在内存大涨价的行情)。

说完了性能,再来谈谈网络。当下国内的家庭网络正处于IPV4极度稀缺(指几乎不可能向运营商申请),IPV6正在推进(但是也是大NAT)的阶段。所以将内网服务开放在公网一直是大家的需求。云服务器一般都有独立的公网地址,或者NAT端口,公网访问轻轻松松,我们可以通过Frp技术将内网设备连接公网服务器,Frp对于服务器资源占用取决于流量多少,但消耗也远远小于直接在服务器端推流和编解码,从而内网服务<—>服务器<—>用户。这样,个人电脑负责性能,服务器负责网络流量转发,各司其职,发挥所长,两方都是杀鸡用牛刀。

实战平台:

搭建教学:

Frp

  1. 以1Panel为例,打开应用商店,搜索Frp,选择Frp服务端安装并设置账密,一个面板端口(可以不开),一个frp服务端口(一定要开),再另外开启一个打洞端口(一定要开)。以我的服务器为例,打开文件目录/opt/1panel/apps/frps/frps/data,打开frps.toml,将以下内容粘贴

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    bindAddr = "0.0.0.0"
    bindPort = 7000 #面板端口

    vhostHTTPSPort = 8443 #打洞端口

    auth.method = "token"
    auth.token = "你的token"

    webServer.addr = "0.0.0.0"
    webServer.port = 7500 #服务端口
    webServer.user = "你的用户名"
    webServer.password = "你的密码"

    # tls
    #transport.tls.force = true
    #transport.tls.certFile = "/etc/frp/ssl/server.crt"
    #transport.tls.keyFile = "/etc/frp/ssl/server.key"
    #transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"

  2. 在我们个人电脑下载并安装Frpmgr,选择新建配置-基本,名称随意,填入服务器地址、端口(默认7000);切换认证一栏,选择Token,填入第一步设置的密码。

  3. 打开我们第二部建立好的配置,右侧点击新建,名称随意,类型选择tcp,本机地址127.0.0.1,本地端口取决于你本地服务的端口,远程端口即为第三部的打洞端口,其他保持默认即可。

  4. 公网打开Frp服务面板,显示客户端Online;本地打开Frpmgr,绿灯亮起,即是连接成功。

SyncTV-Docker Desktop

  1. 终端输入wsl进入wsl,打开电脑上的Docker Desktop(如果读者对这一步存疑,可以阅读我上篇文章 WSL2—Linux发行版以及Docker的安装
  2. 在Docker Desktop顶部搜索synctv,选择第一个直接Run,名称随意,端口选一个空端口(可以在PowerShell里面用netstat -ano | findstr :端口,这条命令检查占用,无返回即是空端口)。
  3. 容器绿灯亮起即启动成功,在浏览器内访问localhost:端口,即可进入webui面板,默认账密都是root。
    SyncTV-Docker Desktop

SyncTV-wsl命令行

  1. 终端输入wsl进入wsl,sudo -v ; curl -fsSL https://raw.githubusercontent.com/synctv-org/synctv/main/script/install.sh | sudo bash -s -- -v latest或者docker run -d --name synctv -v /opt/synctv:/root/.synctv -p 8080:8080 synctvorg/synctv
  2. wsl中输入synctv server启动服务
  3. 在浏览器内访问localhost:端口,即可进入webui面板,默认账密都是root
    启动成功log

Frp反代建站:

  1. 以OpenResty为例,选择反向代理,将我们的打洞端口反代到指定域名,并配置https
  2. OpenResty建站详见使用1Panel进行反向代理和SSL证书申请

SyncTV使用技巧:

  • 登录后,在个人中心-绑定账号可以绑定Billbill,Alist(Openlist),Emby。其中Alist账户要求不能开始2FA
  • 每个注册的账户都可以绑定个人账户,管理员可以设置用户注册要求和开启房间要求
  • 添加BiliBili视频时,选择共享和代理选项,可以给观众提供绑定账号的B站权益(大会员)
  • 创建直播,建议在本地(localhost:8080)地址创建,这样串流不经过服务器,本地OBS直连SyncTV
  • 房间内的语音要求Https连接(前文反代建站配置https)

后记:

这样流程走下来我们就能实现高性能私域直播,也许有读者知道Owncast这个更专业的私域直播服务,我之前也使用过,也很好,参数更多可调整,但是我之所以SyncTV,是因为他集成了Bilibili,Alist和Emby和直播,原生中文支持,更加易用。最后,很感谢你能看到这里。