一、NGINX服务器介绍:
NGINX是一个高性能的开源Web服务器,也可用作反向代理服务器、负载均衡器和HTTP缓存。它由俄罗斯的程序员Igor Sysoev创建,并于2004年首次公开发布。NGINX的设计重点是高性能、高并发和低内存消耗,使其成为了现代Web架构中的关键组件之一。
NGINX的一些主要特点包括:
高性能: NGINX采用了事件驱动和异步非阻塞的处理方式,能够高效地处理大量并发连接请求。
低资源消耗: NGINX的内存消耗非常低,适用于在资源受限的环境下部署。
灵活性: NGINX具有强大的配置选项和模块系统,可以满足各种不同的需求,例如反向代理、负载均衡、静态文件服务等。
可扩展性: NGINX支持动态模块加载,允许用户根据需要自定义功能。
可靠性: NGINX经过了长时间的实际生产环境验证,被许多大型网站和公司广泛采用。
二、HTTP/3(QUIC协议)介绍:
HTTP/3是最新的HTTP协议版本,基于QUIC(Quick UDP Internet Connections)协议。QUIC是由Google开发的一种新的传输层协议,旨在提供更快的连接建立和数据传输速度,以及更好的抗丢包特性。
HTTP/3相对于之前的HTTP/2协议有以下一些主要变化和优势:
使用UDP传输: HTTP/3使用UDP而不是TCP来传输数据,减少了连接建立的延迟和传输数据的丢包率。
多路复用: HTTP/3继承了HTTP/2中的多路复用特性,允许在单个连接上同时传输多个HTTP请求和响应。
零RTT连接建立: HTTP/3允许零轮回时间(0-RTT)连接建立,进一步减少了连接建立的延迟。
头部压缩: HTTP/3引入了一种新的头部压缩算法,以提高传输效率和减少带宽消耗。
更好的流量控制: HTTP/3使用了更先进的流量控制算法,以优化数据传输和网络资源利用。
NGINX与HTTP/3(QUIC协议)的关系:
NGINX作为一种高性能的Web服务器,已经开始支持HTTP/3协议。NGINX官方提供了用于HTTP/3支持的QUIC库(例如,quiche),使得用户可以在NGINX中启用HTTP/3功能,并且可以与现有的HTTP/1.x和HTTP/2协议共存。
通过NGINX服务器与HTTP/3的结合,开发者可以利用HTTP/3的高性能和低延迟特性,为其网站和应用程序提供更好的用户体验和更高的性能。
三、nginx-server环境搭建
1.rust代码仓需要配置cargo国内源
# 【配置】
cd $HOME/.cargo
touch config
vim config
编写以下内容:
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
# 清华大学
replace-with = 'tuna'
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
[net]
git-fetch-with-cli = true
2.安装依赖工具
apt install vim net-tools wireshark-qt git git-lfs ssh cmake rustc cargo ffmpeg libssl-dev curl build-essential libtool mercurial libpcre2-dev zlib1g-dev
3.开源工程代码下载
quiche使用0.18.0,--recursive 参数会下载依赖的boringssl子仓,不带此参数则不会下载
git clone --recursive -b 0.18.0 https://github.com/cloudflare/quiche
nginx使用1.16.1
curl -O https://nginx.org/download/nginx-1.16.1.tar.gz
4.安装pcre依赖
git clone https://github.com/PhilipHazel/pcre2.git
make
make install
5.nginx服务器生成ssl证书(也可以使用之前备份的ssl证书)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /opt/server/ssl/server.key -out /opt/server/ssl/server.crt
6.编译quiche
在quiche目录下执行,禁用qlog特性可以减少很多依赖
cargo build --package quiche --release --features ffi,pkg-config-meta
mkdir quiche/deps/boringssl/src/lib
ln -vnf $(find target/release -name libcrypto.a -o -name libssl.a) quiche/deps/boringssl/src/lib/
报错:error: failed to run custom build command for `quiche v0.18.0 (/home/ty/http-client/CodeSpace/Repository/quiche/quiche)`
boringssl文件问题或版本问题,疑难问题
报错:cmake:error while loading libraries:libquiche.so: cannot open shared object file: No such file or directory
cmake版本过低升下载并安装最新cmake即可
https://github.com/Kitware/CMake/releases/
7.安装编译nginx
进入nginx-1.16.1目录,执行
patch -p01 < ../quiche/nginx/nginx-1.16.patch
./configure --prefix=/opt/server --build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)" --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-openssl=../quiche/quiche/deps/boringssl --with-quiche=../quiche --with-http_ssl_module
注意:--prefix=后跟的path为上述nginx.conf所在位置,有些是在/opt/server/conf 下面
--build=括号里的path为quiche的安装目录
make
make install
8.修改nginx配置
或者直接替换压缩包里的nginx.conf
文件位置在./configure --prefix指定的目录/opt/server/下生成conf文件夹
vim nginx.conf
在文件末尾修改如下配置:
# HTTPS server
#
server {
listen 443 ssl;
listen 443 quic reuseport; # 监听quiche,并启用端口reuse
server_name localhost;
# quiche ssl证书配置
ssl_certificate /opt/server/ssl/server.crt;
ssl_certificate_key /opt/server/ssl/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# quiche ssl配置
ssl_protocols TLSv1.3;
location / {
root html;
index index.html index.htm;
}
# https://127.0.0.1/hls/ 访问路径(quiche)
location /hls {
alias /opt/server/hls/;
}
# https://127.0.0.1/hls/5g-en/ 访问路径(quiche)
location /hls/5g-en{
alias /opt/server/hls/5g-en/;
}
}
#开启nginx服务
cd /opt/server/sbin
./nginx -s reload
./nginx
# 查看nginx配置文件路径
./nginx -t
# 重新加载配置
./nginx -s reload
# 查看版本号
/usr/local/nginx/sbin/nginx -V
11.##环境验证
拷贝xxx文件/opt/server/hls
# 浏览器验证nginx服务
http://127.0.0.1
# 测试web路径可否访问下载
https://127.0.0.1/hls/xxx
#无界面可通过w3m访问
w3m https://127.0.0.1/hls/xxx
w3m访问不了的话可以用 (-k跳过证书校验)
curl --output 004.ts https://127.0.0.1/hls/xxx -k
四、nginx-client环境搭建
1.安装依赖工具(同server端)
2.开源工程代码下载
quiche使用0.18,curl使用8.4.0(可自行修改配套版本)
git clone --recursive -b 0.18.0 https://github.com/cloudflare/quiche
git clone --recursive https://github.com/curl/curl/tree/curl-8_4_0
解压tar -xzf
3.安装rustup依赖
snap install rustup
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
curl https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env
rustup default nightly
https://blog.csdn.net/weixin_41760738/article/details/108060293
4.安装其他依赖
wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar zxvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure --prefix=/usr/local
make && make install
以下同上,下载,解压,安装
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/automake/automake-1.16.tar.gz
wget http://mirrors.kernel.org/gnu/libtool/libtool-2.2.6b.tar.gz
wget https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
报错:error: --with-quiche was specified but could not find quiche pkg-config file.
wget https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
报错:error: Either a previously installed pkg-config or "glib-2.0 >= 2.16" could not be found. Please set GLIB_CFLAGS and GLIB_LIBS to the correct values or pass --with-internal-glib to configure to use the bundled copy.
./configure --prefix=/usr/local --with-internal-glib
make && make install
5.编译quiche(同server端)
6.安装编译curl
进入curl目录,执行
autoreconf -fi
./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" --with-openssl=$PWD/../quiche/quiche/deps/boringssl/src --with-quiche=$PWD/../quiche/target/release
make
make install
7.试运行
curl --http3 https://cloudflare-quic.com
如果http3参数没有
apt-get remove curl
重新回到上一步安装编译curl
export LD_LIBRARY_PATH=/usr/local/lib/
curl -v --http3 https://quic.rocks:4433/
client端加上http3以后无法访问server端,server端quiche版本过低升级至0.17.2或更高版本即可
报错:bash:/usr/bin/curl : No such file or directory
https://blog.csdn.net/juexinhao/article/details/81094720
export LD_LIBRARY_PATH=/usr/local/lib/
curl -v --http3 https://quic.rocks:4433/
如下代表安装成功:
* Trying 216.155.158.183:4433...
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: none
* Connect socket 5 over QUIC to 216.155.158.183:4433
* Sent QUIC client Initial, ALPN: h3,h3-29,h3-28,h3-27
* Trying 2001:19f0:4:34::1:4433...
* Immediate connect fail for 2001:19f0:4:34::1: Network is unreachable
* subjectAltName: host "quic.rocks" matched cert's "quic.rocks"
* Verified certificate just fine
* Connected to quic.rocks () port 4433 (#0)
* h2h3 [:method: GET]
* h2h3 [:path: /]
* h2h3 [:scheme: https]
* h2h3 [:authority: quic.rocks:4433]
* h2h3 [user-agent: curl/7.84.0-DEV]
* h2h3 [accept: */*]
* Using HTTP/3 Stream ID: 0 (easy handle 0x561d28c5dcf0)
> GET / HTTP/3
> Host: quic.rocks:4433
> user-agent: curl/7.84.0-DEV
> accept: */*
>
< HTTP/3 200
< content-type: text/html; charset=UTF-8
< x-original-url: https://quic.rocks/
< alt-svc: h3=":4433"; ma=3600, h3-29=":4433"; ma=3600
<
<!doctype html>
<html>
<head><title>quic.rocks</title></head>
<body>
<h1>quic.rocks</h1>
<p>You have successfully loaded quic.rocks using QUIC!</p>
</body>
</html>