Intelligent Technology's Technical Blog

株式会社インテリジェントテクノロジーの技術情報ブログです。

Laravel4-Vagrant

こんにちは、石尾です。

Laravel(ララベル)、Vagrant(ベイグラント)のキーワードを見たことや聞いたこともない人は、ほとんどいないかと思いますが、まだ触ったことがない人はいるかと思います。

一度に両方触ってみたいという方に、Ubuntu12.04、PHP5.5、Apache2.2、Laravel4を構築するLaravel4-VagrantというVagrant定義がGitHubで公開されています。

今回は、このLaravel4-Vagrantの紹介です。
※Laravel、Vagrantの公式サイト
Laravel - The PHP framework for web artisans.
Vagrant

Laravel4-Vagrantを利用するための準備

Laravel4-Vagrantに必要なソフトウェアとして、VirtualBoxVagrant、Gitがあります。次のリンクより、ダウンロードし、インストールしてください。
Downloads – Oracle VM VirtualBox
https://www.vagrantup.com/
Git - Downloads

※Gitは、Laravel4-VagrantGitHubよりクローンする際に利用します。
GitHubの[Download ZIP]より、zipファイルを利用すれば、とくに必要ありません。

今回確認したローカル環境は、以下の通りです。

Oracle VM VirtualBox 4.3.12
Git Extensions 2.46
Vagrant 1.6.3
Windows7 64bit

Laravel4-Vagrantの導入

1.コマンドプロンプトを起動して、GitHubよりLaravel4-Vagrantをクローンします。

git clone http://github.com/bryannielsen/Laravel4-Vagrant.git

2.クローンしたLaravel4-Vagrantのディレクトリに移動して、「vagrant up」コマンドを実行します。このコマンドは、Vagrantfileを元にVMを設定します。VagrantfileはLaravel4-Vagrantディレクトリ直下にあります。

cd Laravel4-Vagrant
vagrant up

次のようなメッセージが出力されます。

Bringing machine 'laravel4' up with 'virtualbox' provider...
==> laravel4: Importing base box 'precise32'...
==> laravel4: Matching MAC address for NAT networking...
==> laravel4: Setting the name of the VM: Laravel4-Vagrant-master_laravel4_14072
98976790_20127
==> laravel4: Fixed port collision for 80 => 8888. Now on port 2200.
==> laravel4: Fixed port collision for 3306 => 8889. Now on port 2201.
==> laravel4: Fixed port collision for 5432 => 5433. Now on port 2202.
==> laravel4: Fixed port collision for 22 => 2222. Now on port 2203.
==> laravel4: Clearing any previously set network interfaces...
==> laravel4: Preparing network interfaces based on configuration...
...
stdin: is not a tty

※最後の「stdin: is not a tty」は、とくに問題ないみたいです。vagrant で Ubuntu 起動中に “stdin: is not tty” ってエラーが出たとき - Qiita
vagrant ssh」コマンドで、VMsshログインします。

vagrant ssh

VMが正常に起動できれいれば、下記のようにログインできます。

Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)

 * Documentation:  https://help.ubuntu.com/
New release '14.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Welcome to your Vagrant-built virtual machine.
Last login: Fri Aug 15 02:08:16 2014 from 10.0.2.2
vagrant@laravel:~$

※「vagrant update」コマンド実行時に、次のようなメッセージが出力されました。これは、Laravel4-Vagrantを展開した作業ディレクトリのパスに日本語が入っていたことが原因でした。英数字ディレクトリで作業すれば、問題ありませんでした。

