前回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アーカイブをダウンロードします。
公式サイト(の和訳)にあるように、/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
次にデプロイ情報を整えます。
新規Deployment先を追加します。
Local or mounted folderを選択して、以下のように整えていきます。
Web server root URLはVagrantのPost forwardで指定したアドレスになるかと思います。127.0.0.1:4567とか8080とかです。
Mappingsタブも整えていきましょう。
これでプロジェクトを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すると、、、
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にアクセスしてみましょう。
これで成功です。
ちなみに画面に
と出ている場合は、もっとエラーログを具体的にみるべく以下のように設定を調整します。
[ 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
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にデプロイしてチェックするという流れができました。