为 Nginx 添加 HTTP3/QUIC 支持

使用 Cloudflare 开发的 quiche 为 Nginx 添加 HTTP/3支持

Nginx 官方也在去年 5 月声明了正在进行对 QUIC 支持的开发,也许将来会原生支持 QUIC(已经在做了.jpg)

涉及到 Nginx 的编译、Nginx 配置文件的编写

环境

  • Ubuntu 18.04 LTS
  • Nginx

参考

步骤

编译环境配置

尽管 quiche 的 GitHub 文档中写了安装步骤,但是没有给出其依赖和编译环境

以下编译环境的安装以一个全新的 Ubuntu 18.04 LTS 系统为准

  1. 安装依赖库
    • 更新并升级包
      sudo apt update
      sudo apt upgrade
    • 安装依赖
      sudo apt install libpcre3 libpcre3-dev zlib1g-dev
  2. 安装编译环境
    • nginx-quiche 编译需要 cmake、 go 和 rust
      sudo apt install cmake # cmake
      sudo apt install golang # golang
      curl https://sh.rustup.rs -sSf | sh # rust
    • 安装 rust 后,启用 cargo 指令
      # 在当前终端启用 cargo
      source $HOME/.cargo/env
      # 或者添加到PATH
      export PATH=$PATH:$HOME/.cargo/bin

Nginx QUIC 编译

quiche 只支持 1.16.x 版本的 Nginx

  1. 下载并解压 1.16.1 版本的 Nginx 源码
    curl -O https://nginx.org/download/nginx-1.16.1.tar.gz
    tar zxvf nginx-1.16.1.tar.gz
  2. 下载 quiche 源码
    git clone --recursive https://github.com/cloudflare/quiche
  3. 将补丁导入 Nginx 源码(默认 nginx-1.16.1 与 quiche 在同级目录)
    cd nginx-1.16.1
    patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch
  4. 配置 Nginx 编译文件,开启 HTTP/3 支持
    ./configure                                 
           --prefix=$PWD                           
           --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)" 
           --with-http_ssl_module                  
           --with-http_v2_module                   
           --with-http_v3_module                   
           --with-openssl=../quiche/deps/boringssl 
           --with-quiche=../quiche

    注意这里的 prefix 设为了当前目录,编译完成的 Nginx 也会默认在此目录下查找并加载配置文件

  5. 开始编译
    make

    编译完成的 Nginx,使用指令

    nginx -V

    查看版本号,nginx version 后标注了 (quiche-xxxxxxx) 代表 Nginx 已经开启 HTTP3/QUIC 支持

Nginx 配置 HTTP/3

以 Nginx 默认配置页面为例,默认配置文件为 conf 目录下的 nginx.conf

  1. 通过 certbot 获取 SSL
  2. 编辑 Nginx 配置文件
    • 找到 server 块,更改为以下内容
      server {
          # Enable QUIC and HTTP/3.
          listen 443 quic reuseport;
          listen 443 ssl http2;
          
          # certbot 生成的证书默认在 /etc/letsencrypt/live/[domain]/ 下
          # 其中 fullchain.pem 为校验文件,prvkey.pem 为私钥
          ssl_certificate      cert.crt;
          ssl_certificate_key  cert.key;
      
          # 必须开启 TLSv1.3
          ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
      
          proxy_request_buffering off;
      
          add_header alt-svc 'h3-27=":443"; ma=86400';
      }

      也可以自行配置 HTTP 301 重定向,详见 网站开启https,这里复读一下:

      在监听 HTTP 请求的 server 块内添加以下内容

      server {
          listen 80;
          server_name [your server name];
          return 301 https://$server_name$request_uri;
      }
  3. 测试并启动 Nginx
    nginx -t
    nginx
    # 如果已启动则重新载入
    # nginx -s reload

效果

在 HTTP/3 Check 和 HTTP/3 Test 可以测试网站的 HTTP/3 连通性

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据