Vagrant - 开机启动apache

5

我刚刚创建了一个新的虚拟机(基于ubuntu precise32),并安装了自己的软件,一切都很顺利,除了apache无法在启动时自动运行。

每次执行vagrant up后,我都需要登录到我的虚拟机并手动启动它。

我尝试过以下方法使其能够在启动时自动运行:

sudo update-rc.d apache2 defaults

但是我得到了:
System start/stop links for /etc/init.d/apache2 already exist.

因此,它应该开始... 这是我的Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
    config.vm.define :stilogo do |stilogo_config|
        stilogo_config.vm.box = "precise32"
        stilogo_config.vm.box_url = "http://files.vagrantup.com/precise32.box"
        stilogo_config.ssh.forward_agent = true

        #Do alla macchina un IP statico
        #stilogo_config.vm.network :private_network, ip: "192.168.56.101"

        stilogo_config.vm.network :forwarded_port, guest: 80, host: 8888, auto_correct: true
        stilogo_config.vm.network :forwarded_port, guest: 3306, host: 8889, auto_correct: true
        stilogo_config.vm.network :forwarded_port, guest: 5432, host: 5433, auto_correct: true
        stilogo_config.vm.hostname = "stilogo"
        stilogo_config.vm.synced_folder "www", "/var/www", {:mount_options => ['dmode=777','fmode=777']}
        stilogo_config.vm.provision :shell, :inline => "echo \"Europe/Rome\" | sudo tee /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata"

        stilogo_config.vm.provider :virtualbox do |v|
            v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
            v.customize ["modifyvm", :id, "--memory", "512"]
        end

        #Installo il software che mi serve
        stilogo_config.vm.provision :puppet do |puppet|
            puppet.manifests_path = "puppet/manifests"
            puppet.manifest_file = "phpbase.pp"
            puppet.module_path = "puppet/modules"
            #puppet.options = "--verbose --debug"
        end
    end
end

以下是 Apache 的安装步骤:

class apache 
{      
    package 
    { 
        "apache2":
            ensure  => present,
            require => [Exec['apt-get update'], Package['php5'], Package['php5-dev'], Package['php5-cli']]
    }

    service 
    { 
        "apache2":
            ensure      => running,
            enable      => true,
            require     => Package['apache2'],
            subscribe   => [
                File["/etc/apache2/mods-enabled/rewrite.load"],
                File["/etc/apache2/sites-available/000-default.conf"],
                File["/etc/apache2/conf-enabled/phpmyadmin.conf"]
            ],
    }

    file 
    { 
        "/etc/apache2/mods-enabled/rewrite.load":
            ensure  => link,
            target  => "/etc/apache2/mods-available/rewrite.load",
            require => Package['apache2'],
    }

    file 
    { 
        "/etc/apache2/sites-available/000-default.conf":
            ensure  => present,
            owner => root, group => root,
            source  => "/vagrant/puppet/templates/vhost",
            require => Package['apache2'],
    }

    exec 
    { 
        'echo "ServerName localhost" | sudo tee /etc/apache2/conf-enabled/fqdn.conf':
            require => Package['apache2'],
    }
}

这是在执行vagrant up和手动启动apache后的日志。
[Fri Dec 27 15:26:33.220448 2013] [mpm_prefork:notice] [pid 1379] AH00169: caught SIGTERM, shutting down
PHP Warning:  Module 'memcached' already loaded in Unknown on line 0
[Fri Dec 27 15:27:55.750639 2013] [mpm_prefork:notice] [pid 1105] AH00163: Apache/2.4.6 (Ubuntu) PHP/5.5.7-1+sury.org~precise+1 configured -- resuming normal operations
[Fri Dec 27 15:27:55.750700 2013] [core:notice] [pid 1105] AH00094: Command line: '/usr/sbin/apache2'

我错过了什么?


