Proxy

配置 apt 以在 vagrant box 中使用代理

  • December 1, 2015

我正在使用 Vagrant 設置虛擬機進行測試。我希望在虛擬機內部使用主機上的代理,以允許記憶體所有下載以在正在執行的虛擬機實例之間持續存在,這不僅是為了提高速度,而且還允許我在有時啟動 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,但不是所有請求,尤其是實際的包。

apt 可能對所有請求都使用 squid,但 squid 沒有記憶體結果。您可以通過嗅探流量來驗證這一點,或者在 apt 下載包時關閉 squid 並查看它們是否失敗。您的 squid 配置中的 maximum_object_size 是多少?

即使您的問題可能在 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

引用自:https://serverfault.com/questions/504442