配置 apt 在 vagrant box 中使用代理

配置 apt 在 vagrant box 中使用代理

我正在使用 Vagrant 设置虚拟机进行测试。我希望虚拟机中的 apt 使用主机上的代理,以便缓存所有下载,以便在运行的虚拟机实例之间持久保存,这不仅可以提高速度,还可以让我在没有互联网连接时启动 vagrant 实例。

我已经设置了正在运行的代理,并且我认为我已经通过在 Vagrant 脚本中设置来告诉 apt 使用它:

config.vm.provision :shell, :inline => 'echo \'Acquire { Retries "0"; HTTP { Proxy "http://10.0.2.2:3128"; }; };\' >> /etc/apt/apt.conf'
config.vm.provision :shell, :inline => 'echo \'Acquire { Retries "0"; FTP { Proxy "ftp://10.0.2.2:3128"; }; };\' >> /etc/apt/apt.conf'
config.vm.provision :shell, :inline => 'echo \'Acquire { Retries "0"; HTTPS { Proxy "https://10.0.2.2:3128"; }; };\' >> /etc/apt/apt.conf'

并且它部分工作,即当我的 wifi 连接被禁用但 Squid 正在运行且其缓存中有一些条目时,对源的初始请求命中缓存并工作。我还可以从 Squids 日志文件中看到一些命中 Squid 的请求:

1367492453.816     34 127.0.0.1 TCP_REFRESH_MODIFIED/200 592 GET http://security.ubuntu.com/ubuntu/dists/precise-security/Release.gpg - DIRECT/91.189.92.181 -
1367492453.987    168 127.0.0.1 TCP_REFRESH_MODIFIED/200 49973 GET http://security.ubuntu.com/ubuntu/dists/precise-security/Release - DIRECT/91.189.92.181 -
1367492453.999    325 127.0.0.1 TCP_MISS/404 588 GET http://us.archive.ubuntu.com/ubuntu/dists/precise/InRelease - DIRECT/91.189.91.13 text/html
1367492454.113    114 127.0.0.1 TCP_MISS/404 596 GET http://us.archive.ubuntu.com/ubuntu/dists/precise-updates/InRelease - DIRECT/91.189.91.13 text/html

但是,下载的大部分软件包都没有被缓存,而且似乎根本没有经过 Squid,也就是说,我可以看到下载时大量的网络使用量,但它们并没有出现在 Squid 访问日志中。

所以我的问题是如何配置 Apt 以使用代理来处理所有请求?

顺便说一句,我也尝试通过设置环境变量进行配置http_proxy

 config.vm.provision :shell, :inline => "echo 'export http_proxy=http://10.0.2.2:3128' >> /etc/profile.d/proxy.sh"

这具有相同的效果 - 一些请​​求似乎击中了 Squid,但不是全部,特别是不是实际的包。

答案1

apt 可能正在使用 squid 处理所有请求,但 squid 不会缓存结果。您可以通过嗅探流量或在 apt 下载软件包时关闭 squid 并查看是否失败来验证这一点。您的 squid 配置中的 maximum_object_size 是多少?

答案2

即使你的问题可能出在 squid 配置上,但为了回答这个问题,现在vagrant-proxyconf插件。您可以通过以下方式安装:

vagrant plugin install vagrant-proxyconf

有了它,您可以在全局指定 Apt 代理,而$HOME/.vagrant.d/Vagrantfile无需在所有项目特定的 Vagrantfile 中使用 shell 配置程序。

例子:

Vagrant.configure("2") do |config|
  config.apt_proxy.http  = "http://10.0.2.2:3128"
  config.apt_proxy.https = "http://10.0.2.2:3128"
end

或默认代理配置:

Vagrant.configure("2") do |config|
  if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.http     = "http://192.168.0.2:3128"
    config.proxy.https    = "http://192.168.0.2:3128"
    config.proxy.no_proxy = "localhost,127.0.0.1,.example.com"
  end
  # ... other stuff
end

答案3

根据标题问题,如果您有私人网络设置,例如:

config.vm.network "private_network", ip: "192.168.22.22"
config.vm.provision "shell", path: "scripts/provision.sh"

http_proxy我发现通过简单地导出配置脚本来设置代理很容易,例如:

# Detect proxy.
GW=$(netstat -rn | grep "^0.0.0.0 " | cut -d " " -f10)
curl -s localhost:3128 > /dev/null && export http_proxy="http://localhost:3128"
curl -s $GW:3128       > /dev/null && export http_proxy="http://$GW:3128"

然后apt-get照常运行。

这应该会检测您本地主机或主机本身上的 squid 代理。

为了增加maximum_object_size价值,示例如下:

maximum_object_size 64 MB

需要cache_dir在行前定义。

相关内容