Answers:
我对许多解决方案进行了研究,一些Ubuntu开发人员提出了适用于10.04及更高版本的代理配置(基于Squid)。叫做squid-deb-proxy
。它只需要一台机器即可充当服务器。大型组织通常运行自己的完整镜像,但是对于大多数人而言,按需镜像就足够了。
在要用作服务器的计算机上,使用以下工具安装该工具:
sudo apt-get install squid-deb-proxy avahi-utils
现在启动服务位:
sudo start squid-deb-proxy
和avahi位(如果您在12.04以上,则不需要此位):
sudo start squid-deb-proxy-avahi
这将安装代理服务器(默认情况下侦听端口8000)和该服务器通过zeroconf在网络上自我通告所需的avahi工具。
在您要使用缓存的每台计算机(客户端和服务器本身,以便也可以使用缓存)上,您需要安装客户端工具,让我们易于自动查找服务器,让它们单击此处。 :
或通过命令行:
sudo apt-get install squid-deb-proxy-client
可选:为了获得最高效率,您应该将一台计算机设置为自动下载更新,以便在其他计算机需要它时,它已经在缓存中。您可以通过以下方式执行此操作:转到“系统”->“管理”->“更新管理器”,然后单击“设置...”按钮,在“更新”选项卡中将其设置为自动下载所有更新。
默认情况下,缓存设置为仅缓存官方Ubuntu存储库。要添加更多内容,您需要将它们添加到来源列表中/etc/squid-deb-proxy/mirror-dstdomain.acl
。您可以在此处添加ppa.launchpad.net或可能使用的其他服务。对此文件进行更改后,必须运行sudo restart squid-deb-proxy
以使更改生效。
如果出于某种原因您不想使用zeroconf(出于网络原因或其他原因),则可以通过编辑/etc/apt/apt.conf
并添加以下节来手动将客户端设置为使用代理,(将0.0.0.0替换为服务器的IP地址) ):
Acquire {
Retries "0";
HTTP { Proxy "http://0.0.0.0:8000"; };
};
如果您使用的是防火墙,avahi会在地址224.0.0.0/4上使用5353,并要求使用如下规则:
# Specifically port 5353 which avahi uses
-A INPUT -i eth2 -d 224.0.0.0/4 --dport 5353 -j ACCEPT
# OR
# Wide open so all local broadcasting works
-A INPUT -i eth2 -d 224.0.0.0/4 -j ACCEPT
接下来,您需要打开TCP端口8000,以便通过代理进行实际通信。大概是这样的:
-A INPUT -i eth2 -p tcp -m tcp --dport 8000 -d 192.168.0.1 -s 192.168.0.0/24 --syn -j ACCEPT
这些规则只是为了帮助您。他们可能不会一对一地匹配您的设置。(即错误的接口,错误的专用网络IP地址等)
首先在服务器上添加日志,以便您查看:tail -F /var/log/squid-deb-proxy/access.log
然后在安装了客户端的任何计算机上运行更新;日志应开始滚动,如下所示:
1307310795.647 32 192.168.1.106 TCP_MISS/302 768 GET http://us.archive.ubuntu.com/ubuntu/dists/natty-proposed/universe/i18n/Translation-en.xz - DIRECT/141.210.26.10 text/html
1307310795.683 34 192.168.1.106 TCP_MISS/302 752 GET http://us.archive.ubuntu.com/ubuntu/dists/natty/main/i18n/Translation-en_US.lzma - DIRECT/141.210.26.10 text/html
1307310795.716 32 192.168.1.106 TCP_MISS/302 746 GET http://us.archive.ubuntu.com/ubuntu/dists/natty/main/i18n/Translation-en.lzma - DIRECT/141.210.26.10 text/html
1307310795.750 32 192.168.1.106 TCP_MISS/302 764 GET http://us.archive.ubuntu.com/ubuntu/dists/natty/multiverse/i18n/Translation-en_US.lzma - DIRECT/141.210.26.10 text/html
1307310795.784 32 192.168.1.106 TCP_MISS/302 758 GET http://us.archive.ubuntu.com/ubuntu/dists/natty/multiverse/i18n/Translation-en.lzma - DIRECT/141.210.26.10 text/html
1307310795.817 32 192.168.1.106 TCP_MISS/404 657 GET http://us.archive.ubuntu.com/dists/natty-proposed/multiverse/i18n/Translation-en_US.xz - DIRECT/141.210.26.10 text/html
这意味着客户端看到了缓存,但丢失了缓存,这是预期的,因为它尚未缓存任何内容。随后的每个运行都应显示为TCP_HIT。您可以在中找到鱿鱼缓存文件本身/var/cache/squid-deb-proxy
。
从那时起,网络上的所有计算机将在访问外部网络以获取软件包之前检查缓存。如果有新软件包可用,则第一台计算机将从网上下载该软件包,之后,对该软件包的后续请求将从服务器发送到客户端。
我们仍然需要使apt能够直接使用网络上的广告缓存,并且默认情况下是这样,因此您不需要安装客户端。我们还需要修复的bug是403的DEB不是在镜像列表。
apt.conf
下没有文件/etc/apt
。但是,有太多文件的设置位于下/etc/apt/apt.conf.d
。我想我们现在应该在那里创建文件了吗?
apt-cacher-ng
是我的答案-在较小的环境(大约20个客户端)中我没有遇到任何问题,因此我想@MagicFab提到的问题已在当前版本(安装在Ubuntu 10.04和10.10上)中解决。服务器不需要任何配置,您只需要指示客户端将服务器用作其程序包管理器代理即可。
通过安装软件包可以完全安装和配置服务器apt-cacher-ng
。
需要通过设置APT代理来配置客户端-通过添加/etc/apt/apt.conf.d/01proxy
包含该文件的文件(其中“ your-apt-server”是服务器的名称或IP地址):
Acquire::http { Proxy "http://your-apt-server:3142"; };
完成 -现在,无论您使用什么来源或使用什么系统版本,软件包都将由服务器缓存(例如,9.10、10.04和11.04客户端可以使用10.04服务器,而不会出现任何问题或冲突)。
如果您的客户端便携式计算机在网络之间漫游,它将变得更加复杂-我编写了一个脚本,该脚本根据网络地址设置正确的代理;该脚本是可执行文件,位于中/etc/network/if-up.d/apt-proxy
。从DHCP服务器接收到IPv4地址后,该脚本将为相应的网络设置正确的apt-cacher服务器:
#!/bin/sh
set -e
# Don't bother when lo is configured.
if [ "$IFACE" = lo ]; then
exit 0
fi
# Only run from ifup.
if [ "$MODE" != start ]; then
exit 0
fi
# currently only cares about IPv4
if [ "$ADDRFAM" != inet ] && [ "$ADDRFAM" != NetworkManager ]; then
exit 0
fi
# only run for DHCP-assigned addresses
if [ "$DHCP4_IP_ADDRESS" = "" ]; then
exit 0
fi
# we're matching on network *broadcast* address,
# not the specific IP address we were assigned
case "$DHCP4_BROADCAST_ADDRESS" in
10.3.141.255)
PROXY='Acquire::http::Proxy "http://my-home-server:3142";';
;;
192.168.154.255)
PROXY='Acquire::http::Proxy "http://work-server.foo.bar.example.com:3142";';
;;
# add as needed
*)
# unknown, no proxying
PROXY=""
;;
esac
# set the proxy
FNAME="/etc/apt/apt.conf.d/01proxy"
echo -n "$PROXY">$FNAME
exit 0
squid-deb-proxy
和squid-deb-proxy-client
:确实零配置意味着客户端零配置,这是游牧用户非常有用-在情况下,服务器不响应,客户端默认为直接下载。
pbuilder
。开箱即用。同样,它似乎在zeroconf
(2016年)中得到了支持,但是我(尚未)能够最终实现它。
最简单的解决方案之一是设置apt-proxy。
在此处阅读ubuntu文档:https : //help.ubuntu.com/community/AptProxy
我更喜欢使用该debmirror
实用程序设置本地镜像。
这是一个例子。
debmirror --progress --verbose --nosource --method=ftp --passive \
--host=ftp.osuosl.org --root=pub/ubuntu \
--dist=lucid,lucid-updates,lucid-security,lucid-backports \
--section=main,restricted,universe,multiverse --arch=amd64 \
/d2/ftp/mirror/ubuntu-lucid
我大约每周运行一次,并以此为基础来建立一个或多个“补丁级别”。例如...
cd /d2/ftp/mirror/
cp -al ubuntu-lucid ubuntu-lucid-20100908
这将创建树的链接副本(使用几乎零磁盘空间),我可以将每个本地服务器指向apt source.list中。
apt-cacher
它不是最简单的设置,并且无法在远程升级中幸免。
在客户端squid-deb-proxy
上的服务器squid-deb-proxy-client
上安装。它使用zeroconf Avahi,因此无需配置。
如果您想缓存的不仅仅是debs,我不会为Squid所困扰。Apache Traffic Server是下一件大事。 http://trafficserver.readthedocs.org