启用tls会话复用、优选ecdhe密码套件、升级tlsv1.3、合理分配ssl负载可显著降低cpu开销:共享缓存会话、禁用session ticket、设timeout为4h;用ecdhe-ecdsa/rsa-aes128-gcm-sha256等轻量套件;tlsv1.3需openssl 1.1.1+,配置ssl_protocols tlsv1.2 tlsv1.3;结合worker_cpu_affinity、ocsp装订及可选硬件卸载。

启用TLS会话复用减少重复握手
SSL/TLS握手是CPU密集型操作,尤其在大量短连接场景下(如HTTP/1.1频繁请求、移动端小包请求),每次完整握手需进行非对称加密运算(RSA或ECC密钥交换、证书验证等),显著拉升CPU使用率。启用会话复用可让客户端复用已协商的主密钥,跳过密钥交换和证书验证阶段,大幅降低CPU开销。
推荐配置如下:
-
session_cache:使用共享内存缓存(如
shared:SSL:10m),支持worker进程间共享,10MB约可缓存约4万会话; -
session_timeout:设为
4h(默认为5分钟,太短导致复用率低); - ssl_session_tickets off:禁用Session Ticket(服务端无状态但需加密/解密ticket,增加CPU负担),优先使用基于缓存的会话复用;
选择轻量级且安全的密码套件
部分密码套件(如含RC4、3DES、DHE)或密钥交换强度过高(如rsa:4096)会显著拖慢握手速度。应禁用老旧算法,倾向使用前向安全、计算开销低的组合。
建议配置示例(兼容主流现代客户端):
- 启用
ECDHE密钥交换(基于椭圆曲线,比传统DHE快数倍); - 优先
ECDSA或RSA签名证书,搭配P-256曲线; - 密码套件精简为:
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305; - 禁用
SSLv2/SSLv3、TLSv1.0/TLSv1.1(不安全且性能差),仅开启TLSv1.2和TLSv1.3;
启用TLSv1.3并关闭冗余特性
TLSv1.3 将完整握手从2-RTT降至1-RTT(甚至0-RTT),省去ServerKeyExchange、CertificateRequest等消息,密钥交换与认证高度简化,CPU消耗通常比TLSv1.2降低30%~50%。Nginx 1.13.0+ 原生支持,OpenSSL 1.1.1+ 为必要依赖。
关键配置要点:
- 在
ssl_protocols中明确包含TLSv1.3(如ssl_protocols TLSv1.2 TLSv1.3;); - 无需额外配置密码套件——TLSv1.3 使用独立、更精简的套件列表(如
TLS_AES_128_GCM_SHA256),旧套件自动忽略; - 确认未启用
ssl_buffer_size过小值(如1KB),避免因分片触发多次加密调用; - 关闭
ssl_prefer_server_ciphers off(TLSv1.3 下该指令无效,但保留可避免配置歧义);
合理分配SSL处理负载与硬件协同
单Worker进程处理全部SSL解密易成瓶颈。可通过以下方式分散压力:
-
CPU亲和性绑定:用
worker_cpu_affinity auto;让每个worker绑定独立核心,避免上下文切换开销; -
多worker协同:确保
worker_processes auto;且未人为限制数量(如设为1); -
OCSP装订(Stapling)开启:避免客户端直连CA验证证书状态,减少握手延迟与服务端DNS/网络开销(配置
ssl_stapling on; ssl_stapling_verify on;并配好可信CA证书); - 考虑卸载(可选):高并发HTTPS站点可评估用支持TLS卸载的硬件(如智能网卡)或前置LB(如Cloudflare、自建Envoy),让Nginx专注HTTP逻辑处理;
不复杂但容易忽略。核心是减少每次握手的计算量、提升复用率、用新协议替代旧流程,并让系统资源各司其职。










