集群不是在全局配的,是在每个 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 秒实验
- 给
live.example.com也加一条origin,猜会怎样——不生效,mode local时origin被忽略。 - 把
origin改成域名,猜 SRS 会不会解析——多数版本不解析,表现就是连不上源站。 - 把边缘的 vhost 名改成大小写不同,看能不能回源——不能,vhost 名是逐字匹配的。
常见误区
- 「集群是全局配置」——不是,
cluster在每个 vhost 里。 - 「
mode local也会转发」——不转发,只在本地服务。 - 「两个 origin 是负载均衡」——是主备,前一个能用就一直用它。
自测三问(点开对答案)
1. `cluster` 块写在哪一层? —— **写在 `vhost` 里**,所以同一台机器不同域名可以是不同角色。 2. `mode local` 时写了 `origin` 有用吗? —— **没用**,本地源不往外要流。 3. 边缘回源找不到流,先查什么? —— **先查两边的 vhost 名是否逐字一致**,这是最常见的坑。- ☐ (本节完,下一节 11.4.1 配置文件的组成结构)