我正在尝试使用Vagrant设置一个简单的开发环境。基础盒(我创建的)具有带Apache和MySQL的CentOS 6.5 64位。
问题是,重新加载VM后,httpd服务无法在启动时启动(vagrant reload
或vagrant halt
,然后up
。)
只有当我运行改变DocumentRoot
的配置脚本并且仅在我第一次停止机器之后才会出现此问题。
httpd位于chkconfig
级别2,3,4和5
没有错误写入error_log(/etc/httpd/logs
)。
如果我进入机器并手动启动服务,则启动时没有问题。
我和其他CentOS盒子有同样的问题(比如vagrantcloud.com上的chef/centos-6.5
),这就是我自己创建一个盒子的原因。
其他服务,比如mysql,启动正常,所以这是apache特有的问题。
这是我的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更改为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
强制重新启动服务,但这应该是不必要的步骤。
我还能尝试解决这个问题吗?谢谢。
答案 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