🎬 第九章 EasyDarwin搭建直播平台
📄 一句话概括

部署前要查三件事:配置、端口、容量。 三件事都不难,但漏一件就会上线后再返工。

📝 本节和前面几节的关系

9.1 讲的是它的内部结构,这一节讲怎么把它装起来跑通。 后面的 Nginx、SRS、ZLMediaKit 部署思路完全一样。

一、先查配置

EasyDarwin 的配置是一份 ini,改完重启就生效。 部署前第一件事是把它通读一遍,重点是键名与路径。

三个最容易出错的地方: ① 键名拼错:不会报错,只会用一个默认值悄悄跑起来。 表现是「明明配了却不生效」,最费时间。 ② 路径是相对路径:比如 ./record。 它相对于「启动时的工作目录」,不是相对于配置文件。 用 systemd 起服务时工作目录常常不是你以为的那个。 ③ 端口写成了字符串以外的东西:有的配置项只认数字。 带了空格或注释,解析就悄悄失败了。

所以规矩是:改完配置,先启动一次, 把启动日志里「实际用的端口与路径」逐条对一遍。 对不上就是没生效,别急着往下走。

二、查端口

流媒体服务的端口就那几个,但冲突概率不低: 554 是 RTSP,1935 是 RTMP,80/8080/10008 是 HTTP 类。

同一台机器上再装一个流媒体服务,立刻就撞。 所以部署前先跑一遍占用检查,比启动之后看日志快得多。

Linux 上两条命令就够: ss -lntp 看监听中的 TCP 端口, netstat -lntp 是老写法,要装 net-tools。 两个都行,记住一个。

还有一个坑:小于 1024 的端口在 Linux 上要 root 才能绑。 554 正好在这个范围里。 所以要么用 root 起,要么改成一个大于 1024 的端口。 Windows 上没这个限制,这也是「本地能跑服务器上跑不了」的一个来源。

三、查容量

容量分两块:出口带宽与录像磁盘。两块都要按峰值算。

出口带宽的算法很简单: 码率乘观众数,再换成 Mbps。 2048 kbps 的流,100 个观众就是 200 Mbps。 千兆网看着还剩八成,但那是理想值。 真实环境跑到七成就该考虑分流了。

录像磁盘更好算: 2048 kbps 一小时约 900 MB,一天约 21 GB。 存 30 天就是 650 GB 上下。 这个数是硬盘预算的起点,不是终点—— 因为还要留出「同时回放」的读带宽。

最容易被忽略的是「上行」: 如果这台机器还要往上级平台推流, 那上行带宽也要单独算一份,不能和下行共用同一个估算。

四、最后加一条验证

部署清单里一定要有「怎么验证它真的在跑」这一项。 只写「启动服务」是不够的。

验证要写成可执行的三段: 用什么地址、用什么工具、看到什么算成功。 比如:用 ffplay 打开 rtsp://IP:554/live/test, 三秒内出画面就算通。

这一条的价值在于「可交接」: 换个人来部署,照着这三段能自己判断成败, 不用回来问「这样算好了吗」。 部署文档的好坏,八成看这一条写得够不够具体。

五、动手 Demo:安装部署——配置、端口、容量,三件事先查

真解析一份 ini,真绑一遍端口,再按峰值算一遍容量。 这三件事加起来不到一分钟,能省掉上线后的返工。

import socket

INI = """\
[default]
rtsp_port=554
rtmp_port=1935
http_port=10008
hls_port=10080
record_path=./record
"""

def parse_ini(text):
    out, sec = {}, "default"
    for line in text.strip().splitlines():
        s = line.strip()
        if not s or s[0] in ";#":
            continue
        if s.startswith("[") and s.endswith("]"):
            sec = s[1:-1]
            continue
        if "=" in s:
            k, v = s.split("=", 1)
            out[(sec, k.strip())] = v.strip()
    return out

def port_free(p):
    s = socket.socket()
    try:
        s.bind(("127.0.0.1", p))
        return True
    except OSError:
        return False
    finally:
        s.close()

cfg = parse_ini(INI)
for name in ("rtsp_port", "rtmp_port", "http_port", "hls_port"):
    p = int(cfg[("default", name)])
    print("%-10s %5d  %s" % (name, p, "能用" if port_free(p) else "被占"))

