Nginx 缓存 Ubuntu APT 源
apt 源代理缓存配置
要求
针对性缓存策略:对.deb安装包长久缓存,对Release/Packages索引文件短期缓存。源异常兜底 (Stale Cache):当上游官方源挂掉、超时或返回错误时,自动分发本地旧缓存,确保内网机器apt install不报错。并发锁:防止多个客户端同时请求同一个大文件时击穿缓存。
准备工作
在服务器上创建缓存目录并赋予权限(假设 Nginx 运行用户为 www-data):
mkdir -p /var/cache/nginx/apt_proxy
chown -R www-data:www-data /var/cache/nginx/apt_proxyNginx 配置文件
可以将以下内容保存为 /etc/nginx/conf.d/apt_proxy.conf。
此配置假设:
- Nginx 监听
8080端口(避免冲突)。 - 主要代理
archive.ubuntu.com和security.ubuntu.com。
应用配置
检查并重启 Nginx:
nginx -t
systemctl reload nginx客户端如何使用 (Client Side)
在需要使用代理的 Ubuntu 机器上,修改 /etc/apt/sources.list。
假设当前 Nginx 服务器 IP 是 192.168.1.100。
- 修改前 (原始):
deb http://archive.ubuntu.com/ubuntu/ jammy main restricted
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted- 修改后 (指向 Nginx):
# 注意:普通源直接指向 /ubuntu/
deb [arch=amd64] http://192.168.1.100:8080/ubuntu/ jammy main restricted universe multiverse
deb [arch=amd64] http://192.168.1.100:8080/ubuntu/ jammy-updates main restricted universe multiverse
# 注意:安全源指向 /ubuntu-security/ (对应 Nginx 配置中的 location)
deb [arch=amd64] http://192.168.1.100:8080/ubuntu-security/ jammy-security main restricted universe multiverse关键逻辑解释
-
兜底逻辑 (
proxy_cache_use_stale):- 这是最关键的一行。如果外网断了,或者 Ubuntu 官方源挂了,客户端请求
Packages.gz时,Nginx 会发现上游报错,于是直接返回 cache 里的旧文件。 - 虽然索引可能不是最新的,但保证了客户端还能安装旧版本的软件,不会直接报错停止。
- 这是最关键的一行。如果外网断了,或者 Ubuntu 官方源挂了,客户端请求
-
强制缓存 (
proxy_ignore_headers):- 默认情况下,APT 源的 HTTP 头可能包含
Cache-Control: max-age=0,Nginx 默认会遵守这个规则而不缓存。 - 使用
proxy_ignore_headers强制忽略上游的指令,完全由 Nginx 的proxy_cache_valid控制缓存时间。
- 默认情况下,APT 源的 HTTP 头可能包含
-
区分文件类型:
.deb文件内容永远不会变(版本号固定),所以设为30d(30 天) 甚至更久。Packages/Release索引文件每天都会变,所以设为1h且开启revalidate,确保能及时获取更新。
-
安全源重写:
- 因为官方源分为
archive和security两个域名,Nginx 作为一个 Server 块很难直接区分。 - 在客户端
sources.list里人为构造了一个/ubuntu-security/路径,Nginx 收到后将其rewrite并代理到正确的security.ubuntu.com。
- 因为官方源分为