C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant/config/loader.rb:44:in `inspect': inspected result must be ASCII only or use the same encoding with default external (Encoding::CompatibilityError)

3.ブラウザで「http://localhost:8888」アクセスすると、Laravelのトップ画面が表示できます。
f:id:IntelligentTechnology:20140815110657p:plain:w300

また、PHPユーザーにお馴染みのphpmyadminも利用できます。
http://localhost:8888/phpmyadmin
※ユーザー名:root、パスワード:無しでログインできます。
f:id:IntelligentTechnology:20140815110719p:plain:w300

4.VMの起動や停止は、Laravel4-Vagrantのディレクトリに移動し、起動「vagrant up」、停止「vagrant halt」コマンドを実行すれば、OKです。

vagrant up
vagrant halt

これで、VagrantによるVM仮想マシン設定、Laravelの疎通確認完了です。
簡単です!!

物足りない人に向けて、もう少し中身を見てみます。

Vagrantの中身

Vagrantの中身として、「vagrant up」コマンドで読み込まれるVagrantfileを抜粋しながら見ていきます。Vagrantfileは、Rubyで記述されています。

Vagrant.configure("2") do |config|
end

この「2」は、設定オブジェクト「config」のバージョンを示しています。「1」の場合、v1.0.x系、「2」の場合、v1.1+以降となります。今回Vangrant1.6.3として「2」を指定しています。設定内容は、この「do~end」ブロックで記述していきます。

config.vm.define :laravel4 do |lv4_config|
end

「config.vm.define」は、メソッドです。引数に仮想マシン名「:laravel4」とその仮想マシンの設定ブロック「lv4_config」を渡します。複数仮想マシンを起動する場合、この「config.vm.define」を複数記載することになります。

lv4_config.vm.box = "precise32"
lv4_config.vm.box_url = "http://files.vagrantup.com/precise32.box"

「lv4_config.*」が各設定になります。「vm.box」は、仮想マシンのイメージ(Vagrant用語でいうBox)を指定します。「vm.box_url」にそのイメージをダウンロードするURLを指定しています。

lv4_config.ssh.forward_agent = true

仮想マシンには、ssh接続を行います。「ssh.forward_agent=true」は、SSH Agent Forwardingを有効にしています。Forwardingは、多段で別マシンにssh接続する際に、sshの鍵の認証情報をforwardすることです。

lv4_config.vm.network :forwarded_port, guest: 80, host: 8888, auto_correct: true
lv4_config.vm.network :forwarded_port, guest: 3306, host: 8889, auto_correct: true
lv4_config.vm.network :forwarded_port, guest: 5432, host: 5433, auto_correct: true

vm.network :forwarded_port」は、ポートフォワーディングの設定です。ローカルマシンで8888へアクセスすると、仮想マシンの80へフォワードするような設定となります。「auto_correct:true」は、ポート衝突時に自動振分する設定になります。

lv4_config.vm.hostname = "laravel"

vm.hostname」は、仮想マシンのホスト名の指定をします。

lv4_config.vm.synced_folder "www", "/var/www", {:mount_options => ['dmode=777','fmode=777']}

vm.synced_folder」は、仮想マシンとローカルマシンとの同期ディレクトリの設定です。「www」が、ローカルマシン側のディレクトリ。「/var/www」が、仮想マシン側のディレクトリ。「dmode/fmode」は、仮想マシン側のディレクト・ファイル権限となります。Laravel4-Vagrantディレクトリ直下の「www」ディレクトリと同期された状態になります。Windows上でのエディタで直接ファイル編集することが可能となります。※ただし、ファイルシステムWindows管理となるため、ファイル名の大文字・小文字を区別しなかったり、ディレクトリの区切りが「\\」のまま動作します。

lv4_config.vm.provision :shell, :inline => "echo \"Europe/London\" | sudo tee /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata"

vm.provision」は、仮想マシンのプロビジョニングの設定です。「:shell, :inline=>"xxx"」"xxx"のコマンドをシェルスクリプトで実行する意味となります。ここでは、タイムゾーンを変更しています。「dpkg-reconfigure」はパッケージを再設定するコマンドです。

lv4_config.vm.provider :virtualbox do |v|
    v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    v.customize ["modifyvm", :id, "--memory", "512"]
end

vm.provider」は、プロバイダ(Vmwarevirtualbox)特有の設定です。「modifyvm」は、仮想マシンのプロパティを変更するコマンドです。
「--natdnshostresolver1」は、NATエンジンがDNS要求を処理する際にホストのリゾルバ機構を使うオプションです。リゾルバ機能は、仮想マシンからのネットワーク接続時に、ローカルマシンのDNSサーバーを使い、名前解決する機能です。
「--memory」は、仮想マシンに割り当てるメモリMBのオプションです。

lv4_config.vm.provision :puppet do |puppet|
    puppet.manifests_path = "puppet/manifests"
    puppet.manifest_file  = "phpbase.pp"
    puppet.module_path = "puppet/modules"
    #puppet.options = "--verbose --debug"
end

puppetの設定です。Puppetは、Linuxシステムの設定自動管理するツールです。Laravel4-Vagrantディレクトリ直下の「puppet」ディレクトリに設定情報があります。この中で、apahce/mysqlなどのインストールや設定を行っています。気になる人は、もっと詳しく見てください。

Linuxサーバ環境構築の経験がある人は、この程度の設定ファイルで環境構築ができるならVagrantを使ってみようと思うでしょう。

Laravelの中身

Laravelのトップ画面を表示しましたが、そのレスポンスまでの流れを見ていきます。
はじめに、ドキュメントルートは「/var/www/public」に設定されています。/etc/apache2/sites-enabled/000-default.confの抜粋です。

<VirtualHost *:80>	
	DocumentRoot /var/www/public

その階層/var/wwwのディレクトリ構成は、次のようになります。

├─app      アプリケーション
├─bootstrap   初期画面設定
├─html      apache2初期画面(Laravelと関連ありません)
├─public     ドキュメントルート
└─vendor     アプリケーションで利用するライブラリ(Laravelもここに配置されています)

ドキュメントルート「/var/www/public」直下の.htaccessのRewriteルールにより、index.phpが呼ばれます。.htaccessの抜粋です。

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

index.phpは、次の3行が処理されているだけです。/var/www/public/index.phpの抜粋です。

require __DIR__.'/../bootstrap/autoload.php';

$app = require_once __DIR__.'/../bootstrap/start.php';

$app->run();

bootstrap/autoload.phpでは、vendorディレクトリのautoload.phpが読み込まれ、vendorディレクトリ配下のライブラリを読み込んでいます。

bootstrap/start.phpでは、「Illuminate\Foundation\Application」Laravelのアプリケーションオブジェクトを生成し、戻します。「$app->bindInstallPaths」は、アプリケーションのパス設定をしています。ここで、アプリケーションフォルダ「app」を設定しています。bootstrap/start.phpの抜粋です。

$app = new Illuminate\Foundation\Application;
・・・
$app->bindInstallPaths(require __DIR__.'/paths.php');

$framework = $app['path.base'].
                 '/vendor/laravel/framework/src';

require $framework.'/Illuminate/Foundation/start.php';
・・・
return $app;

そして、index.phpの「$app->run();」でアプリケーションが処理されます。
次に、アプリケーションのルーティング設定です。app/routes.phpの抜粋です。

Route::get('/', function()
{
    return View::make('hello');
});

get関数の第一引数にURLパス「/」、第二引数にレスポンスを設定します。「View::make('hello')」は、app/views/hello.phpのViewファイルを呼び出して、レスポンスとして戻します。hello.phpの中身が、トップ画面のHTMLとなります。

※ルーティング設定していないURL「http://localhost:8888/xxx」にアクセスすると、次のようなメッセージが返されます。

Whoops, looks like something went wrong.

phpmyadminはどこで設定しているの?と疑問になったかと思います。apacheエイリアス設定が別途行われています。/etc/apache2/conf-enabled/phpmyadmin.confの抜粋です。

Alias /phpmyadmin /usr/share/phpmyadmin

Laravelの中身を見てきましたが、疎通確認レベルのほんの少しだけです。インターネット上にはLaravelの情報が多数あります。興味を持たれた人は、Laravelをはじめてみてはいかがでしょうか。