教程:宝塔编译Nginx开启HTTP/3
本文最后更新于 756 天前,其中的信息可能已经有所发展或是发生改变。

相信大家已经或多或少的听说了HTTP/3或者QUIC,我就不在继续解释HTTP/3是什么了,反正是新一代的HTTP,并且基于UDP,不再受限于TCP三次握手四次挥手了;腾讯云的CDN也已经推出了收费的QUIC协议等等。

不过目前Nginx目前还没有正式启用HTTP/3及QUIC,倒是CloudFlare早已推出了Nginx的QUIC解决方案,LiteSpeed也已经在正式版中支持了HTTP/3。本文将带领大家在宝塔面板中在Nginx-quic[1]技术预览分支下编译Nginx。

本教程与Ubuntu 20.04版本完成,全程使用root用户,目录使用的是root的~目录,代码都保存在这里。操作前请先做好备份/快照,数据丢失及环境损坏与本教程无关

目前的Nginx QUIC解决方案

官网:https://quic.nginx.org/
由官方推出的Nginx QUIC解决方案,目前还处于技术预览,与普通Nginx相同使用BSD协议,基于最新的1.21版本,并定时从主分支拉取代码。
本文以此方案来介绍。
项目地址:https://github.com/cloudflare/quiche/
最早的Nginx QUIC方案,基于Nginx 1.16.x
使用方法见:https://github.com/cloudflare/quiche/blob/master/nginx/README.md
国内用户不建议此方案,因为构建过程受国内网络愿意影响巨慢。

前置准备

首先你的宝塔Nginx需要是编译安装的1.21版本的Nginx,否则将缺少对应的依赖(/www/server/nginx/src文件夹)。如果不是的话可以卸载后重新编译安装,注意备份nginx.conf文件(/www/server/nginx/conf/nginx.conf)

然后是需要安装依赖,使用以下命令:

apt install build-essential ca-certificates zlib1g-dev libpcre3 libpcre3-dev tar unzip libssl-dev wget curl git cmake ninja-build golang hgsubversion 

编译BoringSSL

Nginx的QUIC由谷歌的BoringSSL[2]提供支持,所以我们需要编译一下BoringSSL

git clone --depth=1 https://github.com/google/boringssl.git
cd boringssl
mkdir build
cd build
cmake -GNinja ..
ninja
cd ../..

如命令ninja运行时出现网络错误,多半是go连接服务器出问题了,可以使用以下命令解决。

go env -w GOPROXY=https://goproxy.cn,direct

其他来自官方的编译方法见:https://github.com/google/boringssl/blob/master/BUILDING.md#building

获取Nginx-quic代码并编译

获取代码

nginx的代码使用的是hg作为版本控制,和git用法很像,刚刚我们也已经安装过了。使用以下命令获取源代码:

hg clone -b quic https://hg.nginx.org/nginx-quic
apt-get build-dep nginx # 安装nginx环境

获取宝塔Nginx的编译参数

运行以下命令:

/www/server/nginx/sbin/nginx -V

得到大概是以下结果:

root@VM-20-6-ubuntu:~$ nginx -V
nginx version: nginx/1.21.7
built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 
built with OpenSSL 1.1.1k  25 Mar 2021
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module

记住configure arguments后面的参数,现在要对他进行修改。首先删除--with-openssl=...参数(否则应该是编译不上),其次修改--with-pcre=pcre-8.43--with-pcre=/www/server/nginx/src/pcre-8.43(就是补全了路径),最后就是添加HTTP/3模块参数--with-http_v3_module --with-stream_quic_module --with-cc-opt=-I../boringssl/include --with-ld-opt='-L../boringssl/build/ssl -L../boringssl/build/crypto'(需要注意boringssl的路径是否正确)

我的最终编译参数为:

--user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-pcre=/www/server/nginx/src/pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --with-http_v3_module --with-stream_quic_module --with-cc-opt=-I../boringssl/include --with-ld-opt='-L../boringssl/build/ssl -L../boringssl/build/crypto'

编译Nginx-quic

