支持 QUIC 和 HTTP/3
从源代码构建 配置 示例配置 故障排除 |
从 1.25.0 版本开始支持 QUIC 和 HTTP/3 协议。同样,从 1.25.0 版本开始,Linux 二进制软件包 中也提供了 QUIC 和 HTTP/3 支持。
QUIC 和 HTTP/3 支持处于实验阶段,使用需谨慎。
从源代码构建
构建使用 configure
命令进行配置。有关详细信息,请参阅 从源代码构建 Nginx。
在配置 Nginx 时,可以使用 --with-http_v3_module
配置参数启用 QUIC 和 HTTP/3。
建议使用提供 QUIC 支持的 SSL 库构建 Nginx,例如 BoringSSL、LibreSSL 或 QuicTLS。否则,将使用不支持 早期数据 的 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。
配置
listen 指令在 ngx_http_core_module 模块中新增了一个参数 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'; } } }
故障排除
可能有助于识别问题的提示
- 确保 Nginx 使用正确的 SSL 库构建。
- 确保 Nginx 在运行时使用正确的 SSL 库(
nginx -V
显示当前正在使用的库)。 - 确保客户端实际上正在通过 QUIC 发送请求。建议从简单的控制台客户端(如 ngtcp2)开始,以确保服务器配置正确,然后再尝试使用可能对证书非常挑剔的真实浏览器。
- 使用 调试支持 构建 Nginx 并检查调试日志。它应该包含有关连接的所有详细信息以及失败的原因。所有相关消息都包含“
quic
”前缀,可以轻松过滤。 - 对于更深入的调查,可以使用以下宏启用其他调试:
NGX_QUIC_DEBUG_PACKETS
、NGX_QUIC_DEBUG_FRAMES
、NGX_QUIC_DEBUG_ALLOC
、NGX_QUIC_DEBUG_CRYPTO
。./configure --with-http_v3_module --with-debug --with-cc-opt="-DNGX_QUIC_DEBUG_PACKETS -DNGX_QUIC_DEBUG_CRYPTO"