Apache no se inicia después de la recarga de Vagrant
centos (4)
Mi nginx no se estaba iniciando en Vagrant reload o Vagrant up, así que esta es mi solución:
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
Estoy tratando de configurar un entorno de desarrollo simple con Vagrant. El cuadro base (que creé) tiene CentOS 6.5 de 64 bits con Apache y MySQL.
El problema es que el servicio httpd no se inicia al arrancar después de volver a cargar la VM ( vagrant reload
vagrant halt
o vagrant halt
).
El problema solo ocurre cuando ejecuto un script de aprovisionamiento que altera el DocumentRoot
y solo después de la primera vez que detengo el equipo.
Más información:
httpd está en chkconfig
en los niveles 2, 3, 4 y 5
No hay errores escritos en error_log (en /etc/httpd/logs
).
Si entro en la máquina y comienzo el servicio manualmente, comienza sin problemas.
Tuve el mismo problema con otras cajas de CentOS (como el chef/centos-6.5
disponible en vagrantcloud.com), es por eso que creé una.
Otros servicios, como mysql, comienzan bien, por lo que es un problema específico de apache.
Reanudando
- httpd siempre comienza en el primer arranque, incluso con el script de provisión (como después de la destrucción de vagabundo)
- httpd siempre comienza cuando no ejecuto un script de provisión (pero lo necesito para configurar DocumentRoot)
- httpd no se inicia después del primer alto, con un script de aprovisionamiento que estropea DocumentRoot (no estoy seguro si ese es el problema).
Este es mi archivo Vagrant:
# -*- 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
Traté de crear la carpeta vagabunda con propietario / grupo root
y apache
. Mismo problema con ambos (como con el propietario vagrant
).
Estas son las secuencias de comandos de provisión (bootstrap.sh) que probé. Lo único que quiero que hagan es cambiar el DocumentRoot a la carpeta vagabunda. Ninguno funcionó.
Prueba 1
#!/usr/bin/env bash
sudo rm -rf /var/www/html
sudo ln -fs /vagrant/app/webroot /var/www/html
Prueba 2
#!/usr/bin/env bash
sudo cp /vagrant/vagrant_files/httpd.conf /etc/httpd/conf
sudo service httpd restart
El httpd.conf en el segundo intento es igual al predeterminado, a excepción de la ruta de DocumentRoot. Esta segunda alternativa me permite hacer un vagrant up --provision
para forzar el reinicio del servicio, pero eso debería ser un paso innecesario.
¿Qué más puedo intentar resolver esto? Gracias.
Aparentemente, el problema se debió a que la carpeta vagabunda no se montó cuando Apache intenta comenzar. Aunque todavía no entiendo por qué no se produce ningún error.
Lo resolví creando un script Upstart (en la carpeta /etc/init
) para iniciar el servicio después de que vagrant monta su carpeta (emite un evento llamado vagrant-mounted
)
Este es el script que utilicé (con el nombre de archivo httpd.conf
pero no creo que sea necesario).
# start apache on vagrant mounted
start on vagrant-mounted
exec sudo service httpd start
Upstart puede hacer mucho más pero esto lo resuelve.
Confirmo que la solución anterior ^ funciona absolutamente. vagrant-mounted.conf
un archivo llamado vagrant-mounted.conf
dentro de /etc/init
, que contiene:
start on vagrant-mounted
exec sudo sh /etc/startup.sh
el guión de shell /etc/startup.sh
ya había agregado, como medio para iniciar manualmente httpd, mysqld y sendmail, pero era necesario iniciar sesión vía vagrant ssh
después de vagrant up
hacerlo ... ahora es automático. ¡estupendo!
En primer lugar, compruebe si httpd
supone que debe iniciarse para niveles de ejecución específicos (al menos 2-5) por (lo que hizo):
chkconfig | grep httpd
En ese caso, puede estar relacionado con que su DocumentRoot o su enlace simbólico apunta a la carpeta sincronizada Vagrant , por lo que aún no está disponible durante el inicio del servicio.
La solución alternativa es agregar el comando service start httpd
al final de la secuencia de comandos de suministro de shell, por ejemplo:
service httpd status || service httpd start
para arreglarlo
Para obtener más solución a prueba de balas, agréguela a la función de captura (para el script de Bash), por ejemplo:
trap onerror 1 2 3 15 ERR
#--- onerror()
onerror() {
service httpd status || service httpd start
}
Esto puede no ser suficiente, por lo que para que comience en casos de detención y recuperación, debe ejecutar su shell como always
en su Vagrantfile
, por ejemplo:
config.vm.provision :shell, run: "always", :inline => "service httpd status || service httpd start"
o proporcionar una secuencia de comandos, por ejemplo:
config.vm.provision :shell, run: "always", path: "scripts/check_vm_services.sh"
Entonces, el script puede verse así:
#!/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
Alternativamente, compruebe: Lanzando servicios después del montaje Vagrant que usa el evento advenedizo que Vagrant emite cada vez que monta una carpeta sincronizada que se llama vagrant-mounted, para que podamos modificar el archivo de configuración advenedizo para servicios que dependen de la carpeta sincronizada Vagrant para escuchar y comenzar compruebe y reinicie los servicios después de que se emita el evento montado en vagabundo.