使用以下命令来生成配置:

cd nginx-quic
./auto/configure --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-pcre=/www/server/nginx/src/pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --with-http_v3_module --with-stream_quic_module --with-cc-opt=-I../boringssl/include --with-ld-opt='-L../boringssl/build/ssl -L../boringssl/build/crypto'

后面那一大串就是刚刚拼接的字符串。

接下来删除objs/Makefile文件第三行的-Werror参数(编译中会有警告,有这个参数就会变成错误构建失败)

然后再nginx-quic目录下运行make就可以开始编译了

make

没有出错就说明编译成功了。如果编译成功的话,在~/nginx-quic/objs/目录下面应该会出现一个名为nginx的文件。

替换原本的Nginx

使用以下命令替换原本的Nginx

mv /www/server/nginx/sbin/nginx{,.bak} # 备份原本的Nginx文件
cp objs/nginx /www/server/nginx/sbin
make upgrade

没有出错的话就是升级成功了。

配置网站的HTTP/3

修改网站配置文件

网站首先要配置了HTTPS,点开他的”配置文件“,加入以下内容:

listen 443 http3 reuseport; # 代表开启HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400'; # 通知浏览器可以使用HTTP/3
如有多个网站需要开启HTTP/3,reuseport参数只需添加到其中一个网站的配置即可(不然会报错)。

开放服务器防火墙443端口的UDP协议

这一步是烦我最长时间的一步,宝塔的安全组默认显示443端口UDP开放,实际上并没有,需要手动修改以下。可以使用宝塔应用”系统防火墙“便捷操作。

点击上图中443端口的修改然后直接保存或删除重新添加443端口即可(协议一定要选TCP/UDP)

开放服务器安全组的443端口UDP协议

一般服务器提供商会有一个安全组来控制服务器的访问,在提供商那里把443端口的UDP加上就行了

检验HTTP/3是否生效

如果你是Firefox用户,可以直接在开发者工具的网络栏看到HTTP版本:

nginx-quic官方网站

如果没有Firefox,可以使用https://http3check.net/来检测自己的网站是否支持HTTP/3及QUIC:


完成我自己的服务器的升级后,我自己也做了一个测试你的浏览器是否正在使用HTTP/3的小网页,欢迎大家也来参观~ https://h3.orangii.cn/

本文参考:节点边缘博客文章[3]

文章首发于https://blog.orangii.cn/2022/bt-panel-enable-http3/,转载请注明出处。博客所有文章遵循CC BY-NC 4.0协议

