Laravel5.5LTS、AtoZ#1、Homestead開発環境

タグ: Laravel5.5   Homestead  

Laravelが便利だが、複雑なフレームワークとなった現在、初心者向けの記事をこのサイトで書くのは気が重いのですが、人気のフレームワークの感触と、開発を補助する環境を一通り掴んでおくのは、PHPで開発を始めたばかりの方に何かしら役立つと思います。

そこで、Laravel5.5をベースとして、「一通り触ってみた」チュートリアルシリーズをいくらか投稿しようと思います。

最初は、Laravel5.5の開発環境であるHomesteadについてです。

Larave Homestead

Laravel HomesteadはPHPの開発環境です。仮想環境を簡単に用意できるVagrant Boxとして提供されています。

そもそも、PHPは開発環境、そして開発したシステムを動作させる実働環境を作成するのが手間でした。しかし、他の言語と比べて面倒と言う意味ではありません。

どの言語で開発しようと、それを公に公開するためには、開発言語より多くの知識が必要となります。情報とノウハウとグッドプラクティスが必要となります。大抵のサーバーはLinux上で動作していました。最近はWindowsが多くなりましたが、費用がかかるため、お金がかからないLinuxサーバーが好まれます。つまり、大抵の場合はLinux上でプログラムをサーバー動作させる必要があります。このための知識が必要です。

Webサーバーはもちろん、大抵のシステムでは情報を保存しておくためにデータベースが使用されます。これもセットアップする必要があります。

さらに、LaravelはRedisやら、キューやらを用意しており、機能をフル活用するには準備が多いのです。

こうした環境を用意するのは手間でした。(Laravelによらず。こうした多機能な環境のセットアップは手間や複雑さや多くの知識が必要と言う点で面倒です。)

サーバーセットアップの手間を軽減するため、開発環境や動作環境を構築しやすくする仕組みがいろいろ用意されました。

構築の手順を自動化するプロビジョニングツール、OSの仮想化などの技術の進歩とハードウェアの高機能化により、開発者が環境を用意するための手間を短縮する手段が一般的になりました。

LaravelはVagrantのBoxを使用しています。Vagrantは開発環境の共有ツールです。構築済みの仮想マシンをBoxと呼んでいます。Homesteadは、Linuxの一つであるUbuntu上に、PHPやWebサーバーを始め、Laravelをフル活用できる開発環境を用意したBoxと、ホストマシンとBoxとのファイル共有や、Webサーバー設定が簡単にできるYAML形式の設定ファイルで構成されています。

このシリーズでは、環境による差異をなくすためにHomesteadを使用します。

ちなみに、Homesteadの動作要件は詳しく書かれていませんが、64ビット、4コア、4GBメモリ以上は必要でしょう。64ビットマシンでも、メモリを節約するためにタブレットなどでは、32ビットWindowsを載せていることがあります。Boxが64ビットサーバーのため、ホストマシンやホストOSが32ビットでは動作しません。(デフォルトの設定では、Homesteadは1コア、最大2048Mバイトメモリを使用します。)

Homesteadのインストール

ホストマシンのOSによる違いがあるため、上記のドキュメントで足りない場合は検索してください。

設定のヒント

ドキュメントと設定ファイルを見れば、なんとなくでも理解できるでしょう。

わかりづらい方のために、公式ドキュメントとは別の視点を加え、説明してみます。

Nginxサイトの設定

NginxとはWebサーバーの名前です。Laravelに関わっている方々は、古くからメジャーなApacheよりも、Nginxの方を好んでいます。そのため、HomesteadでもWebサーバーとしてNginxが採用されています。

Webサーバーの設定ですから、設定内容はどのドメイン名でアクセスされたら、どこをドキュメントルートとして読み込み表示するかと言う設定になります。

たとえば、HomesteadでMySQLのWeb設定UIを提供するPhpMyAdminを使用したければ、これはHomesteadのデフォルトでは用意されていませんので、Ubuntuのパッケージ管理コマンドツールである、aptを使用して、まずインストールします。vagrant sshでHomestead環境へ接続し、以下のコマンドを叩きます。

sudo apt install phpmyadmin

インストールの途中で、どのWebサーバーに対して設定するかと、データベースの管理ツールでを尋ねられます。最初のサーバー設定については、Nginxが選択肢にないため、選ぶ必要はありません。それ以降の選択肢については"phpmyadmin ubuntu"で検索してください。

Homestead利点の一つである、調子が悪ければBoxを壊して起動し直すと、Homestead環境は真新しくなります。つまり、SSH接続し、自分でコマンドを叩いてインストールしたパッケージはなくなります。これを防ぐにはプロビジョン後に実行されるafter.shに、指定するほうが良いでしょう。指定例です。

