squid 和 dnf/yum 下载的缓存

squid 和 dnf/yum 下载的缓存

抱歉,这是新手的问题。我先试着描述一下情况,然后再问鱿鱼的问题。

当前 Fedora/Centos 安装在其常规配置文件 /etc/yum.repos.conf 中有一个如下所示的 metalink。

metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch

此 metalink 实际上使 yum/dnf 选择一个“随机”服务器站点(由服务器根据 metalink 客户端的位置按世界区域随机选择)。
这也用于在下载速度缓慢的情况下切换到下一个更好的站点。

我注意到由于 docker 构建了大量的下载,所以我正在考虑所有机器都必须使用的 squid 代理。但是 yum/dnf 的这种“随机”策略让我担心。我确实理解 fedora/centos 分散这些免费存储库负载的意图,所以实际上我不想破坏这一策略

squid 能否以某种方式智能地检测到客户端只是使用了“另一个 fedora/centos repo url”并智能地缓存它?metalink 列表本身似乎相当稳定(它只是在被询问时改变顺序,但列表本身似乎是一样的)。

意图:不要存储同一个文件的 1000 份副本,仅仅因为它来自不同的服务器。

我该如何用鱿鱼来做到这一点?

编辑:有人有使用这个的经验吗http://wiki.squid-cache.org/Features/StoreID用于缓存 dnf/yum?

答案1

回答我自己的问题。发现 squid 支持使用 storeid_file_rewrite 脚本处理此类问题。唯一棘手的事情是获取代表相同存储库的有效 URL 列表。到目前为止似乎运行良好。

在 squid.conf 中添加以下内容

store_id_program /usr/lib64/squid/storeid_file_rewrite /etc/squid/fedora.db
store_id_access allow localnet
store_id_access deny all

要获取 fedora.db 的内容(此时缓存 fedora 25),需要从镜像列表中获取 url 的一些技巧

basearch="x86_64"
releasever=25
mirrorlist="https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearc
curl -s "$mirrorlist" >tmp.db

您需要将“tmp.db”结果中的“url”转换为此处说明的格式http://wiki.squid-cache.org/Features/StoreID/DB。这可能可以自动化(有志愿者吗?)

然后你会得到类似“fedora.db”的东西,它在上面的squid.conf中使用。

^http:\/\/ftp\.halifax\.rwth-aachen\.de\/fedora\/linux\/releases\/25\/Everything\/(x86_64\/[a-zA-Z0-9\-\_\.\/]+rpm)$    http://repo.mirrors.squid.internal/fedora/25/$1
^http:\/\/mirror2\.hs-esslingen\.de\/fedora\/linux\/releases\/25\/Everything\/(x86_64\/[a-zA-Z0-9\-\_\.\/]+rpm)$        http://repo.mirrors.squid.internal/fedora/25/$1
^http:\/\/fedora\.tu-chemnitz\.de\/pub\/linux\/fedora\/linux\/releases\/25\/Everything\/(x86_64\/[a-zA-Z0-9\-\_\.\/]+rpm)$      http://repo.mirrors.squid.internal/fedora/25/$1

... much more

编辑:另外,一条更危险的道路,但也许也足够了,一个更全局的模式匹配,就像这样:

\/fedora\/linux\/releases\/([0-9]+)\/Everything/x86_64\/(.*)$   http://repo.mirrors.squid.internal/fedora/releases/$1/$2
\/fedora\/linux\/updates\/([0-9]+)\/x86_64\/(.*)$       http://repo.mirrors.squid.internal/fedora/updates/$1/$2

来源

答案2

您可以考虑使用 baseurl,如下所建议:http://serverascode.com/2014/03/29/squid-cache-yum.html

因此使用:

baseurl=http://mirror.fedoraproject.org/fedora/$releasever/os/$basearch/

代替:

metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch

通过使事情变得不那么动态,这可以避免 metalink 出现的问题。

如果您要使用 baseurl,我怀疑实现您想要做的事情的另一种方法是使用 apache 或 nginx(我会选择 nginx)作为 repo 镜像的反向代理。

除非您要将 squid 用于其他目的,否则我认为我实际上可能倾向于将 nginx 设置为本地镜像,而不是使用互联网镜像作为后端/上游。

相关内容