在Vagrant重新加载后,Apache无法启动

时间:2014-03-28 16:52:27

标签: apache centos vagrant

我正在尝试使用Vagrant设置一个简单的开发环境。基础盒(我创建的)具有带Apache和MySQL的CentOS 6.5 64位。

问题是,重新加载VM后,httpd服务无法在启动时启动(vagrant reloadvagrant halt,然后up。)

只有当我运行改变DocumentRoot的配置脚本并且仅在我第一次停止机器之后才会出现此问题。

更多信息:

httpd位于chkconfig级别2,3,4和5

没有错误写入error_log(/etc/httpd/logs)。

如果我进入机器并手动启动服务,则启动时没有问题。

我和其他CentOS盒子有同样的问题(比如vagrantcloud.com上的chef/centos-6.5),这就是我自己创建一个盒子的原因。

其他服务,比如mysql,启动正常,所以这是apache特有的问题。

恢复:

  • httpd总是在第一次启动时启动,即使使用配置脚本(如在vagrant destroy之后)
  • 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

我尝试使用所有者/群组rootapache创建流浪文件夹。两者都有同样的问题(与所有者vagrant一样)。

这些是我尝试过的配置脚本(bootstrap.sh)。我希望他们做的唯一事情是将DocumentRoot更改为vagrant文​​件夹。两者都没有。

尝试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 个答案:

答案 0 :(得分:17)

显然问题是由于Apache尝试启动时没有安装vagrant文​​件夹。虽然我仍然不明白为什么不会抛出任何错误。

我通过创建一个Upstart脚本(在文件夹/etc/init上)来解决它,以便在vagrant安装其文件夹后启动服务(它发出一个名为vagrant-mounted的事件)

这是我使用的脚本(文件名为httpd.conf,但我认为没必要)。

# start apache on vagrant mounted

start on vagrant-mounted

exec sudo service httpd start

Upstart可以做得更多,但这解决了它。

答案 1 :(得分:2)

首先,检查httpd是否为特定的运行级别(至少2-5)启动(你做过):

chkconfig | grep httpd

在这种情况下,您的DocumentRoot或其符号链接指向Vagrant synced folder可能与此相关,因此在启动服务期间它尚不可用。

解决方法是在shell配置脚本的末尾添加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身份运行您的shell,例如:

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

或者检查:Launching services after Vagrant mount使用upstart event Vagrant每次安装一个名为vagrant-mounted的同步文件夹时发出,因此我们可以修改upstart配置文件以获取依赖于Vagrant的服务synced文件夹,用于侦听并在发出vagrant-mounted事件后开始检查并重新启动服务。

答案 2 :(得分:0)

我确认上述^解决方案绝对有效。 我在vagrant-mounted.conf中添加了一个名为/etc/init的文件,其中包含:

start on vagrant-mounted
exec sudo sh /etc/startup.sh

我已添加的shell脚本/etc/startup.sh,作为手动启动httpd,mysqld和sendmail的方法,但需要在vagrant ssh之后通过vagrant up登录...现在它是自动的。太棒了!

答案 3 :(得分:0)

我的nginx没有启动Vagrant reload或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