2013-08-03 127 views
12

我有一个bizzare问题涉及从流浪环境中安装Symfony2。环境设置正确,正在运行一个Web服务器,该服务器通过与位于vagrant基本目录中的流浪环境共享的文件夹提供文件。流浪和symfony2

基本上,vagrant是在foo目录中启动的,然后在foo中有一个名为webroot的目录。 Vagrant自动共享foo目录。 apache服务器设置为运行,以便webroot是基本的http目录。这一切工作正常,我能够提供基本的HTML,PHP和MySQL连接测试无误。

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

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

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

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

有没有人有任何有关如何更改/ webroot目录的权限,以便流浪环境中的内容可以实际读取和写入,因为chmod似乎不起作用?

回答

5

我认为这是一个用户权限问题。你的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';\"" 
+0

这这么想的其他工作。即使命令成功执行,即使超级用户立即恢复并且权限/所有权不会改变,也可以在流浪环境中进行Chmod或Chowning。深入了解如何获取Chmod或Chown命令。 –

+4

想通了!问题在于fmode和dmode设置不正确,因为vagrant文​​件夹被挂载在vboxsf上。我只是在我的流浪文件中加入了'config.vm.synced_folder“../gipsydanger/”,“/ vagrant”,:extra =>'dmode = 777,fmode = 777''这一行。不管怎么说,还是要谢谢你! –

+0

我已经采取了一些这个答案略有增强,并使其成为一个随时可用的供应模块,特别是与Symfony2一起使用。发布于[Github](https://github.com/Lukx/vagrant-lamp) – Lukx

3

一个更新的NFS答案:

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

更新为2016年1月15日的。Vagrant 1.7.4+和Symfony 3的说明。这工作。

在一个新鲜的Ubuntu 14.04安装,ACL已安装,但我不能使用+一个或setfacl的修复权限问题,当然,只要你在流浪者改变终端的任何权限,它们重新设置为流浪者:再次流浪。

添加以下到我的无业游民文件:

# 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"] 

这告诉流浪同步无功/日志和VAR /缓存(不要与在/ var /混淆,这些都是在根的Symfony目录),并让他们拥有vagrant:www-data。这与做sudo chown vagrant:www-data var/是一样的,除了Vagrant现在为你做,并强制执行,而不是强制流浪:vagrant。

请注意,这里没有777'hacks'

只要我补充一点,我没有在apache日志中得到更多的权限错误,并且我得到了一个很好的Symfony欢迎屏幕。我希望能帮助别人!

+2

非常感谢你拯救了我的一天。 –

+0

它在“流浪1.9.3”中对我无效.. –

+0

@MuzafarAli看最后一个流浪汉文档并搜索同步文件夹?也许他们在1.9.3中改变了你的做法?如果你发现任何东西,我很乐意接受增加的答案或改变它为“1.9.3:做这个,而不是”。从粗略的搜索中,我找不到任何BC打破API的变化: -/ – Jimbo

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(); 
}