IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    不止于秒开 —— 在 Nginx 中开启 HTTP3/QUIC、TLS1.3、Brotli

    雨浣潇湘发表于 2021-05-14 15:40:09
    love 0

    本文所用环境:
    操作系统: Linux September 5.3.11-1.el7.elrepo.x86_64 GNU/Linux
    内核版本: centos-release-7-7.1908.0.el7.centos.x86_64

    HTTP3

    目前,最新版本的 nginx (1.17.5) 仍然不能原生支持 HTTP3,好在 CloudFlare 提供了基于 Quiche 和 Boringssl 实现的一个 patch,使得我们可以在 nginx 上尝鲜一下。

    开启过程如下:

    下载最新版本 nginx 并打上 quiche 的 patch

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    wget https://nginx.org/download/nginx-1.17.5.tar.gz
    tar xvzf tar xvzf

    git clone --recursive https://github.com/cloudflare/quiche

    cd nginx-1.17.5

    yum install patch

    patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch

    安装相关依赖

    1. CMAKE
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 前往 https://cmake.org/files/ 选择最新版本下载
    wget https://cmake.org/files/v3.16/cmake-3.16.0-rc2.tar.gz
    tar xvzf cmake*
    # 安装编译依赖
    yum install -y gcc gcc-c++ make automake openssl-devel
    # 编译安装 cmake
    cd cmake-3.16.0-rc2/
    ./bootstrap
    gmake
    gmake install
    1. PERL
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 前往 https://www.cpan.org/src/ 选择最新版本下载
    wget https://www.cpan.org/src/5.0/perl-5.30.0.tar.gz
    tar -xzf perl-5.30.0.tar.gz

    # 编译安装
    cd perl-5.30.0
    ./Configure -des -Dprefix=/usr/mysf
    make
    make test
    make install

    # 建立新的软链接
    mv /usr/bin/perl /usr/bin/perl.bak
    ln -s /usr/mysf/bin/perl /usr/bin/perl

    # 检查是否安装成功
    perl -v
    1. Rust
    1
    2
    3
    # 为了支持 quiche,Rust 需要至少 1.39 版本
    yum install gcc clang go -y
    yum install rust cargo -y

    安装 nginx

    在 nginx 的编译参数中加入如下模块,编译安装

    1
    --with-http_ssl_module  --with-http_v2_module  --with-http_v3_module  --with-openssl=../quiche/deps/boringssl  --with-quiche=../quiche

    安装完成之后,在 nginx 的配置文件中加入如下信息,重启 nginx 即可

    1
    2
    3
    4
    5
    6
    7
    8
    server {
    ···

    # 支持的 http3 和 quic 版本
    add_header alt-svc 'quic=":443"; ma=2592000; v="46,43", h3-Q050=":443"; ma=2592000, h3-Q049=":443"; ma=2592000, h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000, h3-Q043=":443"; ma=2592000, h3-23=":443"; ma=2592000'

    ···
    }

    完成之后,我们可以在这里查看配置是否成功: https://http3check.net/

    check
    check

    TLS1.3

    安装 OpenSSL

    TLS1.3 需要 OpenSSL 1.1.1 以上版本,系统自带版本一般较旧,我们需要重新安装(前文所述的 quiche patch 中已经内置了 Boringssl,不需要再重新安装)

    首先安装所有可能需要的依赖:

    1
    yum install gc gcc gcc-c++ pcre-devel zlib-devel make wget openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel gperftools gperftools-devel libatomic_ops-devel perl-ExtUtils-Embed dpkg-dev libpcrecpp0 libgd2-xpm-dev libgeoip-dev libperl-dev -y

    然后从官网 https://www.openssl.org/source/ 获取最新的 OpenSSL 下载链接,下载并解压编译安装:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cd /usr/src
    wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz
    tar -zxf openssl-1.1.1d.tar.gz
    cd openssl-1.1.1d.tar.gz
    ./config
    make
    make test
    make install

    # 备份原来的openssl
    mv /usr/bin/openssl /root/
    ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl

    完成后使用openssl version查看版本,如出现 /usr/bin/openssl: No such file or directory,可以使用如下方式解决:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
    ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
    # 删除旧的符号链接
    rm /bin/openssl
    # 添加新版本的符号链接
    ln -s /usr/local/bin/openssl /bin/openssl
    # 重新查看版本
    openssl version
    # OpenSSL 1.1.1d 10 Sep 2019

    使用最新的 OpenSSL 重新编译 nginx:

    1
    2
    # 在 nginx 编译信息中加入如下参数
    --with-openssl=/usr/src/openssl-1.1.1d

    安装完成之后,修改 nginx 配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    server {
    ···

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # 如果只需要兼容现代浏览器,也可以如下配置:
    # ssl_protocols TLSv1.3;
    # ssl_prefer_server_ciphers off;

    ···
    }

    重启 nginx,打开网站,在控制台 - Security - Overview - Connection 中可查看 TLS1.3 是否开启成功,如图所示:

    check
    check

    Brotli

    下载 Brotli:

    1
    2
    3
    git clone https://github.com/google/ngx_brotli
    cd ngx_brotli
    git submodule update --init

    在 nginx 的编译参数中加入 --add-dynamic-module=/path/to/ngx_brotli,重新编译安装 nginx,即可使 nginx 支持 brotli 压缩。

    新版本的 nginx 支持动态模块,也可以只编译 brotli 模块。

    安装完成后,在 nginx 配置文件中加入如下信息,重启 nginx,访问网站,应该就可以看到压缩方式为 br 了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    http {
    ...

    # brotli
    brotli on;
    brotli_comp_level 6;
    brotli_buffers 16 8k;
    brotli_min_length 20;
    brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

    ...
    }

    参考资料

    https://www.mf8.biz/nginx-install-tls1-3/
    https://zach.vip/server/%e4%bd%bf%e7%94%a8cloudflare%e7%9a%84quic%e5%ae%9e%e7%8e%b0quiche%e9%83%a8%e7%bd%b2nginx%e7%9a%84http3-quic%e5%8d%8f%e8%ae%ae/



沪ICP备19023445号-2号
友情链接