🎬 第十一章 SRS搭建直播平台
📄 一句话概括

集群不是在全局配的,是在每个 vhost 里配的。 同一台机器,不同 vhost 可以是不同角色。

📝 本节和前面几节的关系

11.3.1 讲了三种角色,这一节把它们写进 cluster 块。 11.4.1 开始逐份拆配置文件。

一、按 vhost 配,不按机器配

这一点和直觉相反:不是「这台机器是边缘」, 而是「这个域名在这台机器上是边缘」。

所以同一台机器上可以是这样的: a.example.com 配成 local,本地就是源; b.example.com 配成 remote,去别处回源。 两条规则互不干扰,因为它们在不同 vhost 里。

配置长这样:

vhost live.example.com {
    cluster {
        mode    remote;
        origin  192.168.1.10:1935;
    }
}

origin 可以写多个,用分号隔开,第一个连不上就试下一个。 这是主备,不是负载均衡。

二、三个 mode 的实际差别

① local:我自己就是源,谁要也不给。 它不往别处要流,也不会把流转出去。 ② remote:我是边缘,观众来了我去 origin 要。 没写 origin 就会一直转圈。 ③ origin:我是源,允许别的边缘来拉。 这是默认行为,多数时候不用显式写。

三者里最需要留意的是 local: 它不转发、不缓存,只在本地服务。 用它做「内网专用源」很合适,但观众从外面连它就什么也看不到。

三、配错的三个症状

① mode remote 却没写 origin:启动不报错, 观众一连上就一直转圈,日志里反复刷「连不上源站」。 ② origin 写成域名:有的版本只认 IP 加端口, 写域名解析不了,表现和连不上一样。 ③ 两边 vhost 名不一致:这是最隐蔽的一个。 边缘回源时会带上 vhost 名,名字对不上源站就找不到对应的流。 所以要逐字一致,包括大小写。

这三个症状的共同点是「不报错」: SRS 启动一切正常,就是没人能看。 排查时要先看日志里有没有回源那一行,再看 vhost 名对不对。

四、动手 Demo:解析集群配置——每个 vhost 一条路由

把一份三 vhost 的集群配置压成路由表, 看每个域名连上来之后会发生什么。

CONF = """
vhost __defaultVhost__ {
    cluster { mode remote; origin 192.168.1.10:1935; }
}
vhost live.example.com {
    cluster { mode local; }
}
vhost push.example.com {
    cluster { mode remote;
              origin 192.168.1.20:1935;
              origin 192.168.1.21:1935; }
}
"""

for name, body in split_vhost(CONF):
    mode = pick(body, "mode") or "origin"
    orig = all_of(body, "origin")
    print(name, mode, orig or "-")

实跑输出:

--------------------------------------------------------------------
集群配置——每个 vhost 一条路由规则
--------------------------------------------------------------------
**① 集群是按 vhost 配的,不是全局配的**

  **这点和很多人的直觉不一样:**
  **不是「这台机器是边缘」,而是「这个 vhost 在这台机器上是边缘」。**
  **同一台机器上,`a.example.com` 可以配成本地源站,**
  **`b.example.com` 配成回源边缘。**

  **三种 `mode` 的含义:**
  **① `local`**:**我自己就是源,不往别处要。**
  **② `remote`**:**我是边缘,去 `origin` 列的地方要。**
  **③ `origin`**:**我是源,但允许别的边缘来拉(默认行为)。**

**② 真解析这份配置,推出每条路由**

  **解析器只关心两件事:vhost 叫什么、它的 cluster 怎么配。**

  vhost                mode       回源到                                   观众连上来会怎样
  ---------------------------------------------------------------------------------------------
  __defaultVhost__     remote     192.168.1.10:1935                        先回源,再服务
  live.example.com     local      -                                        本地直接服务
  push.example.com     remote     192.168.1.20:1935、192.168.1.21:1935     先回源,再服务

  **看第三行:`push.example.com` 配了两个 origin。**
  **这是主备的意思——第一个连不上就试第二个。**
  **但 SRS 不会自动切回来,所以第一个恢复后要重启边缘才会重新用它。**

**③ 配错的典型症状**

  **① `mode remote` 但没写 `origin`**:**启动不报错,**
  **但观众一连上就一直转圈,日志里反复刷「连不上源站」。**
  **② `origin` 写成了域名**:**有的版本只认 IP 加端口,**
  **写域名解析不了就当成连不上。**
  **③ 源站与边缘的 vhost 名不一致**:**这是最隐蔽的一个。**
  **边缘回源时会带上 vhost 名,名字对不上源站就找不到对应的流。**
  **所以两边配置里的 `vhost` 必须逐字一致。**

三行路由,三种行为:本地直出、单源回源、双源主备。 push.example.com 配了两个 origin,第一个连不上试第二个。 但 SRS 不会自动切回来,第一个恢复后要重启边缘才会再用它。 __defaultVhost__ 是兜底,没匹配上的域名都走这条。

30 秒实验

  1. 给 live.example.com 也加一条 origin,猜会怎样——不生效,mode local 时 origin 被忽略。
  2. 把 origin 改成域名,猜 SRS 会不会解析——多数版本不解析,表现就是连不上源站。
  3. 把边缘的 vhost 名改成大小写不同,看能不能回源——不能,vhost 名是逐字匹配的。

常见误区

  1. 「集群是全局配置」——不是,cluster 在每个 vhost 里。
  2. 「mode local 也会转发」——不转发,只在本地服务。
  3. 「两个 origin 是负载均衡」——是主备,前一个能用就一直用它。
自测三问(点开对答案) 1. `cluster` 块写在哪一层? —— **写在 `vhost` 里**,所以同一台机器不同域名可以是不同角色。 2. `mode local` 时写了 `origin` 有用吗? —— **没用**,本地源不往外要流。 3. 边缘回源找不到流,先查什么? —— **先查两边的 vhost 名是否逐字一致**,这是最常见的坑。

相关笔记