Nginx 详解 Part2 — TCP队列/Reuseport/虚拟主机/Location匹配
来源:
raw/day42 nginx详解part2.md— 林海峰 Nginx 课程第二部分 主题:TCP 半连接/全连接队列、Nginx 全连接队列共享/独享模式(reuseport)、worker 多线程、虚拟主机三种方式、location 匹配规则详解
结构总览
TCP 连接队列
├─ 半连接队列(SYN Queue)— SYN_RECV 状态
├─ 全连接队列(Accept Queue)— ESTABLISHED 状态
├─ 队列满的后果与内核参数调优
└─ SYN Flood 攻击与 syncookie
Nginx 全连接队列两种模式
├─ 共享模式(默认):所有 worker 争抢同一队列,压力平衡但有锁开销
├─ 独享模式(reuseport):各 worker 独立队列,减少锁竞争但可能不均
└─ worker 内多线程(--with-threads)
虚拟主机三种方式
├─ 基于域名(server_name)
├─ 基于端口(listen 不同)
└─ 基于 IP
Location 匹配规则
├─ = 精确匹配(最高优先级)
├─ ^~ 前缀匹配(命中后不检查正则)
├─ ~ 正则匹配(区分大小写)
├─ ~* 正则匹配(不区分大小写)
└─ 普通前缀匹配(最长匹配优先)
关键要点
TCP 连接队列: 半连接队列(SYN Queue)存储 SYN_RECV 状态连接,受 net.ipv4.tcp_max_syn_backlog 控制;全连接队列(Accept Queue)存储 ESTABLISHED 连接,受 net.core.somaxconn 和应用层 backlog 共同限制(取较小值)。Nginx 通过 listen 80 backlog=4096; 设置。
reuseport: 开启后每个 worker 进程独立调用 bind()+listen(),拥有独立的全连接队列。内核根据四元组哈希将连接分发到不同 worker,无需加锁。优化路径:默认共享队列 → 开启 reuseport → 开启 threads。
Location 匹配三阶段: ① 精确匹配 = ② 前缀匹配 ^~ 和普通前缀 ③ 正则匹配 ~/~*。普通前缀匹配后继续检查正则(正则可覆盖),^~ 匹配后跳过正则。