您的位置:

深入理解nginxquic

一、quic协议概述

QUIC是一种提供快速安全的传输协议。QUIC 能够通过支持时延敏感应用程序的可靠传输来保证质量,也能够通过减少延迟和拥塞来提高效率。

QUIC协议实现了TLS及基于UDP的快速可靠传输。QUIC中文叫作“不可靠的快速TCP(Quick UDP Internet Connection)”。

QUIC协议优点如下:

  1. 快速:QUIC使用UDP而不是TCP,无需3次握手连接建立,且数据包加密是在第一次握手时建立的,因此降低了建立和重连的时间开销。同时QUIC流量控制机制也使用更为高效的算法。
  2. 安全:QUIC恒定使用TLS1.3,并在UDP上直接使用加密方法。 QUIC确保每个数据包都拥有独特的标识符,以确保更好的安全性。
  3. 网络透明度:QUIC允许客户端在不向服务器告知的情况下使用自己的IP地址。这可以提高链接的效率并避免阻止网络ISP的干扰。

二、nginxquic介绍

nginxquic是一个用于提供QUIC协议支持的nginx模块。它基于ngtcp2,在Nginx上实现了QUIC协议的支持。

1、nginxquic的运行机制

nginxquic通过 Nghttp3 在 Nginx 服务端实现了基于QUIC协议的HTTP/3协议支持,提供了一个新的应用层协议栈。其中,Nghttp3是QUIC和 HTTP/3的原始C库,其在不损失可读性和简洁性的情况下提供了与Quiche相似的功能。

nginxquic从管理原始套接字到生成HTTP/3流,以及提供所有HTTP/3服务。具体来说,ngx_quic_module.c处理QUIC数据包并生成与客户端关联的HTTP/3流。 但是,其实现不涉及构建HTTP/3的逻辑,而是委托给自下而上处理的 Nghttp3 库和实现处理流程的子系统。

简单的架构图如下图所示:

// the brief architecture of nginxquic
                                                        +------------+
    +-------------+       +--------------+             |            |
    | HTTP/3 Flow |       | ngx_quic_conn |<-------------|   QUIC     |
    |  management |-------|      1       |             |    Logic   |
    +-------------+       +--------------+             |            |
              ^                   ^                      +------------+
              |                   |
   +----------v---------+  +------v------+
   |     Nghttp3 Library |  | Subsystems  |
   +-------------------+  +-------------+

2、nginxquic的编译安装

官网下载最新的nginx.tar.gz文件,解压到本地:

$ tar -xvzf nginx-quic-xxx.tar.gz
$ cd nginx-quic-xxx/

编译安装Nginx:

$ ./configure --with-quic --with-http_v3_module --with-openssl=/path/to/openssl/source --with-debug
$ make
$ make install

其中,--with-quic 开启了QUIC支持,--with-http_v3_module 开启HTTP/3支持,--with-openssl=/path/to/openssl/source 是指定 SSL 库的路径,--with-debug 开启调试模式。

三、nginxquic的配置

Nginx在支持基于TLS的HTTP/2协议的同时也支持在与使用SSL模块生成的连接上运行QUIC的HTTP/3协议。因此,我们需要知道如何在nginx.conf文件中配置基于SSL的HTTP/2的服务器块以支持quic和http/3。

1、配置SSL证书

首先,UTF-8编码的SSL证书需要生成,我们可以使用 NSS Tools(Network Security Services Tools)。生成证书的一个基本范例命令如下:

$ certutil -d sql:$HOME/.pki/nssdb -N
$ certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n "mytest" -i mytest.crt
$ certutil -d sql:$HOME/.pki/nssdb -L

其中,mytest.crt 是SSL证书的UTF-8编码格式的文件路径,-n "mytest" 是证书名称。

2、配置HTTP/3 server区域

以下为nginx.conf文件中的server配置区域:

http {
    ...
    
    server {
        listen       443 quic reuseport;
        server_name  localhost;
        ssl on;
        ssl_certificate      /path/to/ssl/cert;
        ssl_certificate_key  /path/to/ssl/key;
        ssl_session_timeout  5m;
        ssl_protocols  TLSv1.2 TLSv1.3;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

其中,listen 443 quic reuseport; 指定了QUIC协议的端口,这里为443,在此之前还需要开启reuseport,提高负载处理能力。

这个server区域包含了相当简单的ssl设置,其他server 配置参数请根据实际情况自由调整。

四、nginxquic的测试

您可以在命令行中使用 Curl实用程序来测试您的HTTP/2 + QUIC服务器。这是一个简单示例,您可以根据实际情况进行调整:

$ curl --http3 -vs https://localhost:443/

如果QUIC服务已正确安装,您将看到响应包含了HTTP/3主机指示符,响应头类似:

HTTP/3 200 OK
server: nginx/1.18.0rc1
date: Sun, 26 Apr 2020 08:39:47 GMT
content-type: text/html
content-length: 946

五、总结

总的来说,nginxquic的实现在提供QUIC协议支持的同时,提高了网络传输的效率和安全性,对于一些需要保障网络传输效率和安全性的web应用场景是非常有帮助的。