核心是通过调优 ssl_buffer_size(如设为4k)、ssl_handshake_timeout(建议10s)、ssl_session_cache shared:SSL:10m 与 ssl_session_timeout 4h,并禁用老旧协议和会话票据,结合连接限制与监控,降低握手内存开销。

在 Nginx 中管理 HTTPS 握手期间的临时内存使用,核心是控制 TLS 握手过程中的缓冲区分配和会话缓存行为。握手阶段(尤其是完整握手)会为每个连接临时分配内存用于密钥计算、证书解析、OCSP 响应验证等,若并发高或配置不当,可能引发内存抖动甚至 OOM。
调整 SSL 缓冲区与超时参数
Nginx 默认为每个 SSL 连接预分配固定大小的缓冲区。可通过以下指令限制单次握手的资源开销:
-
ssl_buffer_size:设为
4k或8k(默认 16k),减小初始 TLS 记录分片大小,降低单连接握手初期的内存占用; -
ssl_handshake_timeout:建议设为
10s(默认 60s),快速中断异常或慢速握手,防止僵尸连接长期持有内存; - ssl_protocols 和 ssl_ciphers:禁用老旧协议(如 TLSv1.0/TLSv1.1)和高开销 cipher suite(如带 SHA-1 或 RC4 的套件),减少握手计算与内存分配压力。
优化会话复用以减少完整握手频率
完整握手比会话复用(session resumption)消耗更多内存。启用并合理配置会话缓存可显著降低高频握手带来的内存波动:
- 用 ssl_session_cache shared:SSL:10m 开启共享内存缓存(10MB 可存储约 4000–8000 个会话,按 2–4KB/会话估算);
- 配 ssl_session_timeout 4h(不建议过长),平衡复用率与内存驻留时间;
- 启用 ssl_session_tickets off(除非需跨 worker 复用),因 ticket 加解密会在每个 handshake 中额外分配临时密钥上下文内存;
- 若用 OpenSSL 1.1.1+,可考虑 ssl_early_data off(默认关闭),避免 0-RTT 握手引入额外状态缓冲。
限制并发 SSL 连接与连接复用
从连接维度控制总量,间接约束握手内存峰值:
- 用 limit_conn 配合 zone 限制每 IP 或每 server 的并发 SSL 连接数;
- 确保 keepalive_timeout 和 keepalive_requests 合理(如
keepalive_timeout 30s),鼓励长连接复用已有 TLS 状态,避免频繁重握手; - 对 API 或后台服务,可在 upstream 中关闭 proxy_ssl_verify(若可信内网),跳过证书链验证这一内存密集环节。
监控与诊断关键指标
仅靠配置不够,需验证实际内存行为:
- 通过
nginx -V 2>&1 | grep -o with-openssl确认 OpenSSL 版本,不同版本握手内存模型差异较大(如 3.0+ 引入了更细粒度的堆栈分配); - 开启 error_log ... debug 并过滤
ssl_bio、ssl_handshake日志,观察单次握手的 malloc/free 模式; - 用
pstack或gdb在高负载时抓取 worker 进程堆栈,确认是否卡在SSL_do_handshake或证书解析路径; - 配合
slab_stat(若编译时启用了--with-http_ssl_module且 OpenSSL 支持)查看 SSL 共享内存池碎片情况。

















