Vagrant 和 symfony2

Posted

技术标签:

【中文标题】Vagrant 和 symfony2【英文标题】:Vagrant and symfony2 【发布时间】:2013-08-04 11:54:30 【问题描述】:

我遇到了一个与在 vagrant 环境中安装 Symfony2 相关的奇怪问题。该环境已正确设置,并且正在运行一个 Web 服务器,该服务器正在从与 vagrant 环境共享的文件夹中提供文件,该文件夹位于 vagrant 的基本目录中。

基本上,vagrant 在目录 foo 中启动,然后在 foo 中,有一个名为 webroot 的目录。 Vagrant 自动共享 foo 目录。 Apache 服务器设置为运行,因此 webroot 是基本的 http 目录。这一切都很好,我能够提供基本的 htmlphpmysql 连接被测试很好。

我使用 composer 以推荐的方式安装 vagrant,安装到 /webroot/ 中名为 Symfony 的目录中。所有文件现在都存在于正确的目录中。配置是正确的,在 /config.php 中没有 Symfony 声称需要更改的项目。

当我尝试加载 /app_dev.php 时出现问题。它抛出一个异常,声称它无法在 /app 目录中创建名为 cache 的文件。

由于我正在使用的 vagrant box 不支持 chmod +a,我选择通过在 app_dev 中取消注释 umask(0000) 来设置权限。假设这是一个权限问题,我尝试使用 chmod 将 vagrant 环境和 osx 内的所有权限都调整为 777。

奇怪的是,当我在 vagrant 环境中对文件或目录进行 chmod 时,它声称正确设置了 777,但是当我 ls -l 时,权限并没有改变。但是,当我从 OUTSIDE Webroot 文件夹中的 vagrant 环境中对文件或目录进行 chmod 时,权限仍然存在。由于 symfony 在环境中没有 r/w 权限,它无法创建必要的缓存和日志文件。当我从 osx 的命令运行 symfony 时,一切正常。

有没有人知道如何更改 /webroot 目录的权限,以便 vagrant 环境中的东西实际上可以读取和写入它,因为 chmod 似乎不起作用?

【问题讨论】:

【参考方案1】:

更新于 2016 年 1 月 15 日。Vagrant 1.7.4+ 和 Symfony 3 的说明。有效。

在全新的 Ubuntu 14.04 安装中,ACL 已安装,但我无法使用 +a 或 setfacl 来修复权限问题,当然,一旦您在 vagrant 中更改终端中的任何权限,它们就会重置为vagrant:又是vagrant。

我在我的 vagrant 文件中添加了以下内容:

# Symfony needs to be able to write to it's cache, logs and sessions directory in var/
config.vm.synced_folder "./var", "/vagrant/var",
 :owner => 'vagrant',
 :group => 'www-data',
 :mount_options => ["dmode=775","fmode=666"]

这告诉 Vagrant 同步 var/logs 和 var/cache(不要与 /var/ 混淆,它们位于 Symfony 根目录中)并让它们归 vagrant:www-data 所有。这与执行sudo chown vagrant:www-data var/ 相同,只是 Vagrant 现在为您执行此操作并强制执行此操作,而不是强制执行 vagrant:vagrant。

注意这里没有 777 'hacks'

添加后,我在 apache 日志中没有再出现权限错误,而且我看到了一个漂亮的 Symfony 欢迎屏幕。我希望对某人有所帮助!

【讨论】:

非常感谢你拯救了我的一天。 @MuzafarAli 查看最后一个 vagrant 文档并搜索同步文件夹?也许他们在 1.9.3 中改变了你的做法?如果您发现任何内容,我很乐意接受对答案的补充或将其更改为“1.9.3:改为执行此操作”。通过粗略的搜索,我找不到任何 BC 破坏性 API 更改:-/ @Jimbo - 刚刚检查它现在工作正常.. 干杯!【参考方案2】:

我认为这是用户权利的问题。您的 apache + php 可能是由 root 启动的。您必须使用 root 设置权限。

两种可能:

sudo su
chmod -R 777 app/cache

sudo chown -v app/cache
sudo chmod -R 777 app/cache

您可能必须对日志文件执行相同的操作。

