nginx的“quic”分支中开发的代码已合并到nginx主线中,并且自1.25.0发布以来一直是nginx的一部分。目前QUIC和HTTP / 3支持是实验性的,需要注意的是使用提供QUIC支持的SSL库来构建nginx。

1、创建文件夹(自定义路径)

在/www/server/目录下创建文件夹,例如:命名为nginxmodel

nginx开启log nginx开启http3_git

2、Nginx源码

下载源码并解压到/www/server/nginxmodel文件夹中

nginx下载官网

nginx开启log nginx开启http3_github_02

https://nginx.org/en/download.html

3、Brotli压缩算法源码

在/www/server/nginxmodel文件夹中运行git命令

git clone --recursive https://github.com/google/ngx_brotli.git

4、QuicTLS源码

git clone --recursive https://github.com/quictls/openssl.git

5、获取宝塔Nginx的编译参数

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

显示结果

nginx version: nginx/1.24.0
built by gcc 12.2.0 (Ubuntu 12.2.0-17ubuntu1) 
built with OpenSSL 1.1.1q  5 Jul 2022
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 
--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 
--add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module-master 
--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

6、Pcre源码

使用Lua环境使用lua-nginx-module和ngx_devel_kit模块请选Pcre,否则选用最新的Pcre2。

pcre下载

nginx开启log nginx开启http3_github_02

https://sourceforge.net/projects/pcre/files/pcre/8.45/

pcre2下载

nginx开启log nginx开启http3_github_02

https://github.com/PCRE2Project/pcre2/releases

7、Nginx第三方模块源码(自选)

Nginx官网收录第三方模块列表大全

nginx开启log nginx开启http3_github_02

https://www.nginx.com/resources/wiki/modules/(1)lua-nginx-module

git clone https://github.com/openresty/lua-nginx-module.git

        依赖模块ngx_devel_kit

git clone https://github.com/vision5/ngx_devel_kit.git

(2)ngx_cache_purge【缓存清除】

git clone https://github.com/FRiCKLE/ngx_cache_purge.git

(3)ngx_http_substitutions_filter_module【正则表达式和固定字符串替换nginx】

git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git

(4)nginx-dav-ext-module【WebDAV协议扩展】


git clone https://github.com/arut/nginx-dav-ext-module.git


(5)nginx-http-concat【阿里的请求合并,非必选】

        需要在URL中使用??才生效,例如:example.com/??style1.css,style2.css,foo/style3.css


git clone https://github.com/alibaba/nginx-http-concat.git


(6)ngx_pagespeed【谷歌页面性能优化,已停更,nginx1.23起不兼容】


wget https://github.com/apache/incubator-pagespeed-ngx/archive/v1.13.35.2-stable.zip
unzip v1.13.35.2-stable.zip
cd incubator-pagespeed-ngx-1.13.35.2-stable
wget https://dl.google.com/dl/page-speed/psol/1.13.35.2-x64.tar.gz
tar -xzvf 1.13.35.2-x64.tar.gz


8、编译Nginx

设置root用户的lua临时环境变量(不用Lua可以忽略)


sudo su
export LUAJIT_LIB=/usr/local/lib/
export LUAJIT_INC=/usr/local/include/luajit-2.1/
export LD_LIBRARY_PATH=$LUAJIT_LIB


进入nginx源码目录运行配置(以下的--add-module仅供参考,可自行添加)


./configure --user=www --group=www --prefix=/www/server/nginx \
--with-openssl=/www/server/nginxmodel/openssl \
--with-pcre=/www/server/nginxmodel/pcre2 \
--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-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 \
--with-http_v3_module \
--add-module=/www/server/nginxmodel/ngx_cache_purge \
--add-module=/www/server/nginxmodel/ngx_http_substitutions_filter_module \
--add-module=/www/server/nginxmodel/nginx-dav-ext-module \
--add-module=/www/server/nginxmodel/ngx_brotli \
--add-module=/www/server/nginxmodel/nginx-http-concat


然后在nginx目录下运行make就可以开始编译了。


make


9、替换原本的Nginx(Nginx平滑升级)

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

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

10、开启网站HTTP/3.0+Brotli

修改网站配置文件,加入以下内容:

listen 443 ssl http2; # 代表开启HTTP/2
listen 443 quic; # 代表开启HTTP/3
ssl_early_data on; # 开启0-RTT
add_header Alt-Svc 'h3=":443"; ma=86400'; # 通知浏览器可以使用HTTP/3
ssl_protocols TLSv1.3; #HTTP/3需要TLSv1.3支持

brotli on; #启用
brotli_comp_level 6; #压缩等级,默认6,最高11,太高的压缩水平可能需要更多的CPU
brotli_min_length 1k; #指定压缩数据的最小长度,只有大于或等于最小长度才会对其压缩。这里指定1k
brotli_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json image/svg application/font-woff application/vnd.ms-fontobject application/vnd.apple.mpegurl image/x-icon image/jpeg image/gif image/png image/bmp; #指定允许进行压缩类型
brotli_static always; #是否允许查找预处理好的、以.br结尾的压缩文件,可选值为on、off、always
brotli_window 512k; #窗口值,默认值为512k

11、开放443端口

1、Alt-Svc响应头(替代服务指令)

        协议一定要选TCP/UDP,浏览器先以TCP方式访问服务器,获取Alt-Svc响应头才切换HTTP/3.0。其目的是引导客户端使用HTTP/3.0进行后续资源获取。

2、DNS HTTPS记录触发浏览器QUIC

        可在域名解析中添加HTTPS记录,如 domain.com. alpn="h3,h2" ipv4hint="1.2.3.4" ipv6hint="::1" port="80"

属性名

说明

alpn

HTTP协议支持

ipv4hint

IPv4解析地址

ipv6hint

IPv6解析地址

port

业务端口