Quiche HTTP/3 协议尝鲜
后知后觉 暂无评论

HTTP/3 协议发布后, cloudflare 发布了新的协议的服务器补丁,在此进行尝鲜。

更新

引子

关于 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/443UDP/443 端口

测试

需要注意的是即便服务器端支持了 HTTP/3 协议,也需要客户端(浏览器等)支持新协议才能正常体验,当前仅有 Chrome CanaryFirefox 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'

附录

相关链接

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。