支持 QUIC 和 HTTP/3

从源代码构建
配置
配置示例
故障排除

自 1.25.0 起,提供对 QUICHTTP/3 协议的支持。此外,自 1.25.0 起,Linux 二进制包 中也提供了对 QUIC 和 HTTP/3 的支持。

对 QUIC 和 HTTP/3 的支持仍处于实验阶段,适用“买者自负”原则。

从源代码构建

使用 configure 命令配置构建。有关详细信息,请参阅 从源代码构建 nginx

配置 nginx 时,可以使用 --with-http_v3_module 配置参数启用 QUIC 和 HTTP/3。

建议使用提供 QUIC 支持的 SSL 库来构建 nginx,例如 BoringSSLLibreSSLQuicTLS。否则,将使用不支持 早期数据OpenSSL 兼容性层。

使用以下命令使用 BoringSSL 配置 nginx

./configure
    --with-debug
    --with-http_v3_module
    --with-cc-opt="-I../boringssl/include"
    --with-ld-opt="-L../boringssl/build/ssl
                   -L../boringssl/build/crypto"

或者,可以使用 QuicTLS 配置 nginx

./configure
    --with-debug
    --with-http_v3_module
    --with-cc-opt="-I../quictls/build/include"
    --with-ld-opt="-L../quictls/build/lib"

或者,可以使用较新版本的 LibreSSL 配置 nginx

./configure
    --with-debug
    --with-http_v3_module
    --with-cc-opt="-I../libressl/build/include"
    --with-ld-opt="-L../libressl/build/lib"

配置后,使用 make 编译并安装 nginx。

配置

ngx_http_core_module 模块中的 listen 指令获得了一个新参数 quic,该参数在指定端口上启用 QUIC 上的 HTTP/3。

除了 quic 参数,还可以指定 reuseport 参数,使其可以与多个工作进程正常运行。

有关指令列表,请参阅 ngx_http_v3_module

启用 地址验证

quic_retry on;

启用 0-RTT

ssl_early_data on;

启用 GSO(通用分段卸载)

quic_gso on;

设置 各种令牌的主机密钥

quic_host_key <filename>;

QUIC 需要 TLSv1.3 协议版本,该版本在 ssl_protocols 指令中默认启用。

默认情况下,GSO Linux 特定优化 处于禁用状态。如果相应网络接口配置为支持 GSO,请启用它。

配置示例

http {
    log_format quic '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" "$http3"';

    access_log logs/access.log quic;

    server {
        # for better compatibility it's recommended
        # to use the same port for quic and https
        listen 8443 quic reuseport;
        listen 8443 ssl;

        ssl_certificate     certs/example.com.crt;
        ssl_certificate_key certs/example.com.key;

        location / {
            # required for browsers to direct them to quic port
            add_header Alt-Svc 'h3=":8443"; ma=86400';
        }
    }
}

故障排除

可能有助于识别问题的提示