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

Windows 上编 Nginx 最难的不是命令,是凑工具链。 四样东西缺一样都不行,而且报错都在流程后半段。

📝 本节和前面几节的关系

10.3.2 是 Linux 下的做法,这一节换到 Windows。 结论可能让你意外:多数情况不该自己编。

一、要凑齐的四样

Linux 上 apt install build-essential 就齐了,Windows 上得自己找。

① Visual Studio:提供 cl.exe 与链接器。 没有它根本编不了。 ② MSYS2:提供类 Unix 的命令环境。 configure 是个 shell 脚本,普通 cmd 跑不起来。 ③ Perl:处理部分源码生成。 缺了会在 configure 中途报错。 ④ NASM:汇编优化代码。 缺了会编到一半报找不到 nasm。

这四样最折磨人的地方是「报错位置」: 它们都不在开头报,而是在流程跑了十几分钟之后才出现。 所以要养成「先检测、再动手」的习惯。

二、MSYS2 编出来的东西有限制

用 MSYS2 编出来的 Nginx 只能在 MSYS 环境里跑。 它依赖 msys-2.0.dll 这类运行时, 拷到别的机器上双击是跑不起来的。

要编「真正能单独运行」的版本,得用 MSVC 工具链, MSYS2 只是提供 shell 与 make,编译器还得是 cl.exe。 这个分工第一次接触很容易搞混。

判断标准很简单: 编出来的 nginx.exe 拷到一台没装 MSYS2 的机器上能跑, 那才是原生版本。 跑不起来、报缺 dll,就是没编对。

三、多数情况不该自己编

如果目标只是「在 Windows 上跑一个带 RTMP 的 Nginx」, 最省事的不是自己编,是找别人编好的: GitHub 上有人提供带 nginx-http-flv-module 的 Windows 产物, 下载解压就能用。

自己编只在两种情况下值得: ① 要特定的模块组合,现成的包都不满足。 ② 要特定版本的 OpenSSL,比如因为合规要求。

两条都不占,就别花这个时间。 把时间花在配置与压测上,收益大得多。 这也是这一节最实在的一句建议。

四、动手 Demo:Windows 下编译——先把工具链凑齐

真查一遍本机有哪些工具、版本够不够, 比编到一半才发现缺东西强得多。

import shutil, subprocess

TOOLS = [("perl", ["perl", "-v"]),
         ("nasm", ["nasm", "-v"]),
         ("gcc", ["gcc", "--version"]),
         ("make", ["make", "--version"]),
         ("git", ["git", "--version"]),
         ("openssl", ["openssl", "version"])]

have = 0
for name, cmd in TOOLS:
    path = shutil.which(cmd[0])
    if path is None:
        print("%-10s 没有" % name)
        continue
    have += 1
    try:
        r = subprocess.run(cmd, capture_output=True, timeout=10)
        txt = (r.stdout or r.stderr).decode("utf-8", "replace")
        txt = txt.splitlines()[0][:34]
    except Exception:
        txt = "(调用失败)"
    print("%-10s 有    %s" % (name, txt))

print("一共 %d 个,找到 %d 个" % (len(TOOLS), have))

实跑输出:

--------------------------------------------------------------------
Windows 下编译——先把工具链凑齐
--------------------------------------------------------------------
**① Windows 上没有现成的编译环境**

  **Linux 上 `apt install build-essential` 就齐了,Windows 上得自己凑。**
  **官方推荐的路子是 MSYS2 + MinGW,但它不能编出 Windows 原生的服务,**
  **只能编出「在 MSYS 环境里跑」的版本。**

  **要编真正能双击运行的 Nginx,需要一整套:**

  工具              干什么                     缺了会怎样
  -----------------------------------------------------------------------
  Visual Studio     提供 cl.exe 与链接器       根本编不了
  MSYS2             提供类 Unix 的命令环境     configure 脚本跑不起来
  Perl              处理部分源码生成           configure 中途报错
  NASM              汇编优化代码               编到一半报 nasm 找不到

  **这四样缺一样都不行,而且它们的报错都不在开头,**
  **是在流程跑到一半才出现——这才是最耗时间的地方。**

**② 真查一遍本机有哪些**

  **编译前先跑一遍检测,比编到一半才发现缺东西强。**

  工具        找得到吗     版本前 30 字
  -----------------------------------------------------------
  perl        没有         -
  nasm        没有         -
  gcc         没有         -
  make        没有         -
  git         有           git version 2.55.0.windows.3
  openssl     有           OpenSSL 3.5.7 9 Jun 2026 (Li..

  **6 个里找到 2 个。**
  **找不到的那些就是要先装的。**

  **注意这张表只代表「这台机器现在有什么」,**
  **不代表「够不够用」:**
  **有的工具版本太老也会编不过,比如 Perl 5.8 之前的版本处理不了部分脚本。**
  **版本号那一列就是给这种情况看的。**

**③ 一条更省事的路**

  **如果只是想在 Windows 上跑一个带 RTMP 的 Nginx,**
  **最省事的不是自己编,是找别人编好的:**
  **GitHub 上有人提供带 nginx-http-flv-module 的 Windows 编译产物,**
  **下载解压就能用。**

  **自己编的价值只有两个:**
  **① 要特定的模块组合**;**② 要特定版本的 OpenSSL。**
  **两条都不占,就别花这个时间。**
  **这也是本节最实在的一句建议。**

这台机器上只找到 2 个,说明要编还得装一大半。 shutil.which 只查 PATH,装了但没加 PATH 一样查不到。 版本号那一列是给「版本太老」这种情况看的,不是摆设。 先检测再动手,能省掉十几分钟的无效编译。

30 秒实验

  1. 把 shutil.which 换成查注册表,想想能多查到什么——装了但没加 PATH 的程序能查到,这是它的价值。
  2. 把 nasm -v 改成 nasm -h,看结果差多少——帮助文本也是到 stderr,所以抓 stderr 更稳。
  3. 给 TOOLS 加一个 cl,看沙箱里有没有——没有,这也是「不能在本机编」的直接证据。

常见误区

  1. 「装了 Visual Studio 就能编」——还得有 MSYS2 跑 configure。
  2. 「MSYS2 编出来的能随便拷」——依赖 msys-2.0.dll,拷走跑不了。
  3. 「自己编总是更好」——只为跑起来的话,现成包更省事。
自测三问(点开对答案) 1. Windows 上编 Nginx 缺哪四样之一都不行? —— **Visual Studio、MSYS2、Perl、NASM。** 2. 怎么判断编出来的是原生版本? —— **拷到没装 MSYS2 的机器上能跑**,报缺 dll 就不是。 3. 什么情况下才值得自己编? —— **要特定模块组合或特定 OpenSSL 版本**,否则用现成包。

相关笔记