标准 Nginx 不支持 ssl_engine 指令,该指令不在官方配置语法中;仅 Tengine 或个别定制版通过源码扩展实现,原生 Nginx 无 OpenSSL 引擎初始化逻辑,硬件加速需依赖编译集成的 OpenSSL、系统级 openssl.cnf 配置及 QAT 驱动就绪。

标准 Nginx 不支持 ssl_engine 指令,该指令并不存在于官方配置语法中。所谓“在全局块写 ssl_engine qat;”的做法,仅见于 Tengine(淘宝定制版)或个别商业/云厂商修改版 Nginx,它们在源码中自行添加了 ENGINE 初始化逻辑(如调用 ENGINE_by_id() 和 ENGINE_set_default())。原生 Nginx 完全不解析该指令,也不提供任何 OpenSSL 引擎控制接口。
为什么 nginx.conf 里不能直接配 ssl_engine
Nginx 的 SSL 功能由 ngx_http_ssl_module 实现,它只暴露基础配置项(如 ssl_certificate、ssl_protocols),并不封装 OpenSSL 的 engine 加载机制。引擎是否启用、使用哪个设备,完全取决于:
- 编译时链接的 OpenSSL 是否已集成硬件引擎(如 QAT-Engine、Intel QuickAssist SDK)
- OpenSSL 运行时是否通过
openssl.cnf自动加载对应 engine(例如配置openssl_conf = openssl_init+[openssl_init]段落) - 系统级环境是否就绪(如 QAT 驱动已安装、
qat_ctl status显示正常、Nginx 进程能访问/dev/qat_adf)
真正启用硬件加速的必要步骤
绕过 Nginx 配置层,在底层打通链路:
- 使用带硬件支持的 OpenSSL 编译 Nginx:例如基于 QAT-Engine 补丁的 OpenSSL 1.1.1 或 3.0,再用它 configure Nginx
- 配置
/etc/ssl/openssl.cnf,在[default_conf]下启用 engine,例如:openssl_conf = openssl_init [openssl_init] engines = engine_section [engine_section] qat = qat_section [qat_section] dynamic_path = /usr/lib64/engines-1.1/qat.so default_algorithms = ALL
- 确保 QAT 驱动已加载:
lsmod | grep qat;验证设备可见:lspci | grep -i qat - 重启 Nginx 后检查是否绑定驱动:
lsof -p $(pgrep nginx) | grep qat
验证加速是否真实生效
仅看配置正确远远不够,必须实测确认硬件参与运算:
- 用
openssl speed -evp aes-128-gcm -multi 4对比启用/禁用 QAT 时的吞吐差异(典型提升 2–4 倍) - 压力测试中运行
perf stat -e cycles,instructions,cache-misses -p $(pgrep nginx),若instructions/cycle显著升高,说明 CPU 流水线被高效利用 - 监控
/sys/class/qat/adf*/fw_counters/*下的加密请求数,非零即表示 QAT 正在处理 TLS 记录
替代方案:依赖 AES-NI 等 CPU 内建指令集
若无专用加速卡,现代 x86/ARM 服务器大多支持 AES-NI 或 SM3/SM4 指令(鲲鹏920、海光等):
- 确认支持:
grep -m1 -o aes /proc/cpuinfo(输出非空即支持) - 无需 Nginx 配置,只要 OpenSSL ≥1.1.1 且编译时启用了
enable-aesni,AES-GCM 套件会自动走硬件路径 - 配合精简
ssl_ciphers(仅保留 ECDHE+AES-GCM 套件),可将对称加解密开销压至最低


















