Nginx HTTP/3服务器-客户端环境搭建

服务器 0
一、NGINX服务器介绍:

NGINX是一个高性能的开源Web服务器,也可用作反向代理服务器、负载均衡器和HTTP缓存。它由俄罗斯的程序员Igor Sysoev创建,并于2004年首次公开发布。NGINX的设计重点是高性能、高并发和低内存消耗,使其成为了现代Web架构中的关键组件之一。

NGINX的一些主要特点包括:

  1. 高性能: NGINX采用了事件驱动和异步非阻塞的处理方式,能够高效地处理大量并发连接请求。

  2. 低资源消耗: NGINX的内存消耗非常低,适用于在资源受限的环境下部署。

  3. 灵活性: NGINX具有强大的配置选项和模块系统,可以满足各种不同的需求,例如反向代理、负载均衡、静态文件服务等。

  4. 可扩展性: NGINX支持动态模块加载,允许用户根据需要自定义功能。

  5. 可靠性: NGINX经过了长时间的实际生产环境验证,被许多大型网站和公司广泛采用。

二、HTTP/3(QUIC协议)介绍:

HTTP/3是最新的HTTP协议版本,基于QUIC(Quick UDP Internet Connections)协议。QUIC是由Google开发的一种新的传输层协议,旨在提供更快的连接建立和数据传输速度,以及更好的抗丢包特性。

HTTP/3相对于之前的HTTP/2协议有以下一些主要变化和优势

  1. 使用UDP传输: HTTP/3使用UDP而不是TCP来传输数据,减少了连接建立的延迟和传输数据的丢包率。

  2. 多路复用: HTTP/3继承了HTTP/2中的多路复用特性,允许在单个连接上同时传输多个HTTP请求和响应。

  3. 零RTT连接建立: HTTP/3允许零轮回时间(0-RTT)连接建立,进一步减少了连接建立的延迟。

  4. 头部压缩: HTTP/3引入了一种新的头部压缩算法,以提高传输效率和减少带宽消耗。

  5. 更好的流量控制: 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>

也许您对下面的内容还感兴趣: