琐碎笔记

支持 QUIC 的 NGINX 官方预览版部署体验

佩佩 · 7月1日 · 2020年 · · 865次查看

前言

2020 年 6 月 10 日 Nginx 官方博客发文《Introducing a Technology Preview of NGINX Support for QUIC and HTTP/3》,同时对外发布了 QUICNginx 的分支传送,部署说明传送。喜欢尝鲜的我自然是要体验一下的。

操作环境

CentOS 7.7

准备工作

  • 安装相关依赖
sudo yum install mercurial psmisc net-tools wget curl build-essential lsb-release cmake golang libunwind-dev git libpcre3-dev zlib1g-dev
  • 拉取 QUICNginx 源码
hg clone -b quic https://hg.nginx.org/nginx-quic --insecure
  • 拉取支持 QUICHTTP/3OpenSSL 源码
# 这里我直接使用的是 Google 的 BoringSSL 作为 ssl 库
git clone https://boringssl.googlesource.com/boringssl

注意:官方的 OpenSSL 目前是不支持 QUICHTTP/3 的,但经过第三方修改而支持的有:

  • BoringSSL 分支
git clone https://boringssl.googlesource.com/boringssl
  • tatsuhiro-t 分支
git clone --depth 1 -b OpenSSL_1_1_1g-quic-draft-29 https://github.com/tatsuhiro-t/openssl
  • akamai 分支
git clone --depth 1 --branch master-quic-support https://github.com/akamai/openssl
  • 编译 BoringSSL
# 进入 BoringSSL 目录
cd /www/server/nginx/boringssl

# 创建用到的目录
mkdir -p build .openssl/lib .openssl/include

# 建立软链接 
ln -sf /www/server/nginx/boringssl/include/openssl /www/server/nginx/boringssl/.openssl/include/openssl

# 生成库文件
touch /www/server/nginx/boringssl/.openssl/include/openssl/ssl.h

# 预编译
cmake -B/www/server/nginx/boringssl/build -H/www/server/nginx/boringssl

# 编译 
make -C /www/server/nginx/boringssl/build

# 拷贝编译好的库文件
cp /www/server/nginx/boringssl/build/crypto/libcrypto.a /www/server/nginx/boringssl/build/ssl/libssl.a /www/server/nginx/boringssl/.openssl/lib

编译安装

关于 Nginx 其它模块或详见博客其它相关文章

  • 这是官方的
./auto/configure --with-debug --with-http_v3_module       \
                       --with-cc-opt="-I../boringssl/include"   \
                       --with-ld-opt="-L../boringssl/build/ssl  \
                                      -L../boringssl/build/crypto"
make
  • 这是整合了官方后的我的编译配置
# 进入源码目录
cd /www/server/nginx/nginx-quic

# 预编译
./auto/configure --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/redis2-nginx-module --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/ngx-pagespeed --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/ngx_brotli --add-module=/www/server/nginx/src/nginx-http-concat --add-module=/www/server/nginx/src/nginx-sorted-querystring-module --add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module --add-module=/www/server/nginx/src/headers-more-nginx-module --with-http_stub_status_module --with-pcre=/www/server/nginx/src/pcre-8.44 --with-zlib=/www/server/nginx/src/zlib --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-google_perftools_module --with-http_geoip_module --with-http_v3_module --with-cc-opt="-I../boringssl/include" --with-ld-opt="-L../boringssl/build/ssl -L../boringssl/build/crypto"

# 执行编译指令
make -j$(nproc --all)

# 复制新的编译好的执行文件 nginx,覆盖替换旧版本执行文件 nginx
mv /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx.bak
cp /www/server/nginx/nginx-quic/objs/nginx /www/server/nginx/sbin/nginx

# 无痛升级
make upgrade

# 或
make install

配置文件

# 以官方配置为例
server {
            # for better compatibility it's recommended
            # to use the same port for quic and https
            listen 443 http3 reuseport;
            listen 443 ssl http2;

            ssl_certificate     certs/example.com.crt;
            ssl_certificate_key certs/example.com.key;
            ssl_protocols       TLSv1.3;

            location / {
                # required for browsers to direct them into quic port
                add_header Alt-Svc '$http3=":443"; ma=86400';
            }
        }

可能遇到的异常

  • 异常信息
./auto/configure: error: certain modules require OpenSSL QUIC support.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.
  • 解决办法
# 可能你没有执行上面的这一步
cp /www/server/nginx/boringssl/build/crypto/libcrypto.a /www/server/nginx/boringssl/build/ssl/libssl.a /www/server/nginx/boringssl/.openssl/lib

