[ Vagrant ] 02: LEMP環境にてPHP5.5( laravel)の開発環境を作る

前回Vagrant上にCentOSを入れて、そこにLEMP環境を作成しました。

今回は、Vagrantに作った環境にLaravelフレームワークを入れて幾つか環境設定を行っていきます。

DBの接続も確認したいので、公式サイトにあるクイックスタートも試していきたいと思います。

デプロイ先の設定

ではとりあえずVagrantの/var/wwwにシンボリックリンクを貼っておきます。

ターミナルから以下のコマンドを実施します。


[ guest machine(vagrant) ]

ln -fs /vagrant /var/www

/vagrantはホストマシン側のvagrantコマンド実施するフォルダ(私の場合は/usr/local/Vagrant/centos65)です。

ここにLaravelプロジェクトをデプロイすることで/var/wwwにデプロイするようにしていきたいと思います。

Laravelインストール

まずLaravelに関しては有力な日本語翻訳サイトがありますので、こちらをベースに進めていきたいと思います。

Laravel公式サイトの日本語訳

ではLaravelインストーラーPHARアーカイブをダウンロードします。

composerを使う方法もありますが、かなり時間がかかります。

公式サイト(の和訳)にあるように、/usr/local/binにpharファイルを移動して、名前をlaravelに変えます。

そして、どこか適当な場所(Vagrantではなく)にcdで移動してlaravel new mylaravelを実行してmylaravelプロジェクトを生成しましょう。


[host machine]

cd あなたのワークスペース

#Laravelプロジェクトを生成する
laravel new mylaravel

phpstormの設定

LaravelプロジェクトをIDEで管理していきたいと思います。

様々なIDEがあると思います。

どのIDEでも構いません。

ここではphpstorm(※1)を使っていきます。

file > open directory

phpstormにて先ほど作成したmylaravelプロジェクトを開きます。

tools > Deployment > Configuration

次にデプロイ情報を整えます。
スクリーンショット 2014-08-17 16.35.27

新規Deployment先を追加します。

Local or mounted folderを選択して、以下のように整えていきます。

Web server root URLはVagrantのPost forwardで指定したアドレスになるかと思います。127.0.0.1:4567とか8080とかです。
スクリーンショット 2014-08-17 16.45.49

Mappingsタブも整えていきましょう。
スクリーンショット 2014-08-17 16.48.03

これでプロジェクトをVagrant上にデプロイする準備が整いました。

試しにデプロイしてみましょう。

/vagrantフォルダに配置されたでしょうか。

ちゃんとシンボリックリンクが貼られているかを確認するために、vagrant側からもチェックしてみます。


[ guest machine(vagrant) ]

ls -1 /var/www

出力結果にmylaravelというディレクトリが存在していることを確認できれば成功です。

ない場合はシンボリックリンクがおかしいかもしれません。

よく分からない場合や時間をかけても原因がわからない場合は一度vagrant destroyしてしまってvagrant upし直すのも手です。

Laravelの設定

Nginxのデフォルトページ(127.0.0.1:xxxx)でLaravelの初期ページがでるように調整していきます。

まずはdefault.confを調整しましょう。


[ guest machine(vagrant) ]

vi /etc/nginx/conf.d/default.conf
  - root /var/www/;
  + root /var/www/mylaravel/public;

nginxをapp/storageのオーナーにする

Vagrantのmountオプションが効かない

さて、次に公式ドキュメントに沿ってLaravelのapp/storageに対してnginxに権限を与えていきます。

普通に考えるとサクッと、chownでオーナーを変更できると思うのですが、Vagrantでは上手く行きませんでした。

chownしたい

試しにchownしてもonwerが変わらないということを確認してみます。


[ guest machine(vagrant) ]

cd /var/www/mylaravel

ls -al
#ディレクトリやファイルごとのパーミッションとオーナー一覧が出力される

sudo chown -R nginx app/storage

ls -al
# 変わってない

気を取り直して、公式ドキュメント(※2)を参考にVagrantfileに以下を追記してみます。


[ Vagrantfile ]

config.vm.synced_folder ".", "/vagrant", owner: "nginx", group: "nginx"

そしてvagrant reloadすると、、、

Failed to mount folders in Linux guest. This is usually because
the “vboxsf” file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly.

