HTTP/3是继HTTP/1.1、HTTP/2之后的第三代超文本传输协议,底层传输层从TCP切换为Google主导设计的QUIC协议,天然支持0-RTT握手、连接迁移和彻底的多路复用。Apache HTTP Server从2.4.x后期版本开始逐步跟进HTTP/3支持,同时它的反向代理与缓存模块组合一直是企业内网加速的经典方案。本文把这两者结合起来讲:用mod_proxy做反向代理转发,用mod_cache做边缘缓存,再通过QUIC监听让支持HTTP/3的浏览器直接受益。

一、Apache反向代理与缓存模块的工作原理
Apache的反向代理能力由mod_proxy提供,配合mod_proxy_http可以将请求转发给后端的Tomcat、Node.js或另一台应用服务器。但单纯转发并不减少后端压力,此时需要引入mod_cache模块做内容缓存。mod_cache本身是一个调度器,真正存储数据的后端有两个:mod_cache_disk把响应体写入磁盘文件,mod_cache_socache把缓存放进共享内存,前者适合大文件和重启后需要保留缓存的场景,后者读写延迟更低但受内存容量限制。
缓存命中判断依赖HTTP响应头中的Cache-Control、Expires、ETag、Last-Modified等字段。如果后端应用返回的响应没有携带任何缓存指示头,mod_cache默认不会缓存它,这一点是新手最常见的坑。你可以用CacheEnable disk /开启磁盘缓存路径,用CacheDetailHeader on让Apache在响应中添加X-Cache头,便于用curl观察命中情况。
此外还有一层容易被忽略的模块:mod_cache存储的是完整响应,而mod_file_cache、mod_mem_cache(2.4已移除)属于旧方案,迁移到2.4后请统一使用mod_cache系列,避免配置指令报错。
二、反向代理加磁盘缓存的完整配置示例
下面给出一份可直接落地的虚拟主机配置。前提是已启用相关模块:
a2enmod proxy proxy_http cache cache_disk headers rewrite systemctl restart apache2
核心虚拟主机配置如下,后端以一个运行在8080端口的应用为例:
<VirtualHost *:80>
ServerName www.ipipp.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
# 开启磁盘缓存,缓存根路径下所有内容
CacheEnable disk /
CacheRoot /var/cache/apache2/mod_cache_disk
CacheDirLevels 2
CacheDirLength 1
CacheMaxFileSize 50000000
CacheMinFileSize 100
# 对静态资源放宽缓存时长
<LocationMatch "\.(css|js|png|jpg|woff2)$">
CacheDefaultExpire 86400
</LocationMatch>
# 输出调试头,观察命中状态
CacheDetailHeader on
CacheHeader on
</VirtualHost>配置完成后,用curl -I http://www.ipipp.com/连续请求两次,第一次响应头里应出现X-Cache: MISS,第二次变为HIT。需要注意CacheRoot目录的属主必须是Apache运行用户(Ubuntu下是www-data,CentOS下是apache),否则会出现静默写入失败,日志里反复报cache store failed。
如果后端返回的是Set-Cookie头,mod_cache出于安全考虑默认不缓存这类响应。登录页、个性化内容本来也不该被缓存,可以通过CacheIgnoreHeaders Set-Cookie强制忽略,但只建议用在纯静态或全站同构的场景,否则会把用户A的会话缓存给用户B,造成严重的安全问题。
三、启用HTTP/3与QUIC监听
HTTP/3基于QUIC,QUIC运行在UDP协议上,所以防火墙除了放行TCP 443外还必须放行UDP 443。Apache对HTTP/3的支持依赖mod_http3模块,该模块目前需要单独编译安装。以Ubuntu为例,先安装编译依赖并拉取源码:
apt install build-essential libnghttp3-dev libngtcp2-dev \
libngtcp2-crypto-openssl-dev apache2-dev git
git clone --recursive https://github.com/net dirname mod_http3
cd mod_http3
./configure
make && make install编译成功后,在配置中加载模块并声明监听。Protocols指令可以同时列出h2和h3,Apache会通过Alt-Svc头告知浏览器可以在UDP 443上尝试QUIC连接,不支持的老浏览器自动回落到HTTP/2,这就是HTTP/3平滑升级的关键机制:
LoadModule http3_module modules/mod_http3.so
Protocols h3 h2 http/1.1
Listen 443 https
<VirtualHost *:443>
ServerName www.ipipp.com
Protocols h3 h2 http/1.1
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site.pem
SSLCertificateKeyFile /etc/ssl/private/site.key
# 代理与缓存配置与上文相同
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
CacheEnable disk /
CacheRoot /var/cache/apache2/mod_cache_disk
</VirtualHost>验证HTTP/3是否生效,Chrome可以打开chrome://flags确认QUIC已启用,再用开发者工具的Network面板查看协议列是否显示h3;命令行下也可以用支持QUIC的curl版本执行curl -I --http3 https://www.ipipp.com/。如果握手失败,优先排查UDP 443是否被云厂商安全组拦截,这是部署HTTP/3时排障率最高的问题。
四、性能表现与调优建议
缓存与HTTP/3的组合价值在于分层解决瓶颈:缓存层消除了重复的动态计算和网络回源,QUIC层优化了客户端到边缘节点的传输效率,尤其在移动网络切换基站时,QUIC的连接迁移可以避免TCP重建带来的几百毫秒卡顿。用wrk或hey对开启缓存前后的Apache做压测,通常静态化较好的页面QPS可以提升数倍,后端应用CPU占用明显下降。
调优方面建议关注三点:第一,CacheDirLevels和CacheDirLength控制磁盘缓存的目录散列深度,缓存文件超过十万级别时应适当增加层级;第二,配合htcacheclean工具定期清理过期缓存,命令如htcacheclean -p /var/cache/apache2/mod_cache_disk -l 1024M,把它放进cron即可防止磁盘被写满;第三,mod_http3仍在快速迭代,生产环境建议先让h2作为主力协议、h3作为灰度选项,通过Alt-Svc小流量验证稳定性后再全量放开。
最后提醒一点,HTTP/3要求TLS 1.3证书,且证书必须覆盖访问域名,自签证书在某些浏览器上会导致QUIC协商直接失败而静默回落,测试时建议使用正规签发的证书,避免误判为模块问题。按照以上步骤配置完成后,你就拥有了一套代理缓存加QUIC传输的高性能Apache前置层。
Apache代理缓存HTTP/3QUIC修改时间:2026-09-13 15:07:02