Nginx* HTTPS 优化指南 - 基于第三代英特尔® 至强® 可扩展处理器及英特尔® QuickAssist 技术
发布日期: 08/17/2021
介绍
Nginx* 由俄罗斯软件工程师 Igor Sysoev 开发,是一款基于类似 BSD 许可的高性能 HTTP 和逆向代理 web 服务器。同时,它还可以提供 IMAP/POP3/SMTP 服务。自 2004 年第一版发布以来市场普及率逐年攀升,目前在许多一线互联网公司和 IT 企业中都得到广泛使用。Nginx 的架构设计非常灵活,有一个非常小巧简洁的内核,其中包含内核模块、基本模块和三方模块。它通过文件静态映射和可配置指令与模块协作,在 HTTP 代理、静态和动态分离、负载均衡、虚拟主机、逆向代理、高速缓存加速、授权访问等各种应用场景中突出高性能、高并发和低内存的显著优势。
有关 Nginx 的更多信息请访问:http://nginx.org。
Nginx 遵循 SSL/TLS 来加强 web 站点的访问安全性。英特尔已推出基于第 3 代英特尔® 至强® 可扩展处理器(代号 Ice Lake/Whitley)的 Crypto-NI 软件解决方案。它可以有效提高网络访问的安全性。
Crypto-NI 是新一代英特尔® 至强® 可扩展处理器 IceLake 中关于加解密领域的新指令集(NI 是 New Instruction),在之前英特尔® 至强® 可扩展处理器已经具备的英特尔® Advanced Encryption Standard New Instructions(英特尔® AES-NI)指令集基础上,又加入了比如 Vectorized AES、Integer Fused Multiply Add 等新指令。该解决方案使用的主要软件为 IPP 加密库、英特尔 Multi-Buffer Crypto for IPsec Library (intel-ipsec-mb) 和英特尔® 通信加速技术(英特尔® QAT),可提供多个 SSL 请求的批量提交和基于新指令集的并行异步处理机制,极大地提高了性能。
有关专属英特尔® QAT 硬件的详细信息,请参阅:https://01.org/sites/default/files/downloads/intelr-quickassist-technology/337003-001-intelquickassisttechnologyandopenssl-110.pdf
系统所需软硬件环境说明:
服务器配置 |
硬件 |
CPU |
英特尔® 至强® PLATINUM 8360Y CPU @ 2.20GHz |
内存 |
16 个 32GB DDR4,3200 MT/秒 |
||
硬盘 |
英特尔固态硬盘 S4610,960G |
||
网卡 |
英特尔® 以太网控制器 XXV700 25GbE SFP28 |
||
英特尔 QAT 卡 |
英特尔® QuickAssist Accelerator 8970 |
||
软件 |
操作系统 |
CentOS* 7.8 |
|
内核 |
3.10.0-1127.el7.x86_64 |
||
Nginx |
asynch_mode_nginx v0.4.4 |
||
OpenSSL |
v1.1.1i |
||
英特尔 QAT 驱动程序 |
QAT v1.7L4.12.0。00011 |
||
适用于 OpenSSL 的英特尔 QAT 引擎 |
v0.6.4 |
注意:
- 本文阐述的方案是基于英特尔® QuickAssist Accelerator 的硬件。内存、硬盘、网卡可视客户用量需求确定。
- 配置中列出的软件可参考 https://github.com/intel/QAT_Engine。 此链接指向的页面中描述了支持的每个软件的最旧版本。本文中列出的软件版本均满足以上要求,并已经过验证和测试。
- Asynch_mode_nginx 是 Nginx 经过优化的版本,英特尔将其用于支持 Nginx 硬件和软件加速。下载之后可直接编译。相关说明请参阅以下链接:https://github.com/intel/asynch_mode_nginx
- 适用于 OpenSSL 的英特尔 QAT 引擎链接:https://github.com/intel/QAT_Engine。
BIOS 设置
BIOS 可优化配置项及推荐值如下:
配置项 |
推荐值 |
超线程 |
启用 |
CPU C6 报告 |
自动 |
SpeedStep (Pstates) |
启用 |
Turbo 模式 |
启用 |
PCIe 链路速度 |
Gen4 |
节能加速技术 |
禁用 |
启动性能模式 |
最高性能 |
Linux* 优化
1.设置相应的系统启动参数
intel_iommu=off
processor.max_cstates=1 idle=poll pcie_aspm=off
2.关闭 cpupower 服务
systemctl stop cpupower.service
3.关闭防火墙
systemctl disable firewalld.service
4.用户进程设置
ulimit -c unlimited #generate core dump
ulimit -n 1000000 #set the maximum number of file open handles
英特尔® QuickAssist Accelerator 的安装和设置
英特尔® QuickAssist Accelerator 是一块 PCIe 卡,需要首先将其装入服务器的 PCIe 插槽中。以下为英特尔® QuickAssist Accelerator 卡的图片。
卡安装完毕之后,您需要进入 BIOS 设置,并将 PCIe 速度设置为 Gen4 和 X16,以尽可能实现最高性能。
用户可以从以下网址下载英特尔® QuickAssist Accelerator 驱动程序,解压缩,配置并安装。本文使用 /QAT 为驱动程序安装目录:https://01.org/intel-quickassist-technology/intel-quick-assist-technology/downloads/intel%C2%AE-quickassist-technology-driver-linux-hw-version-1.7
$cd /
$mkdir QAT
Copy qat1.7.l.4.12.0-00011.tar.gz to the /QAT directory
$cd /QAT
$ar xvzf ./qat1.7.l.4.12.0-00011.tar.gz
$./configure
$./make install
驱动程序安装完成后,您将在命令输出中看到三个 QAT 加速设备 (qat_dev) 处于启动状态。
然后用如下命令启动 QAT 服务。
$service qat_service start
OpenSSL* 和用于 OpenSSL 安装的英特尔 QAT 引擎
1.下载 OpenSSL 源代码
$ cd /usr/local/src
$ wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz
2.OpenSSL 编译安装
$ tar xvzf openssl-1_1_1j.tar.gz
$ cd ./openssl-1_1_1_1i
$./config --prefix=/usr/local/ssl -Wl,-rpath, /usr/local/ssl/lib
#In this article, openssl is installed in /usr/local/ssl
$ make
$ make install
3.下载用于 OpenSSL 源代码的英特尔 QAT 引擎
$ export OPENSSL_ENGINES=/usr/local/ssl/lib/engines-1.1
$ cd /usr/local/src
$ git clone https://github.com/intel/QAT_Engine.git
4.构建并安装适用于 OpenSSL 英特尔 QAT 引擎
$ cd ./QAT_Engine
$./autogen.sh
$./configure
-- with-qat_dir=/QAT
-- with-openssl_install_dir=/usr/local/ssl
$ make
$ make install
5.QAT 服务配置文件替换。
为了让 QAT 引擎能和 QAT 服务协作,还需要把 QAT 引擎目录下的实例配置文件拷贝到 /etc 目录下,并替换掉 QAT 原来的配置文件。
$ cd /usr/local/src/QAT_Engine/qat/config/c6xx/multi_process_event-driven_optimized
$ cp * /etc/ (before performing this operation, the original QAT configuration file can be renamed. For example, c6xx_dev0.conf can be renamed as c6xx_dev0.conf.bak)
在替换配置文件后,重新启动 qat_service 以加载新的配置文件:
$ service qat_service restart
用 OpenSSL 加载 QAT 引擎:
/usr/local/ssl/bin/openssl engine -t -vvv qatengine
6.使用 Openssl Speed 命令
通过 Openssl speed 命令,用户可验证使用 QAT 之前或之后的查看和验证信息。
$/usr/local/ssl/bin/openssl speed rsa2048
$/usr/local/ssl/bin openssl speed -engine qatengine -async_jobs 8 rsa2048
Nginx 安装及优化设置
Nginx 安装
1.完成 QAT、OpenSSL、QAT_Engine 的安装和配置。
2.Nginx 源代码下载
$ git clone https://github.com/intel/asynch_mode_nginx.git
3.Nginx 编译安装
$ cd asynch_mode_nginx
$ export NGINX_INSTALL_DIR=<Nginx installation directory>
$ export OPENSSL_LIB=<SSL installation directory>
$./configure
--prefix=$NGINX_INSTALL_DIR
--with-http_ssl_module
--add-dynamic-module=modules/nginx_qat_module
--with-cc-opt="-DNGX_SECURE_MEM -I$OPENSSL_LIB/include -Wno-error=deprecated-declarations"
--with-ld-opt="-Wl,-rpath=$OPENSSL_LIB/lib -L$OPENSSL_LIB/lib -lz"
$ make
$ make install
4.启动 Nginx 服务
完成 Nginx 设置之后,在 Nginx 安装目录下执行 $ ./sbin/nginx 命令,以启动 Nginx 服务。
Nginx 优化设置
1.生成 RSA 自签名证书和密钥文件。
$ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Inc./OU=Web Security/CN=example.com"
在 Nginx 安装目录下新建 cert 目录,然后复制 server.crt 和 server.key 到该目录下。
2.关键 nginx 配置。在 nginx.conf 文件中设置如下参数:
- 设置工作进程数量和事件模式
worker_processes <number of worker processes>; #It is recommended to have the same number of worker processes as the number of CPU cores in server
events {
use epoll; #epoll is an enhanced version of select/poll, and it improves the processing of a large number of file descriptors
…
}
- 加载和设置 SSL Engine 模块
load_module modules/ngx_ssl_engine_qat_module.so;
ssl_engine {
use_engine qatengine;
default_algorithms ALL;
qat_engine {
qat_offload_mode async;
qat_notify_mode poll;
qat_poll_mode heuristic;
qat_shutting_down_release off;
}
}
- 设置 Https Server
server {
Listen 443 ssl reuseport so_keepalive=on... ; #if you want to verify the SSL handshake performance, then set it to off.
sendfile on;
Server_name example1.com; #consistent with certificate CN
ssl_asynch on;
ssl_session_tickets on; #set it to off, if you want to verify the SSL handshake performance
ssl_certificate <Nginx installation directory>/cert/server.crt;
ssl_certificate_key <Nginx installation directory>/cert/server.key;
ssl_ciphers AES256-SHA:AES128-SHA;
#You can set other cipher suites according to customer needs, to verify the performance of different authentication, encryption and decryption protocols
ssl_prefer_server_ciphers on;
…
}
3.nginx.conf 完整的配置样例,该配置适合 RSA2K 握手性能测试:
user root;
worker_processes 8;
load_module modules/ngx_ssl_engine_qat_module.so;
events {
use epoll;
worker_connections 8192;
multi_accept on;
accept_mutex on;
}
ssl_engine {
use_engine qatengine;
default_algorithms ALL;
qat_engine {
qat_offload_mode async;
qat_notify_mode poll;
qat_poll_mode heuristic;
qat_shutting_down_release off;
}
}
http {
server {
listen example:443 ssl reuseport backlog=131072 so_keepalive=off rcvbuf=65536 sndbuf=65536;
keepalive_timeout 0s;
ssl_verify_client off;
ssl_session_tickets off;
access_log off;
ssl_asynch on;
ssl_session_timeout 300s;
ssl_protocols TLSv1.2;
ssl_ciphers AES128-SHA;
ssl_prefer_server_ciphers on;
ssl_certificate server2048.crt;
ssl_certificate_key server2048.key;
location / {
root html;
index index.html index.htm;
}
}
}
性能测试工具介绍
本节我们将介绍两款网络服务器压力测试工具:wrk 和 ab。
- wrk 是一款面向 HTTP/HTTPS 协议的基准测试工具。在由多核 CPU 支持的单台机器上,它可以使用系统的高性能 I/O 机制(如 epoll 和 kqueue),在多线程和事件 I/O 模式下在目标机器上产生巨大的工作负载。
使用示例:(用户将用他们自己的 Nginx URL 替换 URL)
$ wrk -t 10 -c 1000 -d 30S https://example1.com:443/index.html
说明:命令使用 10 个线程 1000 个并发连接取文件,对服务器进行 30 秒的压力测试。更多信息请访问 https://github.com/wg/wrk。
- ab 工具时 Apache* 自带的压力测试工具。它不仅可以对 apache 服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。例如,Nginx、Apache Tomcat* 和 IIS。如果用户已安装 Apache,则 ab 工具已随 Apache 安装。如果用户尚未安装 Apache,那么可以使用以下命令轻松安装 (CentOS*):
$ yum -y install httpd-tools
使用示例:(用户将用他们自己的 Nginx URL 替换 URL)
$ ab -n 100000 -c 100 -Z AES128-SHA -f TLS1.2 https://example1.com:443/index.html
说明:命令使用 100 个并发发送 100000 个请求 get index 文件,对服务器进行压力测试。更多信息请访问:https://httpd.apache.org/docs/2.4/programs/ab.html。
通知和免责声明
英特尔技术可能需要支持的硬件、软件或服务激活。
没有任何产品或组件能保证绝对安全。
您的成本和结果可能会有所不同。
英特尔使用代号来标识正在开发且未公开的产品、技术或服务。这些并非“商用”名称,也不会被用作商标
所述产品可能包含设计缺陷或错误(即勘误表),这可能会使产品与已发布的规范有所偏差。可应要求提供当前的勘误表。
© 英特尔公司。英特尔、英特尔标志和其他英特尔标识是英特尔公司或其子公司的商标。文中涉及的其它名称及商标属于各自所有者资产。
产品和性能信息
性能因用途、配置和其他因素而异。请访问 www.Intel.cn/PerformanceIndex 了解更多信息。