Nginx每个活跃HTTPS连接实际消耗3~5个文件描述符(FD),远超HTTP的1个,主要因SSL/TLS层需额外分配会话缓存槽、OCSP stapling文件句柄、证书链读取及日志缓冲等资源。

开启 SSL/TLS 后,Nginx 每个活跃 HTTPS 连接实际会多消耗 2~4 个文件描述符(FD),不是简单的“+1”。这和纯 HTTP 相比,额外开销主要来自 TLS 层的运行时资源分配,而非连接本身数量翻倍。
SSL/TLS 连接额外 FD 的典型构成
一个客户端 HTTPS 请求在 Nginx 中维持活跃状态时,除基础 socket 外,还会占用以下 FD:
-
SSL 会话缓存槽:若启用
ssl_session_cache shared:SSL:10m,每个新会话需在共享内存中注册,同时可能触发内部文件句柄映射(尤其使用ssl_session_ticket_key时); -
OCSP stapling 文件句柄:启用
ssl_stapling on后,Nginx 需定期打开 OCSP 响应缓存文件(如/var/cache/nginx/ocsp/...),每个 worker 进程可能独占 1 个 FD; -
证书链读取句柄:若配置了
ssl_trusted_certificate或使用完整证书链,Nginx 在握手阶段需反复 open/read 证书文件(尤其在 reload 或首次握手时); -
日志与临时缓冲文件:开启
ssl_buffer_size、proxy_buffering或client_body_in_file_only时,可能额外创建临时磁盘文件,每个连接对应一个 FD(虽非必然,但在高并发异常场景下极易触发)。
为什么不是固定值?看实际配置组合
FD 增量取决于你是否启用以下功能:
- 禁用 OCSP stapling(
ssl_stapling off)→ 可省掉 1 个 FD; - 不设
ssl_trusted_certificate,且证书链已内嵌在ssl_certificate中 → 避免证书链重复加载; - 关闭 session ticket(
ssl_session_tickets off)→ 减少密钥文件读取,但牺牲复用率; - 使用
ssl_session_cache builtin:10000(而非 shared)→ 避免共享内存段关联的 FD 开销,但限制单 worker 缓存能力。
如何验证当前实际消耗?
别猜,用系统工具实测:
- 启动 Nginx 后,找一个 worker 进程 PID:
ps -eo pid,comm,args | grep nginx | grep -v master; - 查看该进程打开的 FD 数量:
ls -l /proc/<pid>/fd/ | wc -l</pid>; - 用 ab 或 wrk 发起 100 个 HTTPS 并发连接(短连接,禁 keepalive);
- 再次统计 FD 数,差值 ÷ 100 ≈ 单连接平均 FD 消耗(含基础 socket + TLS 附加);
- 对比关闭 SSL 后同样压测结果,差值即为 TLS 带来的净增量。
反向代理场景要叠加计算
如果 Nginx 是反向代理(比如转发到后端 API),那每个 HTTPS 客户端连接会带来双重叠加:
- 前端:client ↔ Nginx(HTTPS)→ 占 3~5 个 FD;
- 后端:Nginx ↔ upstream(HTTP 或 HTTPS)→ 至少再加 1~2 个 FD;
- 合计常达 5~7 个 FD/请求,远超 HTTP 反代的 2~3 个。


















