本文所用环境: 操作系统: 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
安装相关依赖 CMAKE 1 2 3 4 5 6 7 8 9 10 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 cd cmake-3.16.0-rc2/./bootstrap gmake gmake install
PERL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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
Rust 1 2 3 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
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/srcwget 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 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 重新编译 nginx:
1 2 --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
Brotli 下载 Brotli:1 2 3 git clone https://github.com/google/ngx_brotli cd ngx_brotligit 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/