Бродяга и симфония2

У меня есть проблема с bizzare, связанная с установкой Symfony2 из среды бродяг. Окружающая среда настроена правильно и работает веб-сервер, обслуживающий файлы из папки, которая совместно используется с бродячей средой, которая находится в базовом каталоге бродяг.

В принципе, бродяга инициируется в каталоге foo, а затем внутри foo существует каталог с именем webroot. Vagrant автоматически разделяет каталог foo. Сервер apache настроен так, чтобы webroot был базовым http-каталогом. Это все работает отлично, и я могу обслуживать базовые HTML, PHP и MySQL, тестирование проверено, чтобы быть в порядке.

Я использовал композитор для установки vagrant по рекомендованному пути, в каталог внутри/webroot/под названием Symfony. Все файлы теперь существуют в правильном каталоге. Конфигурация верна и нет элементов, которые, по утверждению Symfony, необходимо изменить в /config.php.

Проблема возникает, когда я пытаюсь загрузить /app _dev.php. Он выдает исключение, утверждающее, что он не может создать файл с именем cache в каталоге /app.

Поскольку chmod + a не поддерживается в ящике брандмауэра, который я использую, я решил установить разрешения, раскомментируя umask (0000) в app_dev. Предполагая, что это проблема разрешения, я попытался использовать chmod для настройки разрешений как в среде бродяг, так и в пределах osx до 777 для всего.

Что странно, когда я chmod файл или каталог внутри бродячего окружения, он утверждает, что правильно установил 777, но тогда, когда я ls -l, разрешения не изменились. Однако, когда я chmod файл или каталог из OUTSIDE Бродячая среда в папке webroot, разрешения сохраняются. Поскольку symfony не имеет r/w-разрешений в среде, он не может создать необходимые файлы кэша и журнала. Когда я запускаю symfony из команды osx, все работает нормально.

Есть ли у кого-нибудь представление о том, как изменить разрешения для каталога /webroot, чтобы вещи в среде бродяг могли действительно читать и писать на нем, поскольку chmod не работает?

Ответ 1

Обновление от 15 января 2016 года. Инструкции для Vagrant 1.7.4+ и Symfony 3. Это работает.

В новой установке Ubuntu 14.04 был установлен ACL, но я не мог использовать + или или setfacl для устранения проблем с разрешениями, и, конечно же, как только вы измените какие-либо разрешения в терминале в бродяжнике, они reset бродяжнику: бродяжничать снова.

Я добавил в свой бродячий файл следующее:

# Symfony needs to be able to write to it 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/logs и var/cache (не путать с /var/, они находятся в корневом каталоге Symfony) и иметь их в собственности vagrant: www-data. Это то же самое, что и делать sudo chown vagrant:www-data var/, за исключением того, что Vagrant теперь делает это для вас и принуждает это вместо того, чтобы принуждать бродягу: бродягу.

Обратите внимание, что здесь нет 777 "хаков" .

Как только я добавил, я не получил больше ошибок разрешений в журнале apache, и у меня появился хороший экран приветствия Symfony. Я надеюсь, что это поможет кому-то!

Ответ 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';\""

Ответ 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();
}