となります。

最終的に、この問題を解決するのは以下のサイトの記述をVagrantfileに追記することでした。

command = “ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions || true”
config.vm.provision “shell”, inline: command


VirtualBox 4.3.10でVagrantの共有フォルダがマウント出来ないエラーの応急処置(※3

上記の記述をVagrantfileに追加して、vagrant reloadしてみます。

これで再度ls -alコマンドでオーナーを確認するとapp/storageのオーナーがnginxに変更されていると思います。

ちなみにchmodの場合

ちょっと横道にそれますが、chmodも上手くいきませんでした。

試しに以下のとおりに行ってどんな煮詰まった状況なのかを確認しましょう。


[ guest machine(vagrant) ]

cd /var/www/mylaravel

ls -al
#ディレクトリやファイルごとのパーミッションとオーナー一覧が出力される

sudo chmod 777 app/storage

ls -al
#変わってない

以下のサイトでこの問題に対して解決方法を提示してくれています。

vagrantの共有フォルダでパーミッションを指定するには

config.vm.synced_folder "</path/to/_dir>", "</path/on/guest>", mount_options: ['dmode=<dir_permission>','fmode=<file_permission>']

【vagrant】共有フォルダのパーミッションで悩んだ話【chmodできない】(※4

Vagrantfileに上記を追加してvagrant reloadすると、ディレクトリの権限が変わっています。

Laravel初期ページを開いてみる

ではservie nginx restartをしてから127.0.0.1:xxxxにアクセスしてみましょう。

スクリーンショット 2014-08-17 18.10.54

これで成功です。

ちなみに画面に

Error in exception handler

と出ている場合は、もっとエラーログを具体的にみるべく以下のように設定を調整します。


[ guest machine(vagrant) ]

vi /var/www/mylaravel/app/config/app.php

  - debug = false
  + debug = true

これでもう少し詳しくログが出てきます

DBとつなげてみる

さて、ここからはほぼ公式の和訳サイトのクイックスタートを見ても同じです。

以下、ファイルは全てmylaravelからの相対パスを[カッコ]に記しておきます。

まずはDBの情報を自身のMySQLに合わせておきます。


[ app/config/database.php ]

'mysql' => array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'test', // 適宜変えてください
    'username'  => 'root', // 適宜変えてください
    'password'  => '',     // 適宜変えてください
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
 ),

次にDBのマイグレーションをします。


[ guest machine(vagrant) ]

# DBのマイグレーション
php artisan migrate:make create_users_table

作成されたマイグレーションファイルを加工します。


[ app/database/migrations/xxxx.php ]

public function up()
{
    Schema::create('users', function($table)
    {
        $table->increments('id');
        $table->string('email')->unique();
        $table->string('name');
        $table->timestamps();
    });
}
 
public function down()
{
    Schema::drop('users');
}

[ guest machine(vagrant) ]

php artisan migrate

これでDBにテーブルが出来たと思いますので、確認してみましょう。


[ guest machine(vagrant) ]
mysql #ログインしてください
use test;
show tables; # usersテーブルがあることを確認します
insert into users ("email", "name") values ("info@example.com", "tester"); #ついでにデータを挿入しておきます。

ルートの定義です。


[ app/routes.php ]

Route::get('users', function()
{
    $users = User::all();
 
    return View::make('users')->with('users', $users);
});

レイアウトの作成です。


[ layout.blade.php ]

<html>
    <body>
        <h1>Laravelクイックスタート</h1>
 
        @yield('content')
    </body>
</html>

bladeファイルの作成です。


[ users.blade.php ]
@extends('layout')
 
@section('content')
    @foreach($users as $user)
        {{ $user->name }}
    @endforeach
@stop
和訳サイトではuser.blade.phpとなっている箇所があるのですが、users.blade.phpが正しいファイル名です

app/modelsにUserがなければ作ります。


<?php

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface {

    use UserTrait, RemindableTrait;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = array('password', 'remember_token');

}

これで127.0.0.1:xxxx/usersにアクセスして、レイアウト内に先ほど登録したtesterが表示されれば完成です。

今後はphpstormなどのIDEでファイルを変更して、vagrantにデプロイしてチェックするという流れができました。