如果你需要的话,我的流浪文件:

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

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"  #Box Name
  config.vm.box_url = "http://files.vagrantup.com/precise64.box" #Box Location
  config.vm.provider :virtualbox do |virtualbox|
      virtualbox.customize ["modifyvm", :id, "--memory", "2048"]
  end
  config.vm.synced_folder ".", "/home/vagrant/synced/", :nfs => true
  #config.vm.network :forwarded_port, guest: 80, host: 8080 # Forward 8080 rquest to vagrant 80 port
  config.vm.network :private_network, ip: "1.2.3.4"
  config.vm.network :public_network
  config.vm.provision :shell, :path => "vagrant.sh"
end

vagrant.sh

#!/usr/bin/env bash

#VM Global Config
apt-get update

#Linux requirement
apt-get install -y vim git

#Apache Install
apt-get install -y apache2

#Apache Configuration
rm -rf /var/www
ln -fs /home/vagrant/synced/web /var/www
chmod -R 755 /home/vagrant/synced

#Php Install
apt-get install -y python-software-properties
add-apt-repository -y ppa:ondrej/php5
apt-get update

apt-get install -y php5 libapache2-mod-php5

#Php Divers
apt-get install -y php5-intl php-apc php5-gd php5-curl

#PhpUnit
apt-get install -y phpunit
pear upgrade pear
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony.com
pear install --alldeps phpunit/PHPUnit


#Php Configuration
sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 10M/" /etc/php5/apache2/php.ini
sed -i "s/short_open_tag = On/short_open_tag = Off/" /etc/php5/apache2/php.ini
sed -i "s/;date.timezone =/date.timezone = Europe\/London/" /etc/php5/apache2/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 1024M/" /etc/php5/apache2/php.ini
sed -i "s/_errors = Off/_errors = On/" /etc/php5/apache2/php.ini

#Reload apache configuration
/etc/init.d/apache2 reload

#Composer
php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"
mv -f composer.phar /usr/local/bin/composer.phar
alias composer='/usr/local/bin/composer.phar'

#Postgres
apt-get install -y postgresql postgresql-client postgresql-client php5-pgsql
su - postgres -c "psql -U postgres -d postgres -c \"alter user postgres with password 'vagrant';\""

【讨论】:

这不起作用。在 vagrant 环境中进行 Chmod-ing 或 Chowing,即使超级用户立即恢复并且即使命令成功执行,权限/所有权也不会更改。关于如何让 Chmod 或 Chown 命令持久化的任何见解。 想通了!问题是 fmode 和 dmode 设置不正确,因为 vagrant 文件夹安装在 vboxsf 上。我只是将行 config.vm.synced_folder "../gipsydanger/", "/vagrant", :extra => 'dmode=777,fmode=777' 添加到我的 Vagrantfile 中。还是谢谢! 我已经对这个答案进行了一些轻微的改进,并将其变成了一个随时可用的配置模块,尤其是与 Symfony2 一起使用。发布在Github @IsaacDiamondn 感谢您的评论!也为我工作。请注意::extra 参数已重命名为 :mount_options,因此该行应为 config.vm.synced_folder "www", "/var/www", :mount_options => ["dmode=777,fmode=777"] @pau.moreno 的建议对我有用,谢谢。【参考方案3】:

nfs 的更新答案:

config.vm.synced_folder "www", "/var/www", type:nfs, :nfs =>  :mount_options => ["dmode=777","fmode=777"] 

【讨论】:

【参考方案4】:

除了将缓存和日志文件夹的位置更改为 /tmp 之外,没有什么对我有用

AppKernel.php

public function getCacheDir()

    if (in_array($this->getEnvironment(), ['test','dev'])) 
        return '/tmp/sfcache/'.$this->getEnvironment();
    
    return parent::getCacheDir();


public function getLogDir()

    if (in_array($this->getEnvironment(), ['test','dev'])) 
        return '/tmp/sflogs/'.$this->getEnvironment();
    
    return parent::getLogDir();

【讨论】:

以上是关于Vagrant 和 symfony2的主要内容,如果未能解决你的问题,请参考以下文章

使用Vagrant在命令行快速创建虚拟机

vagrant初识

VirtualBox,Vagrant和Laravel Homestead“vagrant up”错误

基于 Vagrant 和 Ansible 搭建持续交付平台

vagrant 里面不能运行 docker,怎么回事

使用 Vagrant + VirtualBox 快速构建 CentOS 下的 Docker 环境