共计 1001 个字符,预计需要花费 3 分钟才能阅读完成。
Linux 的 sendfile 零碎调用是最快的发送动态文件的形式。它通过在内核中间接拷贝数据,防止了应用 read / write 导致的用户态、内核态的上下文切换,极大的晋升了传输效率。nginx 也很早就反对了 sendfile 指令的应用。
然而防止了用户态、内核态切换也就意味着 sendfile 只能发送原始未加密的数据,nginx 用到的 OpenSSL 的加密办法是运行在用户态的。
这就产生了一个矛盾:想应用 sendfile,就不能启用 https,想应用 https 就不能用 sendfile。直到 kTLS 的呈现解决了这个矛盾。
kTLS 简略了解就是运行在内核中的加密算法,在内核态拷贝数据时能够同时做数据加密。OpenSSL 3.0 退出了 SSL_sendfile 以反对 kTLS 的应用,nginx 1.14.4 反对了 SSL_sendfile。所有条件曾经凑齐,万事俱备只欠东风。接下来就让咱们编译一套反对 SSL_sendfile 的 nginx 版本尝鲜
- kTLS 是内核个性,须要比拟新的内核版本,CentOS 7 自带的 Linux 3.x 必定是不能用的。首先须要降级 Linux 内核。我应用的是 elrepo 编译好的包,间接上最新版本 5.x
sudo yum install kernel-ml kernel-ml-headers
(留神 OpenSSL 的 kTLS 反对须要最新的内核头文件,所以 kernel-ml-headers 也是必须的) - 重启零碎
sudo reboot
,启用 kTLS 内核模块反对sudo modprobe tls
。留神这一步是在运行 nginx 的机器上执行的命令,如果你须要把编译好的 nginx 复制给其余服务器应用,那么所有服务器都须要启用 kTLS。相同编译 nginx 的服务器如果不运行就不须要。 - 下载最新的 OpenSSL 源码。我间接应用的 git 版本。
git clone https://github.com/openssl/openssl.git
- 编译 nginx。
configure
命令须要退出参数--with-openssl=/path/to/openssl --with-openssl-opt=enable-ktls
- 配置 nginx。
http
块增加sendfile on; ssl_conf_command Options KTLS;
。当然其余 https 配置也是必须的
重启 nginx,启用 debug 日志模式。查看呈现了 SSL_sendfile
日志阐明一切正常
正文完