nginx 不直接控制网卡硬件加速,因 tls 处理位于用户态 openssl 或内核 ktls 层,绕过传统 tcp/ip 栈卸载路径;需从启用、兼容、绕过三层排查,且标准 nginx 不支持 ktls,实际生产中应优化软件栈协同而非依赖硬件 tls offload。

确认网卡与驱动是否支持 TLS 卸载
不是所有网卡都支持 TLS offload(如 Intel E810、Broadcom BCM57414、Mellanox ConnectX-5+ 支持;多数消费级网卡不支持)。执行以下命令验证:
-
查硬件能力:
ethtool -k eth0 | grep tls,关注tls-hw-tx-offload和tls-hw-rx-offload是否为 on -
查驱动状态:
lspci -vv -s $(ethtool -i eth0 | awk '/bus-info/ {print $3}') | grep -A10 TLS,确认驱动已加载 TLS 卸载模块(如ice驱动需ice.ko≥ v1.12.9) -
查内核支持:
zcat /proc/config.gz | grep CONFIG_TLS或grep CONFIG_TLS /boot/config-$(uname -r),确保CONFIG_TLS_DEVICE=y已启用
检查 Nginx 是否实际触发了硬件 TLS 卸载
Nginx 默认使用用户态 OpenSSL,完全不走内核 TLS 路径,因此 不会利用网卡 TLS offload。只有启用内核 TLS(kTLS)且配置正确时,才可能下推加密到硬件:
- 确认 OpenSSL 版本 ≥ 1.1.1 且编译时启用了
enable-ktls(openssl version -f查构建参数) - Nginx 需使用支持 kTLS 的补丁版本(如 Tengine 或 Nginx Plus R23+),标准开源 Nginx 不支持 kTLS 自动启用
- 若强行启用:
ssl_conf_command Options +StdNullCipher;并配合ssl_protocols TLSv1.3;,仍需应用层显式调用setsockopt(fd, SOL_TCP, TCP_ULP, "tls", sizeof("tls"))—— Nginx 源码未实现该逻辑
识别 TLS 行为对其他硬件加速的干扰
即使不走 TLS offload,HTTPS 流量也常导致 RSS(接收侧缩放)、TSO(TCP 分段卸载)、GRO(通用接收卸载)等失效,主因是:
-
TLS 记录分帧破坏 TCP 包边界:OpenSSL 默认 16KB TLS 记录 + Nginx
proxy_buffering on,导致应用层写入大块数据,内核无法有效聚合或分片,GRO/TSO 效率骤降 - 多线程加解密打乱 CPU 亲和性:Nginx worker 绑定 CPU 后,OpenSSL 加密在用户态完成,中断分散到非绑定核,RSS 流哈希失效,连接无法均衡到多队列
-
OCSP Stapling 同步查询阻塞收包路径:启用
ssl_stapling on且未配ssl_stapling_cache时,首次握手会同步发起 DNS 查询,使 socket 进入不可中断等待,绕过硬件加速处理队列
验证与规避建议
不依赖硬件 TLS offload(当前生产环境极少真正启用),转而优化软件栈协同效率:
- 关闭
proxy_buffering或调小proxy_buffer_size 4k,减少 TLS 记录填充延迟,提升 GRO 合并率 - 启用
worker_cpu_affinity auto并搭配ssl_prefer_server_ciphers on和 ECDHE 套件,让加解密集中在绑定核,稳定 RSS 流分布 - 禁用
ssl_stapling或严格配置缓存:ssl_stapling_cache shared:StaplingCache:128k;+resolver 8.8.8.8 valid=300s; - 用
ss -i观察 HTTPS 连接的ts(时间戳)、wscale(窗口缩放)、retrans(重传)字段,对比 HTTP 连接,确认是否因 TLS 导致 TCP 层优化退化











