在 vagrant 中托管一个 mvc 应用程序

Posted

技术标签:

【中文标题】在 vagrant 中托管一个 mvc 应用程序【英文标题】:hosting an mvc app within vagrant 【发布时间】:2014-05-17 10:40:56 【问题描述】:

也许这只是因为它是一个星期五,它是在关闭时间之后,但我已经坚持了一个小时并且无法完全让它工作。我正在将 Vagrant 与我们正在构建的应用程序一起使用 - git repo 包含 Vagrantfile 和一个 Laravel 应用程序。我们有/deploy/tests/src 目录;实际的 Laravel 框架位于 /src。在我的本地机器上,我设置了一个 VirtualHost,让我可以通过浏览 localhost:9000 来访问应用程序:

Listen 8081
<VirtualHost *:8081>
    DocumentRoot "/Application/mamp/apache2/htdocs/myapp/src/public"
    ServerName localhost
    <Directory "/Application/mamp/apache2/htdocs/myapp/src/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

像魅力一样工作。所以我将相关位复制到我的 Vagrant 设置中:

Listen 8081
<VirtualHost *:8081>
    DocumentRoot "/var/www/src/public"
    ServerName localhost
    <Directory "/var/www/src/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

我的Vagrantfile 看起来像这样:

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

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "hashicorp/precise64"
    config.vm.provision :shell, :path => "vagrant/main.sh"
    config.vm.network "private_network", ip: "192.168.100.101", virtualbox__intnet: true
end

我的vagrant/main.sh 文件如下所示:

#!/usr/bin/env bash

apt-get update

echo mysql-server-5.5 mysql-server/root_password password notthepassword | debconf-set-selections
echo mysql-server-5.5 mysql-server/root_password_again password notthepassword | debconf-set-selections

apt-get install -y mysql-common mysql-server mysql-client

apt-get install -y apache2

apt-get install -y php5 libapache2-mod-php5
apt-get install -y php5-mysql php5-curl php-pear php5-imagick php5-mcrypt php5-memcache

apt-get install -y vim

a2enmod rewrite
sed -i -e 's/AllowOverride None/AllowOverride All/g' /etc/apache2/sites-available/default
cp /vagrant/vagrant/bgs /etc/apache2/sites-available
a2ensite bgs
/etc/init.d/apache2 restart

rm -rf /var/www
ln -fs /vagrant /var/www

一旦全部启动并运行,我就可以 ping 192.168.100.101。但它不提供任何 html - 如果我在 Chrome 中浏览到该地址,我会收到“未收到数据”错误。如果我去192.168.100.101:8081 Chrome 说它找不到地址。我怎样才能配置所有东西一起玩,让我克隆我的 repo,运行 vagrant up,然后浏览到 192.168.100.101:8081 并查看我的应用程序?

(另外:我什至在其中添加了一条端口转发行,从guest:8081host:8081。这产生了 HTTP 500 错误(“服务器遇到内部错误或配置错误,无法完成您的请求。 ")。不确定这是否有进展。

【问题讨论】:

【参考方案1】:

原来有很多事情同时发生:

我使用的是 Ubuntu 12 LTS,它有一个有点旧的 PHP 版本来运行 Laravel 的边缘版本。安装升级版的 PHP 解决了这个问题。 virtualbox__intnet 指令是...错误的。不知何故。将整个 Vagrantfile 行更改为:config.vm.network "private_network", :ip =&gt; "192.168.100.101", :auto_network =&gt; true 不同的端口,在各种符号链接目录与 apache 配置目录中混为一谈...不必要的复杂。

这是我的最终设置,以防其他人遇到这个确切的具体问题:

流浪文件:

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

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "puppetlabs/ubuntu-13.10-64-puppet"
    config.vm.provision :shell, :path => "vagrant/main.sh"
    config.vm.network "private_network", :ip => "192.168.100.101", :auto_network => true
end

main.sh:

#!/usr/bin/env bash

apt-get update

echo mysql-server-5.5 mysql-server/root_password password f6b6rWixbu99CtQ | debconf-set-selections
echo mysql-server-5.5 mysql-server/root_password_again password f6b6rWixbu99CtQ | debconf-set-selections

apt-get install -y mysql-common mysql-server mysql-client apache2 php5 libapache2-mod-php5 php5-mysql php5-curl php-pear php5-imagick php5-mcrypt php5-memcache php5-json

a2enmod rewrite
sed -i -e 's/AllowOverride None/AllowOverride All/g' /etc/apache2/sites-available/default
cp /vagrant/vagrant/app.conf /etc/apache2/sites-available
a2ensite app.conf

#fix for ubuntu 13.10: http://***.com/questions/19446679/mcrypt-not-present-after-ubuntu-upgrade-to-13-10
ln -s /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/mcrypt.ini
php5enmod mcrypt
#/fix

#json licensing snafu: http://***.com/questions/18239405/php-fatal-error-call-to-undefined-function-json-decode
php5enmod json
#/snafu

#may need to be done on the host OS, not the guest: http://***.com/questions/17954625/services-json-failed-to-open-stream-permission-denied-in-laravel-4
chmod -R 0777 /vagrant/src/app/storage

rm -rf /var/www
ln -fs /vagrant/src/public /var/www

/etc/init.d/apache2 restart

Apache 站点配置复制于:

<VirtualHost *:80>
    DocumentRoot "/var/www"
    ServerName localhost
    <Directory "/var/www">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

(顺便说一句,虽然这个配置看起来与默认的 apache 配置非常相似,但我发现为我正在处理的任何项目创建一个配置更容易,更可扩展,如果我需要扩展选项未来的项目,我可以。)

【讨论】:

以上是关于在 vagrant 中托管一个 mvc 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 MVC 应用程序区域文件夹中托管 bin 目录?

使用 jQuery - JSONP 从托管在 Vagrant VM 上的第三方 Node.js 服务器获取数据

如何在托管的 MVC 应用程序中获取 Azure AD 对象 ID?

csharp Vagrant - Ubuntu精确32,单声道3.28和南希托管示例

自托管 asp.net mvc

在 MVC Web 应用程序中托管 WCF 服务