nginx的“quic”分支中开发的代码已合并到nginx主线中,并且自1.25.0发布以来一直是nginx的一部分。目前QUIC和HTTP / 3支持是实验性的,需要注意的是使用提供QUIC支持的SSL库来构建nginx。
1、创建文件夹(自定义路径)
在/www/server/目录下创建文件夹,例如:命名为nginxmodel
2、Nginx源码
下载源码并解压到/www/server/nginxmodel文件夹中
nginx下载官网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下载https://sourceforge.net/projects/pcre/files/pcre/8.45/
pcre2下载https://github.com/PCRE2Project/pcre2/releases
7、Nginx第三方模块源码(自选)
Nginx官网收录第三方模块列表大全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 | 业务端口 |