HTTP/3 基于 QUIC 传输协议,能够显著降低连接建立时延、改善弱网环境下的传输效率。然而,由于 QUIC 需要 TLS 1.3 支持和 UDP 传输,传统 Apache 发行版并不直接包含 HTTP/3 模块。对于运行在 ARM 架构上的 Jetson Nano 来说,官方仓库提供的 Apache 版本往往较旧,无法通过简单的 apt 安装获得 HTTP/3 能力。要在这样的板子上实现反向代理缓存并对外提供 HTTP/3 服务,必须从源码开始定制编译,并手动配置代理与缓存模块。本文将按照依赖准备、编译安装、反向代理缓存配置、HTTP/3 启用与验证四个阶段,完整展示搭建过程。

第一步:搭建编译环境与依赖库
Jetson Nano 默认系统为 Ubuntu 18.04 (JetPack 4.x) 或 20.04 (JetPack 5.x),后续步骤以 Ubuntu 20.04 为例。Apache HTTPD 启用 HTTP/3 需要三个关键支持:支持 QUIC 的 OpenSSL 版本(3.0 以上)、nghttp3 库以及 ngtcp2 库。首先,安装基础编译工具和常规依赖:
sudo apt update
sudo apt install -y build-essential libtool autoconf automake pkg-config
libexpat1-dev libpcre3-dev libssl-dev zlib1g-dev libapr1-dev libaprutil1-dev
libxml2-dev liblua5.3-dev libbrotli-dev libjansson-dev
注意上述安装的 libssl-dev 是系统自带的 OpenSSL 1.1.1,不支持 QUIC。我们需要从源码编译 OpenSSL 3.x。建议安装到 /usr/local/ssl3,避免与系统版本冲突:
wget https://www.openssl.org/source/openssl-3.1.4.tar.gz tar xzf openssl-3.1.4.tar.gz cd openssl-3.1.4 ./Configure --prefix=/usr/local/ssl3 --openssldir=/usr/local/ssl3 shared zlib make -j4 sudo make install
接着编译 nghttp3(HTTP/3 帧处理库)和 ngtcp2(QUIC 传输库)。这两个库需要依赖刚才编译的 OpenSSL:
# nghttp3
git clone https://github.com/ngtcp2/nghttp3.git
cd nghttp3
autoreconf -i
./configure --prefix=/usr/local/nghttp3 --enable-lib-only
make -j4
sudo make install
cd ..
# ngtcp2
git clone https://github.com/ngtcp2/ngtcp2.git
cd ngtcp2
autoreconf -i
./configure --prefix=/usr/local/ngtcp2
--with-openssl=/usr/local/ssl3
--enable-lib-only
make -j4
sudo make install
cd ..
编译完成后,将库路径写入系统动态链接配置,确保后续 Apache 能够找到这些共享库:
echo "/usr/local/ssl3/lib" | sudo tee -a /etc/ld.so.conf.d/custom.conf echo "/usr/local/nghttp3/lib" | sudo tee -a /etc/ld.so.conf.d/custom.conf echo "/usr/local/ngtcp2/lib" | sudo tee -a /etc/ld.so.conf.d/custom.conf sudo ldconfig
第二步:源码编译Apache并启用HTTP/3模块
现在准备好所有依赖后,就可以编译 Apache HTTPD 了。建议使用 2.4.57 或更新版本,以确保 mod_http3 的稳定性。下载源码并配置编译选项:
wget https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.gz
tar xzf httpd-2.4.57.tar.gz
cd httpd-2.4.57
./configure
--prefix=/usr/local/apache2
--enable-ssl
--enable-so
--enable-http3
--with-ssl=/usr/local/ssl3
--with-nghttp3=/usr/local/nghttp3
--with-ngtcp2=/usr/local/ngtcp2
--enable-proxy
--enable-proxy-http
--enable-cache
--enable-cache-disk
--enable-headers
--enable-rewrite
make -j4
sudo make install
这里除了 --enable-http3 之外,还特意开启了 proxy、proxy-http、cache 和 cache-disk 模块,为后续构建反向代理缓存做准备。编译完成后,Apache 主程序会安装在 /usr/local/apache2 下。验证 HTTP/3 模块是否编译成功:
/usr/local/apache2/bin/httpd -M | grep http3
如果看到 http3_module (shared) 字样,说明模块已可用。为了方便管理,可以创建一个 systemd 服务单元,或直接使用 apachectl 启动。
编译过程中可能会遇到 ngtcp2 头文件找不到的情况,这时可在 configure 时添加环境变量指定路径,例如 CPPFLAGS="-I/usr/local/ngtcp2/include"。若内存不足导致编译失败,建议使用 make -j2 降低并行度,并确保有至少 2GB 的交换空间。
第三步:配置反向代理与磁盘缓存
反向代理缓存可以让 Jetson Nano 充当前端边缘节点,将客户端请求转发到后端真实服务器,并缓存静态或动态资源,减少后端负载。首先编辑 Apache 主配置文件 /usr/local/apache2/conf/httpd.conf,确保以下模块被加载:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule cache_module modules/mod_cache.so LoadModule cache_disk_module modules/mod_cache_disk.so LoadModule cache_socache_module modules/mod_cache_socache.so
接下来在虚拟主机段或主配置中加入代理与缓存规则。以下是一个将请求转发到内部 Web 服务(比如运行在 192.168.0.100:8080 的 REST API)并缓存静态文件的示例:
<IfModule mod_cache.c>
CacheRoot /var/cache/apache2/
CacheEnable disk /static/
CacheHeader on
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheIgnoreNoLastMod On
CacheQuickHandler off
</IfModule>
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPreserveHost On
<Location /static/>
ProxyPass http://192.168.0.100:8080/static/
ProxyPassReverse http://192.168.0.100:8080/static/
CacheEnable disk /
</Location>
<Location /api/>
ProxyPass http://192.168.0.100:8080/api/
ProxyPassReverse http://192.168.0.100:8080/api/
</Location>
</IfModule>
上面的配置将 /static/ 路径下的请求转发到后端并开启磁盘缓存,而 /api/ 请求仅代理但不缓存。缓存路径 /var/cache/apache2/ 需要手动创建并赋予 Apache 运行用户(通常是 daemon 或 www-data)写权限。
为了提高缓存命中率,可以在后端应用的响应中设置 Cache-Control: public, max-age=... 或 Expires 头。如果后端没有提供这些头信息,可以使用 mod_headers 模块进行强制添加:
<Location /static/>
Header set Cache-Control "public, max-age=3600"
</Location>
启动 Apache 后,通过 curl -I http://你的设备IP/static/some.jpg 请求,观察响应头中是否出现 X-Cache: HIT 或 X-Cache: MISS,确认缓存功能是否生效。
第四步:启用HTTP/3并配置TLS证书
HTTP/3 依赖 QUIC 传输,而 QUIC 又必须基于 TLS 1.3。因此我们需要为 Apache 配置 SSL 证书,并在对应虚拟主机中开启 H3 支持。先准备自签名证书用于测试(生产环境请使用 Let's Encrypt 等合法证书):
cd /usr/local/apache2/conf sudo mkdir -p ssl cd ssl sudo openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=你的域名或IP" sudo chmod 600 server.key
然后编辑 httpd.conf 或单独的 ssl 虚拟主机配置文件,添加监听 443 端口并开启 H3:
LoadModule http3_module modules/mod_http3.so
LoadModule ssl_module modules/mod_ssl.so
Listen 443 https
<VirtualHost *:443>
ServerName 你的域名或IP
Protocols h2 h2c http/1.1
ProtocolsHonorOrder On
# HTTP/3 需要使用单独的 Alt-Svc 来宣告
Header always set Alt-Svc 'h3=":443"'
SSLEngine on
SSLCertificateFile "/usr/local/apache2/conf/ssl/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/ssl/server.key"
# 启用 QUIC 监听
H3Direct on
H3MaxData 100m
H3MaxStreamData 50m
H3QLog on
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 嵌入之前定义的代理与缓存规则
Include conf/extra/proxy-cache.conf
</VirtualHost>
HTTP/3 的宣告依赖于 Alt-Svc 响应头,浏览器在首次通过 HTTP/2 或 HTTP/1.1 访问后,会读取这个头并在后续使用 QUIC 连接。为了使 QUIC 正常工作,防火墙需要放行 UDP 443 端口,因为 QUIC 是基于 UDP 的:
sudo ufw allow 443/udp sudo ufw allow 443/tcp
最后重启 Apache,并使用支持 HTTP/3 的客户端测试。例如,用 curl 8.0 以上版本搭配 --http3 选项:
curl -I --http3 https://你的设备IP/static/test.html
如果看到返回头中包含 alt-svc: h3=":443" 而且连接过程显示使用了 QUIC,就说明 Jetson Nano 已经成功运行起 HTTP/3 代理缓存服务了。
在测试过程中,如果 --http3 总是降级到 HTTP/2,请检查 OpenSSL 库是否正确链接,以及 ngtcp2 是否支持所需的 QUIC 版本。可以通过 ldd /usr/local/apache2/bin/httpd 确认所有 .so 都指向了 /usr/local/ 下的版本。另外,由于 QUIC 需要握手时的 TLS 1.3 ALPN 协商,确保证书和密钥文件正常,且 OpenSSL 版本不低于 3.0。通过这套方案,一枚小小的 Jetson Nano 就能成为你网络边缘的 HTTP/3 加速节点,为后端应用提供低延迟的缓存和代理能力。
Apache代理缓存HTTP/3Jetson_Nano修改时间:2026-08-12 07:52:01