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 匹配三阶段: ① 精确匹配 = ② 前缀匹配 ^~ 和普通前缀 ③ 正则匹配 ~/~*。普通前缀匹配后继续检查正则(正则可覆盖),^~ 匹配后跳过正则。


相关页面