Я пытаюсь создать простую среду разработки с помощью 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, чтобы принудительно перезапустить службу, но это не должно быть необходимым шагом.

Что еще я могу попробовать решить? Спасибо.

14
Zé Cipriano 28 Мар 2014 в 20:52

4 ответа

Лучший ответ

По-видимому, проблема связана с тем, что бродячая папка не монтируется при попытке запуска Apache. Хотя я до сих пор не понимаю, почему не выдается ошибка.

Я решил это, создав сценарий Upstart (в папке /etc/init), чтобы запустить службу после того, как бродяга смонтирует свою папку (он генерирует событие под названием vagrant-mounted)

Это сценарий, который я использовал (с именем файла httpd.conf, но я не думаю, что это необходимо).

# start apache on vagrant mounted

start on vagrant-mounted

exec sudo service httpd start

Upstart может делать гораздо больше, но это решает проблему.

17
Zé Cipriano 31 Мар 2014 в 18:00

Прежде всего, проверьте, предполагается ли, что 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, чтобы прослушивать и запускать проверку и перезапускать службы после того, как сгенерировано событие, смонтированное бродягой.

3
kenorb 22 Мар 2016 в 19:39

Я подтверждаю, что вышеуказанное ^ решение абсолютно работает. я добавил файл с именем 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 ... теперь это происходит автоматически . большой!

0
kris-o3 24 Апр 2014 в 19:25

Мой 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
0
ethanneff 5 Май 2015 в 23:57