Apache не запускается после перезагрузки Vagrant
Я пытаюсь настроить простую среду с Vagrant. Базовый блок (который я создал) имеет CentOS 6.5 64 бит с Apache и MySQL.
Проблема заключается в том, что служба httpd не запускается при загрузке после перезагрузки виртуальной машины (vagrant reload
или vagrant halt
, а затем up
).
Проблема возникает, когда я запускаю условие script, которое изменяет DocumentRoot
и только после первого раза останавливает машину.
Дополнительная информация:
httpd находится на chkconfig
на уровнях 2, 3, 4 и 5
Ошибки, записанные в error_log (на /etc/httpd/logs
), отсутствуют.
Если я зашел в машину и запустил сервис вручную, он начнет без проблем.
У меня была такая же проблема с другими блоками CentOS (например, chef/centos-6.5
, доступная на vagrantcloud.com), поэтому я сам создал ее.
Другие службы, такие как mysql, начинают нормально, поэтому это проблема, характерная для apache.
Резюмируя:
- httpd всегда запускается при первой загрузке, даже с предоставлением script (например, после уничтожения бродяг)
- httpd всегда запускается, когда я не запускаю условие script (но мне нужно его установить DocumentRoot)
- httpd не запускается после первой остановки, с условием script, которое бесполезно с 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
, чтобы принудительно перезапустить службу, но это должен быть ненужный шаг.
Что еще я могу попытаться решить? Спасибо.
Ответы
Ответ 1
Очевидно, проблема была связана с тем, что папка бродяг не монтируется, когда Apache пытается начать. Хотя я до сих пор не понимаю, почему не возникает ошибка.
Я решил это, создав Upstart script (в папке /etc/init
), чтобы запустить службу после того, как брандмауэр монтирует свою папку (она выдает событие под названием vagrant-mounted
)
Это script я использовал (с именем файла httpd.conf
, но я не думаю, что это необходимо).
# start apache on vagrant mounted
start on vagrant-mounted
exec sudo service httpd start
Upstart может сделать гораздо больше, но это решает его.
Ответ 2
Прежде всего, проверьте, нужно ли запускать httpd
для определенных уровней выполнения (не менее 2-5) с помощью (что вы сделали):
chkconfig | grep httpd
В этом случае может быть связано, что ваш DocumentRoot или его символическая ссылка указывает на Vagrant synced folder, поэтому он пока недоступен при запуске службы.
Обходным путем является добавление команды service start httpd
в конце подготовки оболочки script, например:
service httpd status || service httpd start
чтобы исправить его.
Для более пуленепробиваемого обходного пути добавьте его в функцию ловушки (для Bash script), например:
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"
или предоставить script, например:
config.vm.provision :shell, run: "always", path: "scripts/check_vm_services.sh"
Тогда script может выглядеть так:
#!/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, в котором используется событие upstart, который Vagrant испускает каждый раз, когда он монтирует синхронизированную папку, которая называется монтируемой на бок, поэтому мы можем изменить файл конфигурации выскочки для служб, которые зависят от синхронизированной папки Vagrant, чтобы слушать и запускать проверку и перезапускать службы после того, установленное событие.
Ответ 3
i подтверждают, что указанное выше решение абсолютно работает.
Я добавил файл с именем vagrant-mounted.conf
внутри /etc/init
, содержащий:
start on vagrant-mounted
exec sudo sh /etc/startup.sh
оболочка script /etc/startup.sh
я уже добавила в качестве средства ручного запуска httpd, mysqld и sendmail, но потребовалась регистрация через vagrant ssh
после vagrant up
, чтобы сделать это... теперь она автоматическая. здорово!
Ответ 4
Мой nginx не запускался при перезагрузке Vagrant или Vagrant, так что это мое решение:
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