2013-08-03 13 views
12

Sto avendo una specie di problema bizzarro relativo all'installazione di Symfony2 da un ambiente vagabondo. L'ambiente è impostato correttamente e sta eseguendo un server Web che sta servendo i file da una cartella che è condivisa con l'ambiente vagabondo che si trova nella directory di base di vagabondo.Vagrant e symfony2

Fondamentalmente, il vagabondo viene avviato nella directory foo e quindi all'interno di foo, c'è una directory chiamata webroot. Vagrant condivide automaticamente la directory foo. Un server Apache è configurato per l'esecuzione in modo che webroot sia la directory http di base. Funziona tutto bene e sono in grado di servire HTML di base, PHP e la connessione MySQL è stata testata per essere valida.

Ho usato il compositore per installare vagamente il modo consigliato, nella directory interna/webroot/chiamata Symfony. Tutti i file ora esistono all'interno della directory corretta. La configurazione è corretta e non ci sono elementi che richieste da Symfony devono essere modificati in /config.php.

Il problema arriva quando provo a caricare /app_dev.php. Genera un'eccezione sostenendo che non è possibile creare un file denominato cache nella directory/app.

Poiché chmod + a non è supportato nella casella vagabonda che sto usando, ho scelto di impostare le autorizzazioni decompressando umask (0000) in app_dev. Supponendo che fosse un problema di autorizzazione, ho provato a usare chmod per regolare i permessi sia all'interno dell'ambiente vagabondo che all'interno di osx a 777 per tutto.

Ciò che è strano è che quando chmod un file o una directory all'interno dell'ambiente vagabondo, afferma di impostare correttamente 777, ma quando I ls -l, le autorizzazioni non sono cambiate. Tuttavia, quando chmod un file o una directory da OUTSIDE L'ambiente vagabondo all'interno della cartella webroot, le autorizzazioni persistono. Poiché symfony non dispone di autorizzazioni r/w nell'ambiente, non è in grado di creare la cache e i file di registro necessari. Quando eseguo symfony dal comando di osx, tutto funziona correttamente.

Qualcuno ha qualche idea su come modificare le autorizzazioni per la directory/webroot in modo che le cose all'interno dell'ambiente vagabondo possano effettivamente leggere e scrivere ad esso come chmod non sembra funzionare?

risposta

5

Penso che sia una questione di diritti degli utenti. Il tuo apache + php è probabilmente lanciato da root. Devi impostare i diritti con root.

due possibilità:

sudo su 
chmod -R 777 app/cache 

o

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

Probabilmente si dovrà fare la stessa cosa con il file di log.

Il mio file vagabondo se ne avete bisogno:

# -*- 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

Questo lavoro dosen't. Chmoding o Chowning all'interno dell'ambiente vagabondo, anche quando un superutente ritorna immediatamente e le autorizzazioni/proprietà non vengono cambiate anche se i comandi vengono eseguiti correttamente. Qualche idea su come mantenere i comandi Chmod o Chown per persistere. –

+4

Capito! Il problema era che fmode e dmode erano impostati in modo errato mentre la cartella vagabonda era montata su vboxsf. Ho semplicemente aggiunto la riga 'config.vm.synced_folder" ../gipsydanger/ ","/vagrant ",: extra => 'dmode = 777, fmode = 777'' al mio Vagrantfile. Grazie comunque! –

+0

Ho preso alcune di questa risposta con lievi miglioramenti e l'ho trasformata in un modulo di provisioning pronto all'uso, specialmente per l'utilizzo con Symfony2. Inserito su [Github] (https://github.com/Lukx/vagrant-lamp) – Lukx

3

Una risposta aggiornata per NFS:

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

Aggiornamento al 15 Gennaio 2016 Istruzioni per Vagrant 1.7.4+ e Symfony 3. Questo funziona.

su una nuova Ubuntu 14.04 installare, ACL è stato installato, ma non ho potuto usare un + o setfacl per risolvere i problemi di autorizzazioni, e, naturalmente, non appena si cambia tutte le autorizzazioni nel terminal di vagabondo, hanno 'reimpostato al vagabondo: di nuovo vagabondo.

ho aggiunto il seguente al mio file vagabondo:

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

Questo dice Vagrant per sincronizzare var/log e var/cache (da non confondere con/var /, questi sono nella radice Symfony directory) e li hanno posseduti da vagabondo: www-data. Questo è lo stesso di fare un sudo chown vagrant:www-data var/, eccetto che Vagrant ora lo fa per te e lo applica invece di forzare il vagabondo: vagabondo.

Nota: non ci sono 777 'hack' qui.

Non appena ho aggiunto ciò, non ho avuto più errori di autorizzazione nel registro di apache e ho ottenuto una bella schermata di benvenuto di Symfony. Spero che aiuti qualcuno!

+2

Grazie mille per aver salvato la mia giornata. –

+0

Non funziona per me in "Vagrant 1.9.3" .. –

+0

@MuzafarAli Guarda gli ultimi documenti vagabondi e cerca la cartella sincronizzata? Forse hanno cambiato il modo in cui lo fai in 1.9.3? Se trovi qualcosa, sono felice di accettare aggiunte alla risposta o di cambiarla per "1.9.3: fai questo invece". Da una ricerca frettolosa non riesco a trovare nessuna modifica alle API che rompere BC: -/ – Jimbo

1

Niente ha funzionato per me altro che cambiare posizione della cartella di cache e registri per/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(); 
}