Nginx 通过事件驱动架构、OpenSSL 异步引擎、会话复用及参数调优协同优化 SSL 握手性能;利用 epoll/kqueue 实现非阻塞 I/O,启用 ssl_engine 或 session ticket 复用,并调优 worker、缓冲区与加密套件以降低延迟和吞吐瓶颈。

Nginx 本身不直接“优化 SSL 握手阶段”的非阻塞行为,而是通过事件驱动架构 + 多进程/多线程模型 + OpenSSL 的异步能力(需配置)协同降低握手延迟和连接吞吐瓶颈。真正的性能提升来自减少等待、复用资源、避免阻塞主线程。
利用 epoll/kqueue 实现连接级非阻塞 I/O
Nginx 默认使用高效的事件机制(Linux 上是 epoll,FreeBSD/macOS 是 kqueue),所有网络操作(包括 TCP 握手完成后的 TLS 记录读写)都注册为非阻塞事件。这意味着:
- 一个 worker 进程可同时处理成千上万并发连接,SSL 握手过程中的 socket 等待(如 ClientHello 到 ServerHello 响应、证书传输、密钥交换等)不会阻塞其他连接
- 当内核通知某 socket 可读/可写时,Nginx 才调用 OpenSSL API 处理 TLS 数据;若 OpenSSL 返回
SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,Nginx 会重新注册对应事件并继续处理其他请求,而非忙等或切换线程
启用 OpenSSL 异步引擎(需 1.1.1+ + 硬件支持)
标准 OpenSSL 在私钥运算(如 RSA 解密、ECDSA 签名)时是同步阻塞的,这在高并发 TLS 握手场景下易成瓶颈。可通过以下方式引入异步卸载:
- 编译 Nginx 时链接支持异步的 OpenSSL(≥1.1.1),并加载硬件加速引擎(如 Intel QAT、ARM SVE 加密扩展)或软件异步引擎(如 OpenSSL 的
async模块) - 在 nginx.conf 中启用:
ssl_engine qat;
或(OpenSSL 3.0+):
ssl_conf_command Providers "qat,base"; - 此时 RSA/ECC 私钥操作交由独立线程池或硬件队列异步执行,worker 进程无需等待,可立即响应其他事件
复用会话减少完整握手频次
非阻塞只能加速单次握手,真正降负载靠减少握手次数。Nginx 提供两种会话复用机制:
-
Session ID 复用:服务端缓存会话票据,默认开启;客户端携带相同 ID 即可跳过密钥交换。注意设置合理超时:
ssl_session_timeout 4h; -
Session Ticket 复用(推荐):服务端加密签发票据,客户端自行保存,无服务端存储压力:
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ticket.key;
建议轮换密钥并保持至少两个活跃 key 以支持平滑更新
调优相关 worker 与缓冲参数
非阻塞效果依赖底层资源调度效率:
- 确保 worker_processes auto; 且 worker_cpu_affinity auto;,让每个 worker 绑定独立 CPU 核,避免上下文切换干扰 TLS 处理
- 增大初始 TLS 握手缓冲区,避免因小 buffer 导致多次 read/write:
ssl_buffer_size 4k;(默认 16k 过大,首次握手通常只需 2–4k) - 关闭不必要的协议和加密套件,缩短协商时间:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;