如果你查看日志,它是在尝试启动并失败了吗?还是根本没有尝试? - Doon
我已经在问题中添加了日志 - Christian Giupponi
我可以问一下,既然你已经将Apache定义为在运行级别上运行的Puppet服务,为什么还要启动它呢? - Jimmy Kane
因为当我启动我的机器时,无法使用apache工作,如果我尝试在浏览器中访问localhost:8888,它会显示无法联系服务器的消息。 如果我手动启动apache,它可以正常工作,也许我缺少某些东西或者我不太了解如何使用vagrant和puppet... - Christian Giupponi
4个回答

6
我希望您的Apache配置以某种方式引用由Vagrant挂载的文件夹中的文件(位于/vagrant目录中或由config.vm.synced_folder定义的那些)。在启动时,这些文件夹尚不可访问,因为Vagrant在启动机器后才会挂载它们。

我在这里提出了类似的问题:Apache fails to start on Vagrant。如果是这样的情况,那么也许我可以在那里找到答案。

1

首先执行:

sudo update-rc.d -f apache2 remove
sudo update-rc.d apache2 defaults

如cocheese所指出的。
检查您的运行级别:
runlevel

应该是"N 2"。因此,请检查符号链接是否正确:
cd /etc/rc2.d/ && ls -al *apache2*

如果您的输出类似于以下内容:
lrwxrwxrwx 1 root root 17 Sep 18 22:34 S18apache2 -> ../init.d/apache2

你很好。 "S" 很重要,而 "18" 可以根据系统依赖性在您的系统上升高或降低。
如果您想查看您的 apache2-init 脚本,请使用以下命令(将 "18" 替换为您自己的版本号):
cat /etc/rc2.d/S18apache2

你的rc.d没问题。

如果你重新启动虚拟机(例如通过´vagrant halt´和´vagrant up´),而你的apache2仍未运行,那么在引导时出现了错误。

只需添加此内容到你的Vagrantfile中以离开无头模式并查看GUI:

config.vm.provider :virtualbox do |vb|
  vb.gui = true
end

或者在您的虚拟机启动时安装bootlogd将服务消息记录到/var/log/boot。

apt-get install bootlogd

使用a标签:
cat /var/log/boot 

您可能会看到您的Apache2出现以下故障:

[...]
Thu Sep 18 23:16:12 2014: [....] Starting web server: apache2Warning: DocumentRoot [/vagrant/public] does not exist
Thu Sep 18 23:16:12 2014: Action 'start' failed.
Thu Sep 18 23:16:12 2014: The Apache error log may have more information.
[...]

您可以按照Ruslan Bes的建议解决此问题(链接在他的帖子中)。

在您的vagrantfile中进行如下修复:

config.vm.provision "shell", inline: "service apache2 restart", run: "always"

或者让您的虚拟机对Vagrant挂载事件进行反应: a)使用upstart包装脚本 b)使用udev规则

http://razius.com/articles/launching-services-after-vagrant-mount/

或者你可以将vhost更改为进入运行级别2时存在的目录。并在您的vagrantfile中将/vagrant挂载到该目录作为内联shell。


感谢您花时间解释如何找出重新加载后 Apache 未运行的步骤。我尝试使用 bootlog 和 gui 模式,但没有看到任何错误。Apache 在启动后就无法运行。我的 /etc/rc2.d/ 就像您描述的那样。 - Christof
好的,当没有错误时,Apache 应该正在运行。请确认它是否正在运行:ps aux | grep apache。如果未列出,则肯定存在日志中的错误 - 请重新检查。如果已列出,请使用 netstat -an | grep 80 检查其是否在端口 80 上可用。如果不在端口 80 下,则 Apache 可能会在启动时加载不同的配置,可能使用不同的端口。请检查您的配置。 - DanielaWaranie

0

只需在将被挂载的文件夹中创建index.html文件即可。

file { "/var/www/symfony/index.html":
    source => "/vagrant/provision/templates/index.html",
    owner => "www-data", group => "www-data",
    backup => true,
}

这里将使用/vagrant文件夹中的内容挂载到/var/www/symfony/文件夹中。


0

或许这可以帮到您

  1. sudo update-rc.d -f apache2 remove
  2. sudo update-rc.d apache2 defaults

然后重启系统


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接