本文所用环境:
操作系统: 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/