deferred 是 tcp 层优化参数,仅影响三次握手完成后、accept() 前的连接排队行为,不干预 tls 握手或 worker 激活时机;在 https 中有效但仅限于提升 tcp 连接接纳效率。

deferred 参数不是用来“让 HTTPS 套接字在真正收到加密数据时才激活 Worker”的——这个理解存在根本性偏差。它实际作用是优化 TCP 连接建立阶段的内核行为,与 TLS 握手、Worker 激活时机、或“延迟解密”完全无关。
下面直接说清楚关键点:
deferred 的真实作用
只影响 listen 指令绑定的 TCP socket 在 accept() 系统调用前的行为:
- 启用后,内核会把已完成三次握手(SYN_RECV → ESTABLISHED)但尚未被 Nginx 调用
accept()取出的连接,暂存在更高效的队列中; - 避免因 Worker 进程忙于处理已有请求,导致新连接在
accept队列中堆积超时(net.ipv4.tcp_abort_on_overflow=1时会被丢弃); - 本质是减少
accept()调用开销 + 缓冲已建连但未取走的连接,不干预 TLS 握手过程,也不推迟 Worker 处理。
HTTPS 场景下 deferred 是否有效?
✅ 有效,但仅限于 TCP 层:
- TLS 握手仍由 Worker 进程完成(
ssl_handshake在accept()后发生); -
deferred让连接更快进入 ESTABLISHED 状态并排队等待accept(),不加速或延迟证书交换、密钥协商等 TLS 步骤; - 它对高并发短连接(如大量 HTTPS 建连)有收益,对长连接或 TLS 处理瓶颈无帮助。
如何正确配置(含 HTTPS)
server {
listen 443 ssl deferred; # ✅ 放在 listen 行末,仅对 TCP 生效
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 其他 SSL 配置...
}
注意:
-
deferred仅支持 Linux(依赖TCP_DEFER_ACCEPTsocket 选项); - 不可与
reuseport同时使用(Nginx 会报错); - 若启用了
epoll(默认),效果更明显;select/poll下无效。
真正影响 HTTPS 吞吐的配置项
若目标是提升 HTTPS 并发处理能力,应关注这些:
-
worker_processes auto;+worker_connections 65536;(调整进程与连接上限) -
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h;(复用会话,省去完整握手) -
ssl_buffer_size 4k;(平衡小包延迟与吞吐) -
http_v2 on;(启用 HTTP/2 减少连接数) -
tcp_nodelay on;(禁用 Nagle,加快 TLS 记录发送)
deferred 是 TCP 层微优化,不是 TLS 层开关。把它当作“让 Worker 懒加载 HTTPS 连接”的手段,会误导调优方向。











