2013-08-03 55 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(); 
}