# 或将编译好的库libcrypto.a和libssl.a手动拷贝到/usr/local/lib目录下,执行
touch ../boringssl/.openssl/include/openssl/ssl.h

# 然后重新执行
make -j$(nproc --all)

测试

这里以 Windows 平台 Chrome v85 版 Edge 为例,快捷方式右键-属性,在目标末尾加上运行参数“--enable-quic --quic-version=h3-27”,记得以空格隔开。

以该快捷方式启动 Edge,访问支持 QUIC 的网站测试,如 Nginx 官方测试页 https://quic.nginx.org/ ,有如下提示说明当前浏览器已成功建立了 QUIC 连接。

最后打开我的博客 https://www.nange.cn/F12 查看下,协议类型为 h3-27,说明当前支持的是草案 27 版本。如果协议不是 h3,可多刷新几次。其它浏览器本次并未测试。

说明

目前 Nginx 官版 QUIC 支持草案 29,28,27,默认为草案 27,不支持草案 27 之前的版本。如需支持草案 28 或草案 29,需要修改 Nginx 源码 src/event/ngx_event_quic.h 中的草案版本号,然后重新编译即可。

/* Supported drafts: 27, 28, 29*/
#ifndef NGX_QUIC_DRAFT_VERSION
#define NGX_QUIC_DRAFT_VERSION               29
#endif

本文所说的 HTTP/3 指的是 IETF QUIC,而非 Google QUIC,这两个,现阶段是完全不同的分支。文中说的 Nginx 官版QUIC 包括本博客其它文章之前提到的 Cloudflarequiche 补丁只支持 IETF QUIC,还没有支持 Google QUIC,所以 IETF QUICGoogle Chrome 浏览器中并不被很好地支持,需要指定启动项,当然它自家的 Google QUIC 倒是支持的很好。最新版火狐是直接走 IETF QUICHTTP/3 的,且支持得很好。

结束

Enjoy it !

9 条回应
  1. chj2020-7-23 · 17:57

    博主您好!请问nginx配置里的ssl_certificatekey是需要自己申请证书吗,能详细讲一下这块怎么申请呢。。我用openssl申请的证书可以吗,域名需要填哪一个呢

    • 佩佩2020-7-23 · 18:10

      openssl自签证书是不被信任的,你需要申请受信任的 SSL 证书,目前免费的 SSL 证书有 Let's SSL 和亚洲诚信的 SSL,你可以到这里申请 SSL 免费证书,传送。其它相关的 Nginx 如何配置证书的,你可以网上搜一下,这类教程还是很多的。

  2. tenny2020-7-11 · 19:41

    博主,编译nginx-quic,遇到这个情况咋弄感谢感谢。

    • 佩佩2020-7-11 · 19:44

      什么错误?

      • tenny2020-7-11 · 19:48
        -o objs/src/event/modules/ngx_epoll_module.o \
        	src/event/modules/ngx_epoll_module.c
        cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
        	-o objs/src/os/unix/ngx_linux_sendfile_chain.o \
        	src/os/unix/ngx_linux_sendfile_chain.c
        cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
        	-o objs/src/event/ngx_event_openssl.o \
        	src/event/ngx_event_openssl.c
        cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
        	-o objs/src/event/ngx_event_openssl_stapling.o \
        	src/event/ngx_event_openssl_stapling.c
        cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
        	-o objs/src/event/ngx_event_quic.o \
        	src/event/ngx_event_quic.c
        cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
        	-o objs/src/event/ngx_event_quic_transport.o \
        	src/event/ngx_event_quic_transport.c
        src/event/ngx_event_quic_transport.c: In function ‘ngx_quic_create_stream’:
        src/event/ngx_event_quic_transport.c:54:9: error: comparison is always true due to limited range of data type [-Werror=type-limits]
              : ((uint32_t) value) type);
                       ^
        cc1: all warnings being treated as errors
        make[1]: *** [objs/src/event/ngx_event_quic_transport.o] Error 1
        make[1]: Leaving directory `/root/nginx-quic'
        make: *** [build] Error 2
        • 佩佩2020-7-11 · 19:53

          参考这篇文章《Nginx 配置启用 QUIC 和 HTTP/3.0》中出错四的解决方法。

          • tenny2020-7-11 · 19:58

            博主你好,这个是执行./configure的结果,是否有问题,https://www.nihaoshijie.com.cn/mypro/others/log.txt

            • 佩佩2020-7-13 · 18:59

              你没复制完呐,不过我看没啥问题。

  3. tenny2020-7-11 · 19:35

    博主 ,编译nginx-quic,这个错误啥情况,感谢感谢