Я пытаюсь создать простую среду разработки с помощью Vagrant. Базовый блок (который я создал) имеет CentOS 6.5 64bit с Apache и MySQL.
Проблема в том, что служба httpd не запускается при загрузке после перезагрузки виртуальной машины (vagrant reload
или vagrant halt
, затем up
).
Проблема возникает только тогда, когда я запускаю сценарий обеспечения, который изменяет DocumentRoot
, и только после того, как я в первый раз останавливаю машину.
Больше информации:
Httpd находится на chkconfig
на уровнях 2, 3, 4 и 5
Нет ошибок, записанных в error_log (на /etc/httpd/logs
).
Если я подключусь к машине по ssh и запущу службу вручную, она запустится без проблем.
У меня была такая же проблема с другими модулями CentOS (например, chef/centos-6.5
, доступным на vagrantcloud.com), поэтому я создал его сам.
Другие службы, такие как mysql, запускаются нормально, так что это проблема, специфичная для apache.
Возобновление:
- httpd всегда запускается при первой загрузке, даже со сценарием обеспечения (например, после уничтожения бродяг)
- httpd всегда запускается, когда я не запускаю сценарий подготовки (но он мне нужен для установки DocumentRoot)
- httpd не запускается после первой остановки со сценарием подготовки, который мешает DocumentRoot (не уверен, что это проблема).
Это мой Vagrantfile:
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "centos64_lamp"
config.vm.box_url = "<url>/centos64_lamp.box"
config.vm.hostname = "machine.dev"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.synced_folder ".", "/vagrant", owner: "root", group: "root"
config.vm.provision :shell, :path => "vagrant_files/bootstrap.sh"
end
Я попытался создать бродячую папку с владельцем / группой root
и apache
. Та же проблема с обоими (как и с владельцем vagrant
).
Это сценарии подготовки (bootstrap.sh), которые я пробовал. Единственное, что я хочу, чтобы они сделали, это сменили DocumentRoot на бродячую папку. Ни то, ни другое не сработало.
Попробуй 1
#!/usr/bin/env bash
sudo rm -rf /var/www/html
sudo ln -fs /vagrant/app/webroot /var/www/html
Попробуй 2
#!/usr/bin/env bash
sudo cp /vagrant/vagrant_files/httpd.conf /etc/httpd/conf
sudo service httpd restart
При второй попытке httpd.conf будет равен значению по умолчанию, за исключением пути DocumentRoot. Эта вторая альтернатива позволяет мне выполнить vagrant up --provision
, чтобы принудительно перезапустить службу, но это не должно быть необходимым шагом.
Что еще я могу попробовать решить? Спасибо.
4 ответа
По-видимому, проблема связана с тем, что бродячая папка не монтируется при попытке запуска Apache. Хотя я до сих пор не понимаю, почему не выдается ошибка.
Я решил это, создав сценарий Upstart (в папке /etc/init
), чтобы запустить службу после того, как бродяга смонтирует свою папку (он генерирует событие под названием vagrant-mounted
)
Это сценарий, который я использовал (с именем файла httpd.conf
, но я не думаю, что это необходимо).
# start apache on vagrant mounted
start on vagrant-mounted
exec sudo service httpd start
Upstart может делать гораздо больше, но это решает проблему.
Прежде всего, проверьте, предполагается ли, что httpd
запускается для определенных уровней выполнения (как минимум 2–5) (что вы и сделали):
chkconfig | grep httpd
В этом случае это может быть связано с тем, что ваш DocumentRoot или его символическая ссылка указывает на синхронизированную папку Vagrant < / a>, поэтому он еще не доступен во время запуска службы.
Обходной путь - добавить команду service start httpd
в конец сценария подготовки оболочки, например:
service httpd status || service httpd start
Чтобы исправить это.
Для более надежного обходного пути добавьте его в функцию ловушки (для сценария Bash), например:
trap onerror 1 2 3 15 ERR
#--- onerror()
onerror() {
service httpd status || service httpd start
}
Этого может быть недостаточно, поэтому для его запуска в случаях остановки и запуска вам необходимо запустить оболочку как always
в вашем Vagrantfile
, например:
config.vm.provision :shell, run: "always", :inline => "service httpd status || service httpd start"
Или предоставьте сценарий, например:
config.vm.provision :shell, run: "always", path: "scripts/check_vm_services.sh"
Тогда сценарий может выглядеть так:
#!/usr/bin/env bash
# Script to re-check VM state.
# Run each time when vagrant command is invoked.
# Check if httpd service is running.
echo Checking services...
service httpd status || service httpd start
В качестве альтернативы проверьте: Запуск служб после монтирования Vagrant, который использует событие выскочки, которое Vagrant генерирует каждый раз, когда монтирует синхронизированную папку, которая называется vagrant-монтированием, поэтому мы можем изменить Файл конфигурации upstart для служб, которые зависят от синхронизированной папки Vagrant, чтобы прослушивать и запускать проверку и перезапускать службы после того, как сгенерировано событие, смонтированное бродягой.
Я подтверждаю, что вышеуказанное ^ решение абсолютно работает. я добавил файл с именем vagrant-mounted.conf
в /etc/init
, содержащий:
start on vagrant-mounted
exec sudo sh /etc/startup.sh
Сценарий оболочки /etc/startup.sh
, который я уже добавил, как средство ручного запуска httpd, mysqld и sendmail, но для этого требовался вход через vagrant ssh
после vagrant up
... теперь это происходит автоматически . большой!
Мой nginx не запускался при перезагрузке Vagrant или Vagrant up, так что это мое решение:
sudo cat > /etc/init/vagrant-mounted.conf << EOL
# start services on vagrant mounted
start on vagrant-mounted
exec sudo service php5-fpm restart
exec sudo service mysql restart
exec sudo service memcached restart
exec sudo service nginx restart
exec sudo nginx
EOL
Похожие вопросы
Связанные вопросы
Новые вопросы
apache
Используйте этот тег (вместе с соответствующим тегом языка программирования) для вопросов программирования, касающихся HTTP-сервера Apache. Не используйте этот тег для вопросов о других продуктах Apache Foundation. Обратите внимание, что вопросы конфигурации сервера обычно лучше подходят на https://serverfault.com