Vagrant和Symfony2

13
我在使用vagrant环境中安装Symfony2时遇到了一些奇怪的问题。环境已经正确设置,正在运行一个web服务器,它正在服务于一个与vagrant共享的文件夹,该文件夹位于vagrant的基本目录中。
实际上,vagrant是在foo目录中启动的,然后在foo目录中有一个名为webroot的目录。Vagrant自动分享foo目录。设置了一个apache服务器以使webroot成为基本的http目录。这一切都很好地工作着,我可以提供基本的HTML、PHP文件,MySQL连接也测试过了,没问题。
我使用Composer按照推荐的方式安装了vagrant,安装到了/webroot/内的一个名为Symfony的目录。所有的文件现在都存在于正确的目录中。配置是正确的,在/config.php中没有Symfony声称需要更改的内容。
问题出现在我试图加载/app_dev.php时。它抛出一个异常,声称无法在/app目录中创建一个名为cache的文件。
因为我使用的vagrant环境不支持chmod +a,所以我选择通过取消注释app_dev中的umask(0000)来设置权限。假设这是一个权限问题,我尝试在vagrant环境中和osx中使用chmod将权限调整为777。
奇怪的是,当我在vagrant环境中对一个文件或目录进行chmod时,它声称正确地设置了777,但是当我运行ls -l时,权限没有变化。然而,当我从vagrant环境之外的webroot文件夹中对一个文件或目录进行chmod时,权限会保持不变。因为Symfony在环境中没有读写权限,所以它无法创建必要的缓存和日志文件。当我从osx的命令中运行Symfony时,一切都很顺利。
有人知道如何更改/webroot目录的权限,以便vagrant环境内的东西可以实际读写它,因为chmod似乎不起作用吗?
4个回答

15

截至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“黑客攻击”

只要我添加了这个,apache日志中就不再出现权限错误,并且我得到了一个漂亮的Symfony欢迎屏幕。我希望这可以帮助某些人!


2
非常感谢,你救了我的一天。 - Farid Movsumov
@MuzafarAli 看看最新的vagrant文档并搜索同步文件夹?也许他们在1.9.3中改变了做法?如果你找到了什么,我很乐意接受对答案的补充或更改为“1.9.3:改为这样做”。从粗略的搜索来看,我找不到任何破坏API兼容性的变化 :-/ - Jimbo
@Jimbo - 刚刚检查了一下,现在运行良好。干杯! - Muzafar Ali

5

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

有两种可能:

sudo su
chmod -R 777 app/cache

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

你可能需要对日志文件执行相同的操作。

如果需要,这是我的 Vagrant 文件:

# -*- 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或Chown操作,即使作为超级用户立即还原,权限/所有权也不会改变,尽管命令成功执行。有没有什么见解可以让Chmod或Chown命令持久化。 - Isaac Diamond
4
搞定了!问题在于fmode和dmode设置不正确,因为vagrant文件夹被挂载到了vboxsf上。我只需在Vagrantfile中添加以下行:config.vm.synced_folder "../gipsydanger/", "/vagrant", :extra => 'dmode=777,fmode=777'。无论如何,还是谢谢你! - Isaac Diamond
我已经采用了这个答案并进行了一些改进,将其制作成一个可立即使用的配置模块,特别适用于Symfony2。我在Github上发布了它。 - Lukx
10
谢谢评论!对我也有帮助。只是需要注意::extra参数已更名为:mount_options,所以这一行应该是 config.vm.synced_folder "www", "/var/www", :mount_options => ["dmode=777,fmode=777"] - pau.moreno
@pau.moreno的建议对我有用,谢谢。 - mulkave
今天我学到了阅读注释的重要性。非常感谢! - JohnnyQ

3

关于nfs的更新答案:

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

1

除了将缓存和日志文件夹的位置更改为 /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();
}

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