关于nginx:在-CentOS-下为-nginx-启用-SSLsendfile-支持

40次阅读

共计 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 版本尝鲜

  1. kTLS 是内核个性,须要比拟新的内核版本,CentOS 7 自带的 Linux 3.x 必定是不能用的。首先须要降级 Linux 内核。我应用的是 elrepo 编译好的包,间接上最新版本 5.x sudo yum install kernel-ml kernel-ml-headers(留神 OpenSSL 的 kTLS 反对须要最新的内核头文件,所以 kernel-ml-headers 也是必须的)
  2. 重启零碎 sudo reboot,启用 kTLS 内核模块反对 sudo modprobe tls。留神这一步是在运行 nginx 的机器上执行的命令,如果你须要把编译好的 nginx 复制给其余服务器应用,那么所有服务器都须要启用 kTLS。相同编译 nginx 的服务器如果不运行就不须要。
  3. 下载最新的 OpenSSL 源码。我间接应用的 git 版本。git clone https://github.com/openssl/openssl.git
  4. 编译 nginx。configure 命令须要退出参数 --with-openssl=/path/to/openssl --with-openssl-opt=enable-ktls
  5. 配置 nginx。http 块增加 sendfile on; ssl_conf_command Options KTLS;。当然其余 https 配置也是必须的

重启 nginx,启用 debug 日志模式。查看呈现了 SSL_sendfile 日志阐明一切正常

正文完
 0