13

vagrant 環境内から Symfony2 をインストールすることに関連して、奇妙な問題が発生しています。環境は正しく設定されており、vagrant のベース ディレクトリにある vagrant 環境と共有されているフォルダーからファイルを提供する Web サーバーを実行しています。

基本的に、vagrant はディレクトリ foo で開始され、次に foo 内に webroot というディレクトリがあります。Vagrant は自動的に foo ディレクトリを共有します。webroot がベース http ディレクトリになるように、Apache サーバーが実行するように設定されています。これはすべて正常に動作し、基本的な HTML と PHP を提供でき、MySQL 接続が正常であることがテストされています。

composer を使用して、推奨される方法で vagrant を /webroot/ 内の Symfony というディレクトリーにインストールしました。すべてのファイルが正しいディレクトリ内に存在するようになりました。構成は正しく、Symfony が /config.php で変更する必要があると主張する項目はありません。

/app_dev.php を読み込もうとすると問題が発生します。/app ディレクトリに cache という名前のファイルを作成できないという例外がスローされます。

私が使用している vagrant box では chmod +a がサポートされていないため、app_dev で umask(0000) のコメントを外してパーミッションを設定することにしました。パーミッションの問題だと仮定して、chmod を使用して vagrant 環境と osx 内の両方のパーミッションをすべて 777 に調整してみました。

奇妙なのは、vagrant 環境内でファイルまたはディレクトリを chmod すると、777 が正しく設定されていると主張されますが、ls -l を実行しても、アクセス許可が変更されていないことです。ただし、webroot フォルダー内の Vagrant 環境の OUTSIDE からファイルまたはディレクトリを chmod すると、アクセス許可が保持されます。symfony は環境内で r/w パーミッションを持っていないため、必要なキャッシュとログ ファイルを作成できません。osx のコマンドから symfony を実行すると、すべて正常に動作します。

/webroot ディレクトリのアクセス許可を変更して、chmod が機能していないように見えるため、vagrant 環境内のものが実際に読み書きできるようにする方法について、誰かが洞察を持っていますか?

4

4 に答える 4

5

ユーザーの権限の問題だと思います。apache + php はおそらく root によって起動されます。root で権限を設定する必要があります。

2 つの可能性:

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';\""
于 2013-08-03T12:37:21.957 に答える
3

nfs の更新された回答:

config.vm.synced_folder "www", "/var/www", type:nfs, :nfs => { :mount_options => ["dmode=777","fmode=777"] }
于 2014-04-11T22:04:22.087 に答える
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();
}
于 2017-04-04T09:27:24.687 に答える