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_proxy
Nginx 配置文件
可以将以下内容保存为 /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
# 注意:普通源直接指向 /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 里的旧文件。
- 虽然索引可能不是最新的,但保证了客户端还能安装旧版本的软件,不会直接报错停止。
-
强制缓存 (proxy_ignore_headers):
- 默认情况下,APT 源的 HTTP 头可能包含
Cache-Control: max-age=0,Nginx 默认会遵守这个规则而不缓存。
- 使用
proxy_ignore_headers 强制忽略上游的指令,完全由 Nginx 的 proxy_cache_valid 控制缓存时间。
-
区分文件类型:
.deb 文件内容永远不会变(版本号固定),所以设为 30d (30 天) 甚至更久。
Packages/Release 索引文件每天都会变,所以设为 1h 且开启 revalidate,确保能及时获取更新。
-
安全源重写:
- 因为官方源分为
archive 和 security 两个域名,Nginx 作为一个 Server 块很难直接区分。
- 在客户端
sources.list 里人为构造了一个 /ubuntu-security/ 路径,Nginx 收到后将其 rewrite 并代理到正确的 security.ubuntu.com。