在 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:8081
到host:8081
。这产生了 HTTP 500 错误(“服务器遇到内部错误或配置错误,无法完成您的请求。 ")。不确定这是否有进展。
【问题讨论】:
【参考方案1】:原来有很多事情同时发生:
我使用的是 Ubuntu 12 LTS,它有一个有点旧的 PHP 版本来运行 Laravel 的边缘版本。安装升级版的 PHP 解决了这个问题。virtualbox__intnet
指令是...错误的。不知何故。将整个 Vagrantfile
行更改为:config.vm.network "private_network", :ip => "192.168.100.101", :auto_network => 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?