HTTP/3 协议发布后, cloudflare 发布了新的协议的服务器补丁,在此进行尝鲜。
更新
- 220510 更新 HTTP/3 正式版容器化构建(参考自 NGiNX 官方博客)
引子
关于 HTTP/3 的特点,可以参考文章 HTTP 协议历史版本及 HTTPS 简介。
本机编译
基于对 NGINX 的补丁使其支持最新的 HTTP/3 协议
注意:截止本文发布时,此补丁仅仅支持 NGX 的稳定版本 1.16.1 。
下载源码
$ curl -O https://nginx.org/download/nginx-1.16.1.tar.gz
$ tar xvzf nginx-1.16.1.tar.gz
克隆补丁
$ git clone --recursive https://github.com/cloudflare/quiche
应用补丁
$ cd nginx-1.16.1
$ patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch
编译
$ ./configure \
--prefix=$PWD \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_v3_module \ # 启用 HTTP/3
--with-openssl=../quiche/deps/boringssl \ # 使用谷歌的 BoringSSL 加密库
--with-quiche=../quiche
$ make
小贴士:关于 BoringSSL 加密库的编译可以参考本站之前的文章,在相关文章中可以看到。
配置
编译完成后,在运行程序时需要配置新的参数才能正常使用新协议。
http {
server {
# Enable QUIC and HTTP/3.
listen 443 quic reuseport;
# Enable HTTP/2 (optional).
listen 443 ssl http2;
ssl_certificate cert.crt;
ssl_certificate_key cert.key;
# Enable all TLS versions (TLSv1.3 is required for QUIC).
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# Add Alt-Svc header to negotiate HTTP/3.
add_header alt-svc 'h3-23=":443"; ma=86400';
}
}
这样同时启用了 HTTP/2
HTTP/3
并监听 TCP/443
与 UDP/443
端口
测试
需要注意的是即便服务器端支持了 HTTP/3 协议,也需要客户端(浏览器等)支持新协议才能正常体验,当前仅有 Chrome Canary、 Firefox Nightly 主流浏览器已经完全支持了新协议,同时新版 curl 也支持新协议。
容器化构建
Dockerfile 构建
FROM nginx:alpine-perl AS build
COPY --from=golang:alpine /usr/local/go/ /usr/local/go/
ENV PATH /usr/local/go/bin:$PATH
WORKDIR /src
RUN apk add --no-cache build-base cmake perl git libunwind-static linux-headers && \
git clone https://boringssl.googlesource.com/boringssl && \
mkdir boringssl/build && \
cd boringssl/build && \
cmake .. && \
make
RUN apk add --no-cache mercurial perl-dev pcre-dev zlib-dev libxslt-dev gd-dev geoip-dev && \
hg clone https://hg.nginx.org/nginx-quic && \
hg clone http://hg.nginx.org/njs -r "$NJS_VERSION" && \
cd nginx-quic && \
hg update quic && \
auto/configure `nginx -V 2>&1 | sed "s/ \-\-/ \\\ \n\t--/g" | grep "\-\-" | grep -ve opt= -e param= -e build=` \
--build=nginx-quic --with-debug \
--with-http_v3_module --with-stream_quic_module \
--with-cc-opt="-I/src/boringssl/include" --with-ld-opt="-L/src/boringssl/build/ssl -L/src/boringssl/build/crypto" && \
make
FROM nginx:alpine-perl
COPY --from=build /src/nginx-quic/objs/nginx /usr/sbin
EXPOSE 8443
小贴士:如果使用nginx blog 上的 dockerfile,会遇到如下报错 auto/configure: error: invalid option "--with-http_quic_module"
,去掉这个参数即可,目前的版本中 quic 模块和 http3 已经合并,所以 quic 已经不复存在。
检查
构建完成后可以查看一下版本信息
nginx version: nginx/1.21.7 (nginx-quic)
built by gcc 10.3.1 20211027 (Alpine 10.3.1_git20211027)
built with OpenSSL 1.1.1 (compatible; BoringSSL) (running with BoringSSL)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --build=nginx-quic --with-debug --with-http_v3_module --with-stream_quic_module --with-cc-opt=-I/src/boringssl/include --with-ld-opt='-L/src/boringssl/build/ssl -L/src/boringssl/build/crypto'
附录
相关链接
参考链接
- Experiment with HTTP/3 using NGINX and quiche - The Cloudflare Blog
- Quiche - GitHub
- Our Roadmap for QUIC and HTTP/3 Support in NGiNX - NGiNX Blog
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2019-11-19 11:32 AM