Я использую Vagrant для настройки виртуальной машины для тестирования. Я хотел бы, чтобы внутри виртуальной машины использовался прокси-сервер на хост-машине, чтобы разрешить кеширование всех загрузок для сохранения между экземплярами запущенной виртуальной машины не только для повышения скорости, но и для того, чтобы позволить мне запускать экземпляр бродяги, когда у меня есть нет соединения с интернетом.
Я настроил запущенный прокси-сервер, и я подумал, что сказал apt использовать его, установив это в скрипте Vagrant:
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'
И он работает частично, то есть первоначальные запросы источников попадают в кеш и работают, когда мое соединение Wi-Fi отключено, но Squid работает и имеет некоторые записи в его кеше. Я также вижу несколько запросов, попадающих в Squid из файла журнала Squids:
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, но не все из них, и особенно не фактические пакеты.
Несмотря на то, что ваша проблема может быть в конфигурации squid, чтобы ответить на тему, теперь есть vagrant-proxyconf плагин. Вы можете установить его через:
vagrant plugin install vagrant-proxyconf
С его помощью вы можете указать прокси Apt глобально в $HOME/.vagrant.d/Vagrantfile
без необходимости использовать средства обеспечения оболочки во всех файлах Vagrant для конкретного проекта.
Пример:
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
Возможно, что apt использует squid для всех своих запросов, но squid не кэширует результаты. Вы можете проверить это, прослушав трафик или выключив squid, пока apt загружает пакеты и проверяет, не сработают ли они. Какое значение maximum_object_size в вашей конфигурации squid?
Следующий вопрос, если вы настроили частную сеть, например:
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
линия.