# パッケージがインストール済みであるか判定
if ! (dpkg -l | grep phpmyadmin > /dev/null)
then
        # MySQLやPHPMyAdminは、インストール時インタラクティブに設定を問い合わせる。
        # 以下の3行は、問い合わせの内容を先に指定している。
        sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/internal/skip-preseed boolean true"
        sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect"
        sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/dbconfig-install boolean false"

        # Yes/Noの質問には全部Yesで返答し、問い合わせを抑制しながらインストール
        sudo apt-get install -y phpmyadmin
fi

上記の設定例で、<<<を使用していますが、これはBashの書き方です。このafater.shスクリプトの1行目では、#!/bin/shが指定されています。そのため、一行目は#!/bin/bashに変更してください。

インストールが完了すると、このPhpMyAdminはHomestead環境のファイルシステムに用意されます。/usr/share/phpmyadminがそのドキュメントルートです。

話がやっとNginxの設定に戻ります。Webサーバーにアクセスが来たら、このディレクトリーへアクセスするように設定します。ホストマシンのHomesteadインストールディレクトリに存在する、Homestead.yamlファイルを開き、sites設定項目に追加しましょう。今回は、phpmyadminというドメイン名でアクセスが起きたら、このディレクトリがアクセスされるようにします。

...
sites:
...
    - map: phpmyadmin
      to: /usr/share/phpmyadmin
...

これで、Homestead上のhttpデフォルトポート(80番)へアクセスがあると、それをリッスンしているNginxが処理を担当し、アクセス先のドメイン名がphpmyadminであれば、指定されたディレクトリへアクセスさせます。

この設定だけでは分かりませんが、Homesteadはこの設定内容から、ディレクトリ上に存在するindex.phpファイルへアクセスするようにしてくれます。PHPで動作するプログラムは、通常index.phpから処理を開始します。PhpMyAdminも同様です。

次に、ホスト側でphpmyadminドメインへアクセスされた場合に、このHomesteadマシンがアクセスされるように、/etc/hosts(Windowsの場合は異なります。ドキュメントをお読みください)に追加します。

...
192.168.10.10   homestead.test phpmyadmin
...

192.168.10.10のIPアドレスは、Homesteadマシンの固定IPアドレスです。設定ファイルである、Homestead.yamlの先頭で定義されています。

公式ドキュメントの設定例を試していれば、既にhomestead.testが指定されているでしょう。その後にスペースを入れ、phpmyadminを追加します。

これで、ホストマシンのWebブラウザから、phpmyadminへアクセスすると、HomesteadマシンのPHPMyAdminが使用できます。

実際に試してみると、PHPのエラーや警告が表示されます。何度かアクセスすると、そうした表示はPHPMyAdminにより抑制され、表示されなくなります。(インストール時の設定ミスが原因です。上記のafter.shの設定でインストールするとエラーになりません。)

Homesteadでは、ルートのMySQLユーザーとして、homestead、パスワードはsecretがあらかじめ設定されています。これを入力してもアクセスできない場合は、https://phpmyadminへアクセスしてください。この場合、ブラウザが「安全でないサイト」として警告してきます。例外としてアクセスを認めるように指定してください。

Homesteadは上記の通り、指定されたサイトをhttpでも、httpsでもアクセスできるように設定します。SSLは自家認証のためhttpsでアクセスした場合に、ブラウザは正当な認証がされていない危険なサイト扱いにします。そこで、ブラウザで接続できるように「例外」のサイトとして指定する必要があります。

ファイル共有

もし、Homestead環境だけにソースを置き、SSH接続でアクセスするのであれば、これで良いわけです。Homestead環境には、Laravelは含まれていません。しかし、Composerが用意されていますので、内部のファイルシステムにインストール可能です。

IDEやエディターの中には、SFTPやSSH接続経由でソースを編集できるものがあります。または、Homestead環境のvimなどで編集できる方は、それを使うことも可能です。こうした場合は、ホスト側にコートなどをおいておく必要はありません。

ただ、通常開発者はホスト側に高機能、もしくは高速であるか、お気に入りなIDEやツールを用意しています。それで、直接ソースを編集できれば、それに越したことはありません。

そこで利便性のため、ホスト側のファイルシステムと、Homesteadゲストマシン側のファイルシステムを共有できるようになっています。デフォルトではVagrantが提供する機能を使用します。

その設定が、Homestead.yamlファイルのfolders設定項目です。mapとして、ホストマシン側のディレクトリ、toとしてHomestead側のディレクトリを指定します。ドキュメント中の例を見てもらえば、理解できるでしょう。

Homesteadでは、vagrantユーザーとしてアクセスします。そのホームディレクトリは、/home/vagrantです。そのため、to側は/home/vagrant/下のディレクトリとして指定してあります。vagrant sshでログインすると、/home/vagrantがワーキングディレクトリですので、その直下にディレクトリが用意されるわけです。

Laravel Mixやテストの自動化でファイルの変更監視をHomestead内で行う場合、ホスト側で行った変更がHomesteadのファイルシステムに通知されない場合があります。対処法はこのサイトで、「ホスト側の変更を捉える」として紹介しています。