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

Windows 上装 Nginx 是「解压」,不是「安装」。 真正要动脑的是把 worker 数与连接上限算清楚。

📝 本节和前面几节的关系

10.1 讲了 Nginx 的架构,这一节开始动手装。 Windows 这条路最短,适合先在本地把配置摸熟。

一、三步就装完

① 下载:官网给的是 zip 包,选 stable 那个。 ② 解压:放到一个没有中文、没有空格的路径。 比如 D:\nginx,别放 C:\Program Files。 ③ 启动:在解压目录里 start nginx。 命令行一闪就没了,那是正常的——它转后台了。

验证方法:浏览器打开 http://localhost, 看到 Welcome to nginx 那一页就成了。 看不到就去看 logs/error.log,里面写得很清楚。

二、它不是 Windows 服务

这一点最容易让人误判: start nginx 之后,关掉命令行窗口它不会停, 但重启机器就没了。

想要开机自启,得自己把它注册成服务——要么用 nssm 这类工具包一层, 要么用任务计划程序。 直接扔进「启动」文件夹是最糙但也能用的办法。

停和重载各有专门命令: nginx -s stop 立刻停,nginx -s quit 等处理完再停, nginx -s reload 平滑重载配置。 直播用 quit 和 reload,别用 stop。

三、worker 数与连接上限要算

worker_processes auto 到底等于几? 等于 CPU 逻辑核数。 这个值是算出来的,不是拍脑袋定的。

最大连接数 = worker_processes × worker_connections。 但这只是理论上限,实际会被两样东西压住:文件句柄与内存。

Linux 上默认一个进程只能开 1024 个句柄, 所以 worker_connections 写 65535 也没用, 必须同时改系统限制与 worker_rlimit_nofile。 这是「明明配了却上不去」的标准答案,Windows 上也有类似的句柄限制。

还有一个常被忽略的: Nginx 做反向代理时,一个客户端连接要用掉两个连接额度——一个对客户端,一个对后端。 所以理论值再打个对折,才是安全区。

四、动手 Demo:Windows 下装 Nginx——解压即用,容量得自己算

真测本机几个核、80 端口在不在, 再按公式把最大连接数算出来。

import os, socket

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

cores = os.cpu_count()
conn = 1024

print("逻辑 CPU 核数        %d" % cores)
print("worker_processes     %d" % cores)
print("worker_connections   %d" % conn)
print("理论最大连接         %d" % (cores * conn))
print("80 端口能用吗        %s" % ("能" if free(80) else "被占"))
print("8080 端口能用吗      %s" % ("能" if free(8080) else "被占"))

实跑输出:

--------------------------------------------------------------------
Windows 下装 Nginx——解压即用,容量得自己算
--------------------------------------------------------------------
**① Windows 上装 Nginx 是「解压」,不是「安装」**

  **下载下来是个 zip,解压到一个没有空格的路径就完事了。**
  **启动用 `start nginx`,停用 `nginx -s stop`,改完配置用 `nginx -s reload`。**

  **三个必须知道的点:**
  **① 路径不能有中文和空格**,**否则会出现莫名其妙的路由失败。**
  **② 它不是 Windows 服务**,**关掉命令行窗口不会停,但重启机器就没了。**
  **③ 端口 80 常被占用**,**IIS、Skype、某些驱动都会抢。**

**② 真测:80 端口在不在,本机几个核**

  **`worker_processes auto` 到底等于几,取决于 CPU 核数。**
  **这个值是算出来的,不是拍脑袋。**

  项                          实测值
  --------------------------------------
  逻辑 CPU 核数               8
  worker_processes auto       8
  worker_connections 默认     1024
  理论最大连接                8192
  80 端口能用吗               能
  8080 端口能用吗             能

  **8 个 worker 乘 1024 就是 8192 个连接,这是理论上限。**
  **实际达不到,因为还要受两样东西压着:文件句柄与内存。**

  **Linux 上默认一个进程只能开 1024 个句柄,**
  **所以 `worker_connections` 写再大也没用,**
  **必须同时改 `ulimit -n` 与 `worker_rlimit_nofile`。**
  **这是「明明配了 65535 却还是上不去」的标准答案。**

**③ 一份最小配置,先看结构**

  **把这份配置摊开,只有四个块:**

    worker_processes auto;
    events {
        worker_connections 1024;
    }
    http {
        server {
            listen 80;
            location / {
                root html;
                index index.html;
            }
        }
    }

  **`worker_processes` 在最外层,`events` 与 `http` 是它的两个兄弟。**
  **`server` 在 `http` 里,`location` 在 `server` 里。**
  **这个层级关系决定了指令能写在哪——写错层直接启动失败。**
  **10.4 会专门把这件事讲透。**

auto 就是核数,这台机器上是 实测值 个。 理论上限要乘出来看,不是拍一个 65535 就好。 80 端口是最容易被抢的,IIS、Skype、某些驱动都会占。 被占了就改 8080,配置里 listen 8080; 一行就够。

30 秒实验

  1. 把 worker_connections 改成 65535,算理论上限——核数乘 65535,看着很大,但句柄跟不上就是空话。
  2. 把 worker_processes 写死成 2,想想什么场景该这么干——机器上还跑着别的吃 CPU 的服务,得给它留核。
  3. 把 80 改成 8080,看访问地址怎么变——http://localhost:8080,端口不能省。

常见误区

  1. 「装 Nginx 要点下一步」——Windows 上是解压,没有安装向导。
  2. 「start 之后关窗口就停了」——它转后台了,得 nginx -s stop。
  3. 「worker_connections 越大越好」——句柄不放开,配多大都白配。
自测三问(点开对答案) 1. `worker_processes auto` 等于几? —— **等于 CPU 逻辑核数。** 2. 为什么 `worker_connections` 不能只看配置? —— **还受文件句柄上限压着**,两处都要改。 3. 平滑重载配置用哪个命令? —— **`nginx -s reload`**,不断连接。

相关笔记