为 Nginx 加入对 HTTP3.0/Quic 的支持

前言

虽然博客目前在国内全局使用腾讯云 CDN 加速访问,但还是有一些服务需要直连服务器,并且出于测试考虑,准备想体验一把 Quic

准备

咱服务器主要使用的是 Ubuntu 系统(十几台全都是也懒得改了,目前也没有换系统的硬需求)

Nginx 基本上是 LNMP 祖传下来的编译参数以及加入了 Lua、GeoIPVerynginx 的支持,所以还是在保留之前的基础上支持 Quic

之前咱一直再用 openssl 但是 openssl 表示对于 Quic 的支持会有但不会包含在 openssl 3.0 中所以这里咱要改用 Google 维护的 boringSSL 顺带一提拉这玩意的时候正值 22:37 事实证明,百度云加速的回源质量真的很烂,未缓存到的文件速度直接降到20+KiB/s(草)

过程

替换 OpenSSL

全部过程建议你在通常用来编译程序的目录下面进行

首先 clone 下由 Google 维护的支持 QUIC 的 OpenSSL 分支

码云(码云的同步真的很糟,吐嘈直接拉到最下面)

git clone https://gitee.com/mi1k/boringssl.git

Github 官方源

git clone https://github.com/google/boringssl.git

编译boringSSL

cd boringssl && mkdir build
cd build
cmake ../
make

至此 boringssl 结束

编译 Nginx-Quic

回到平时编译目录

下载官方的 nginx-quic

curl -O https://hg.nginx.org/nginx-quic/archive/tip.zip

unzip tip.zip

这里随着版本不同解压出来的目录名称也不同,注意区分

cd nginx-quic-12576ac9556d

预编译

如果你之前有自己的参数

比如这是我修改过之后的编译参数

./auto/configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-cc-opt=-I../boringssl/include --with-ld-opt='-L../boringssl/build/ssl -L../boringssl/build/crypto -Wl,-rpath,/usr/local/luajit/lib' --add-module=/root/lnmp1.7/src/lua-nginx-module-0.10.15 --add-module=/root/lnmp1.7/src/ngx_devel_kit-0.3.1 --with-google_perftools_module --with-http_stub_status_module --add-dynamic-module=/root/lnmp1.7/src/ngx_http_geoip2_module

加粗的部分是替换之前 openssl 的参数

如果你想“全新安装”体验一下 Quic 可以用下面这段

./auto/configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-cc-opt="-I../boringssl/include" --with-ld-opt="-L../boringssl/build/ssl -L../boringssl/build/crypto"

编译

make

如果你核心多的话也可以

make -j(你的核心数+1)

等待编译完成

升级原有的 Nginx

找到你的 nginx binary 位置

mv (你的 nginx binary 位置)nginx (你的 nginx binary 位置)nginx.bak

cp objs/nginx (你的 nginx binary 位置)nginx

nginx -t #测试是否正常

查看老 nginx master 进程的 pid

ps -ef | grep nginx

发出 USR2 信号

kill -USR2 (老 nginx master 进程 pid)

访问你的网站查看是否有异常

如果没有问题

kill -WINCH (老 nginx master 进程 pid)

升级完成

全新安装

make install

修改配置

找到你的配置文件找到 443 端口的 server 块(大多数人应该都是 80 443 放在一个块里的吧)

添加

listen 443 http3 reuseport;

listen [::]:443 http3 reuseport; #这行没有 ipv6 需求就不用了

注意目前好像只有一个 server 块可以添加后面的 reuseport 不然会报端口重复...

然后加个 http 头表示自己支持 Quic 的端口和版本

add_header Alt-Svc 'quic=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"';

验证

鉴于目前国内运营商的客观情况,个人使用浏览器很难查看效果

所以这里推荐在这里测试对于 Quic 的支持情况

最后还是没在自己的站点上看到绿色小闪电哭唧喞 doge-xiaoku

遇到的困难

Nginx-Quic 代码编译不通过

测试刚开始就吃了个闭门羹,最新的版本写错个变量名(草

改!编译通过

码云的同步源

上一次 commit 居然是四个月前,折腾了一晚上预编译时都显示无 0-RTT 支持

第二天才发现,赶紧去码云自己同步了一份(结果上午同步的下午才整好)

去自己的 Git 同步了一份,完美(Gogs 超棒)

发表评论

发表评论

*

// 隐藏的 input

冷冷清清