nginx-quic 是为了让 nginx 支持 HTTP/3 协议,也就是基于 QUIC 的新一代网络传输协议。QUIC 是一种使用 UDP 协议实现的多路复用和可靠传输的协议,它可以提高网络速度和安全性,减少延迟和拥塞
要编译 nginx-quic,你需要选择一个提供 QUIC 支持的 SSL 库,比如 BoringSSL
, LibreSSL
或 QuicTLS
。这些库都是基于 OpenSSL 的分支,但是有不同的特点和优化
系统环境 :Ddian10
1.QUIC 支持的 SSL 库
可以根据前三篇文章操作
# Debian编译BoringSSL
# Debian安装quictls替换openssl
# Debian安装LibreSSL替换openssl
这是我编译好的可以直接下载,然后上传到服务器里使用
2. 系统更新和准备环境
首先,更新系统软件包并安装必要的依赖项:
apt install build-essential libtool automake autoconf zlib1g-dev libpcre3-dev libssl-dev libxml2-dev libxslt1-dev libgd-dev libgeoip-dev libgoogle-perftools-dev libperl-dev libpam0g-dev libpcre++-dev libcurl4-openssl-dev libyajl-dev libmaxminddb-dev liblmdb-dev git
3.下载 nginx-quic
https://hg.nginx.org/nginx-quic
wget https://hg.nginx.org/nginx-quic/archive/tip.tar.gz
tar -xf tip.tar.gz
cd cd nginx-quic/
4.QuicTLS配置
要求先安装# Debian安装quictls替换openssl
/usr/local/ssl
是我放QuicTLS的目录根据请实际情况填写
-static
:此选项指示链接器链接静态库而不是动态库。静态库是直接包含在可执行文件中的库,而动态库在运行时加载。使用-static
标志,生成的可执行文件将不依赖于指定的库的外部依赖关系,因为它们将以静态方式包含在其中
-static
添加了编译好的nginx二进制文件会比较大,不添加该选项运行nginx 时需要有对应的ssl库目录。
编译需要其他选项或者模块可以参考这里# Debian编译安装Nginx
./configure
--with-debug
--with-http_v3_module
--with-cc-opt="-I/usr/local/ssl/include" \
--with-ld-opt="-L/usr/local/ssl/lib64 -static"
...
5.LibreSSL配置
要求先安装# Debian安装LibreSSL替换openssl
其他的和上面一样
./configure
--with-debug
--with-http_v3_module
--with-cc-opt="-I/usr/local/ssl/include" \
--with-ld-opt="-L/usr/local/ssl/lib -static"
...
5.BoringSSL配置
要求先安装# Debian编译BoringSSL
./configure
--with-debug
--with-http_v3_module
--with-cc-opt="-I/usr/local/ssl/include"
--with-ld-opt="-L/usr/local/ssl/ssl -L/usr/local/ssl/crypto -static"
...
这边使用-static
选项编译完成后会有一个glibc 警告,去掉-static
选项则不出现警告
warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
...
在静态链接应用程序中使用 "dlopen "时,运行时需要链接所用 glibc 版本的共享库
chatGTP
的回答是是:glibc 中的某些函数(如dlopen
)与静态链接不完全兼容。这些函数可能依赖于在运行时加载其他共享库,或者使用其大小可能在不同版本的 glibc 之间变化的数据结构。当这些函数在静态链接的应用程序中使用时,如果运行时环境的 glibc 版本与链接期间使用的版本不同,则可能会导致意外行为甚至崩溃。
如果您忽略此警告并运行编译后的 NGINX,如果运行时环境的 glibc 版本与用于编译/链接的版本相同或更新,则它可能会正常工作。然而,也存在潜在的风险:
- 不兼容性 :如果您的程序在具有不兼容版本的 glibc 的系统上运行(即较旧或明显不同),则它可能无法正确运行。这可能会导致崩溃或意外行为。
- 缺少功能 :依赖的某些功能
getaddrinfo
可能无法按预期工作,因为该功能可能依赖于运行时动态加载的库。
- 难以调试的问题 :如果确实因此问题而出现问题,则可能很难诊断和调试,因为它们源于应用程序和系统 C 库之间的低级交互。
6.配置nginx-quic
站点的server块内加入以下内容开启quic
server {
...
listen 443 ssl;
listen [::]:443 ssl;
listen 443 quic reuseport;
listen [::]:443 quic reuseport;
http2 on;
add_header Alt-Svc 'h3=":443"; ma=86400';
quic_retry on;
ssl_early_data on;
...
}
请注意 listen 443 quic reuseport
里的 reuseport
参数,所有 server 段里,只允许一个段出现 reuseport
参数,否则会报错。
另外 listen
段里的 ssl
无法和 quic
放一起,必须分开写,http2 也需要单独写一行了。
测试 打开浏览器F12 安全性
https://http3check.net/ 这个网站可以查询网站是否支持HTTP3
参考:
https://lala.im/8679.html
https://hg.nginx.org/nginx-quic
https://docshome.gitbook.io/nginx-docs/readme/quic-he-http3-zhi-chi
https://nginx.org/en/docs/quic.html#building