评论

  1. wuhang2003
    置顶
    Windows Edge
    2 年前
    2022-7-06 20:51:09

    现在 QUIC 分支合了 1.23 的主线,部分依赖在 1.23 这个版本都得重新拉取源码了
    比如 lua_nginx_modulenginx-sticky-module,不然编译疯狂报错

    • wuhang2003
      wuhang2003
      Windows Firefox
      2 年前
      2022-7-11 15:33:57

      另外由于 nginx-sticky-module 年久失修,在 BitBucket 上翻到了个针对 1.23 版本修复的 PR,按照提供的办法修改文件,亲测有效

      • 博主
        wuhang2003
        Windows Chrome
        2 年前
        2022-7-11 16:50:13

        感谢提出~
        另外最近没时间管博客也有点年久失修了

        • wuhang2003
          橙梓
          Windows Firefox
          2 年前
          2022-7-14 11:49:51

          虽然但是,我自己重新编译的时候被 ngx-lua 这个模块卡住了,好不容易编译好了平滑升级(make upgrade)失败就很难受(
          所以大佬哪天有空重置下教程呗|´・ω・)ノ

          • 博主
            wuhang2003
            Windows Chrome
            2 年前
            2022-7-16 10:47:52

            回头我也得先试试,不然从技术就要变成寄术了

            • wuhang2003
              橙梓
              Windows Firefox
              2 年前
              2022-10-03 15:33:51

              逛了一下宝塔论坛,里面一堆人反馈说 Nginx 1.23 没法用,要不就是编译失败(原因还就是上面提到的模块年久失修),要不就是无法兼容宝塔的插件。官方已经开摆叫润回 1.22 了。
              隔壁 ngx_lua 的 issues 也有人反馈说模块不支持 QUIC 分支的编译。
              我还是暂时用 quiche 打补丁的吧(

              • 博主
                wuhang2003
                Windows Chrome
                2 年前
                2022-10-03 15:42:33

                乐,不知道宝塔那边怎么考虑的了,一直是开心版的宝塔也一直没有更新过。之前说的更新教程也因为考研和各种其他事情摆烂很久没有更新,还有设置默认头像的那片文章
                我这个教程编译完是 Nginx 1.21.7,用的 QUIC 分支的 changeset: 7870:55b38514729b

                • wuhang2003
                  橙梓
                  Windows Firefox
                  2 年前
                  2022-10-03 15:55:55

                  只能说估计宝塔那边可能还不一定找到我发的这个 PR(没那个能力你知道么
                  而且考虑到隔壁(ngx_lua)都还没确定说完全适配 QUIC 分支,所以在宝塔下目前还是折腾 Quiche 打补丁吧(反正我是国外服务器不用担心连接问题

                • 博主
                  wuhang2003
                  Android Firefox
                  2 年前
                  2022-10-03 16:00:32

                  唉突然想起来那个补丁的速度…
                  要不是已经忘了,应该可以把编译好的NGINX二进制文件发出来

                • wuhang2003
                  橙梓
                  Windows Firefox
                  2 年前
                  2022-10-03 16:07:56

                  确实(
                  宝塔下参数相同系统相同应该编译出的二进制文件都能跨服务器用吧?

                • wuhang2003
                  橙梓
                  Windows Firefox
                  2 年前
                  2022-10-11 17:15:51

                  好了,跟宝塔那边反馈那个 nginx-sticky-module 的那个 PR 了,并且官方那边测试没问题。链接
                  现在等官方看怎么用这个PR了(
                  φ( ̄∇ ̄o)

  2. Windows Chrome
    2 年前
    2022-4-02 17:06:13

    看着真不错,但想想还是懒得编译了,等以后各大厂商适配了再上

    • 博主
      你当向往阳
      Windows Chrome
      2 年前
      2022-4-02 17:09:33

      各大厂商指的是什么,Nginx不就一个组织吗

    • 博主
      你当向往阳
      Windows Chrome
      2 年前
      2022-4-02 17:21:53

      是不是,各个浏览器或者类似宝塔这样的管理平台吧。估计宝塔会在QUIC合并到主分支,更新最新版本号的时候支持吧

      • 橙梓
        Windows Chrome
        2 年前
        2022-4-02 18:16:29

        各个浏览器和宝塔,等社会面都支持了我再选择升级,不想折腾

        • 博主
          你当向往阳
          Windows Chrome
          2 年前
          2022-4-02 20:29:37

          当时HTTP/2是RFC 7540提出的,在2015年五月,百度搜的相关文章大都在2017年;所以作为对比,QUIC (RFC 9000)这个基于UDP的传输协议及HTTP/3 草案,估计要想基本全面实现估计还有个几年的时间

  3. lingxh
    Android Chrome
    2 年前
    2022-3-27 14:32:11

    学到了,感谢大佬分享!

  4. Windows Chrome
    2 年前
    2022-3-26 13:31:53

    学习啦,谢谢分享。。。

  5. Android Chrome
    2 年前
    2022-3-25 23:24:25

    现在应该还有很多浏览器不支持http3吧,这样整会不会影响兼容性导致一些用户无法打开网站

    • 博主
      迟於
      Windows Chrome
      2 年前
      2022-3-25 23:33:49

      最新版的Firefox及Chrome都已经默认QUIC的开启了,事实上浏览器都是先向TCP 443端口发起请求,当看到h3=":443"; ma=86400 header 的时候才会去尝试HTTP/3,也就是说是兼容HTTP/2及1.1的

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
橙橙梓
甘城猫猫
颜文字
Emoji
小恐龙
花!
上一篇
下一篇