kbps, users = 2048, 100
print("单路 %.0f KB/s" % (kbps / 8.0))
print("100 人 %.1f MB/s = %.1f Mbps" % (kbps / 8.0 * users / 1024,
                                          kbps * users / 1024.0))
print("录像一天 %.0f GB" % (kbps * 3600 * 24 / 8 / 1024 / 1024))

实跑输出:

--------------------------------------------------------------------
安装部署——配置、端口、容量,三件事先查
--------------------------------------------------------------------
**① 先解析配置文件**

  **EasyDarwin 的配置是一份 ini,改完重启就生效。**
  **部署前第一件事是把这份文件读一遍,看键名对不对。**

  段          键              值
  ----------------------------------------
  default     hls_port        10080
  default     http_port       10008
  default     log_level       info
  default     max_conn        1024
  default     record_path     ./record
  default     rtmp_port       1935
  default     rtsp_port       554
  rtmp        chunk_size      4096
  rtmp        enabled         true
  rtsp        enabled         true
  rtsp        timeout         65

  **必填项检查:全都在。**
  **缺键不会报错,只会用一个默认值悄悄跑起来——**
  **这就是「明明配了却不生效」的最常见原因。**

**② 真检测端口占用**

  **把配置里那几个端口真绑一遍,看谁被占了。**

  服务     端口      能用吗
  -----------------------------
  rtsp     554       能
  rtmp     1935      能
  http     10008     能
  hls      10080     能

  **554 与 1935 都是常用端口,但不等于随时能用:**
  **同一台机器上再装一个流媒体服务,它们立刻就冲突。**
  **所以部署前先跑一遍这个检查,比启动之后看日志快得多。**

  **【📋 实操路径】Linux 上查端口占用**

    ss -lntp | grep -E ':554|:1935|:10008'
    netstat -lntp | grep 1935

  **`ss` 是新系统自带的,`netstat` 要装 net-tools。**
  **两个都行,记住一个就够。**

**③ 容量要按峰值算,不能按平均算**

  **部署方案里最容易写错的一栏就是带宽。**
  **写平均值的方案,上线第一天就会被打回。**

  项             算法               2048 kbps 时
  --------------------------------------------------
  单路出口       码率除以 8         256 KB/s
  100 路观众     单路乘 100         25.6 MB/s
  换成 Mbps      乘 8 再除 1024     204.8 Mbps
  千兆网占用     除 1000            20.5%

  **看第三行:100 个观众就要 200 Mbps。**
  **千兆网看着还剩八成,但那只是「单向、无突发、无重传」的理想值。**
  **真实环境里千兆网跑到七成就该考虑分流了。**

  **录像的容量更好算:**
  **2048 kbps 一小时就是 900 MB 上下,一天 21 GB。**
  **存 30 天就是 650 GB——这个数才是硬盘预算的起点。**

  **最后一条经验:**
  **部署清单里一定要有「怎么验证它真的在跑」这一项。**
  **只写「启动服务」是不够的,要写「用什么地址、什么工具、看到什么算成功」。**

端口全「能用」是因为沙箱里没装这些服务,真机上大概率会撞。 554 在 Linux 上要 root 才能绑,这是真机上最常见的一条坑。 2048 kbps 换算成 256 KB/s,这是所有容量估算的起点。 一天 21 GB、三十天 650 GB,硬盘预算按这个数往上加。

30 秒实验

  1. 把 rtsp_port 改成 80,看沙箱里能不能绑——Windows 上能,Linux 上非 root 不能。
  2. 把 record_path 换成相对路径 ./record,想想它相对谁——相对启动时的工作目录,不是配置文件所在目录。
  3. 把观众数改成 1000,看千兆网够不够——2048 Mbps,远超千兆,必须上分流。

常见误区

  1. 「配置改了就生效」——键名拼错会悄悄用默认值。
  2. 「554 随便绑」——Linux 上小于 1024 要 root。
  3. 「容量按平均算就行」——必须按峰值,峰值才是打回方案的原因。
自测三问(点开对答案) 1. 相对路径的 `./record` 是相对哪里? —— **相对启动时的工作目录**,不是配置文件所在目录。 2. 为什么 554 端口在 Linux 上容易出问题? —— **小于 1024 是特权端口**,非 root 绑不上。 3. 2048 kbps 存一天要多少磁盘? —— **约 21 GB**,三十天约 650 GB。

相关笔记