(Mac)ApacheのVirtual HostでLaravelを実行する

(Mac)LaravelプロジェクトをApache上で動作させる

Macのローカル環境で作成したLaravelのプロジェクトを
php artisan serve コマンドで起動する簡易Webサーバではなく、
Mac同梱のApache Webサーバで実行する手順をメモします。

環境: Mac 10.13.6、 Laravel Framework 5.8.35、Apache 2.4.33

本記事ではApacheのVirtual Host機能を利用してLaravelプロジェクトを動作させていきます。

ApacheのVirtual Host設定詳細については下記を参照

(Mac)ApacheのVirtual Hostでローカル開発環境を構築する

Apacheの設定を行う

ターミナルを開き、Apacheの設定ファイルを変更していきます。
Virtual Hostを利用する為のApacheの基本的な設定に加えて、
Laravelプロジェクトを動作させるために以下の設定を追加します。

(重要).htaccessによるリダイレクトを有効化する

ターミナルから、
sudo vi /etc/apache2/httpd.conf

/etc/apache2/httpd.confを管理者権限で開き、
インサートモードに切り替えて以下の内容に書き換えます。

行頭の#を外して有効化する
(前)#LoadModule rewrite_module libexec/apache2/mod_rewrite.so
(後)LoadModule rewrite_module libexec/apache2/mod_rewrite.so

Laravelプロジェクト内のpublicディレクトリに存在する.htaccessファイルの設定を有効化する事が出来ます。
こちらの設定を行うことでアクセスするドメイン以下、いずれのパスでアクセスしても
Laravelプロジェクトの処理起点であるpublic/index.phpを介するようになります。
(Laravelプロジェクト public/.htaccessファイル)

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

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

Virtual Hostドキュメントルート指定

ターミナルから、
sudo vi /etc/apache2/extra/httpd-vhosts.conf

/etc/apache2/extra/httpd-vhosts.confを管理者権限で開き、
インサートモードに切り替えて以下の内容に書き換えます。

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/Users/username/Sites/laravel-project/public/"
    ServerName laravel-project
    <Directory "/Users/ken/Sites/laravel-project/public/">
        Options All
    </Directory>
    ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"
    CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common
</VirtualHost>

上記のようにDocumentRootと、Directoryタグの値へ
該当のLaravelプロジェクト(今回はlaravel-project)の公開ディレクトリであるpublicディレクトリまでを指定します。
ServerNameへアクセスするドメイン名を指定します。

編集が完了したら、Apacheを再起動し設定を反映させます。
sudo apachectl restart

(/etc/hostsファイルの編集も忘れないように)

127.0.0.1       localhost  laravel-project

 

プロジェクトの所有者とグループを変更する

前述のApacheの設定を行うと指定ドメインhttp://laravel-project/で
プロジェクトへブラウザアクセス出来るようになりますが、例外が発生します。

could not be opened: failed to open stream: Permission denied
(アクセス権が無くて開けません)

composerで作成したLaravelプロジェクトのディレクトリやファイルに対して
Apacheが実行の権限を持っていないので、プロジェクトの所有者と所有グループをApacheに変更して解決します。

プロジェクトのあるパスへ移動し、

以下のコマンドを実行してプロジェクト丸ごと所有者と所有グループを変更します。
(元の所有はユーザがMacのログインユーザー、グループがstaffになっている)

sudo chown -R _www:_www laravel-project/

Apacheの実行ユーザとグループは/etc/apache2/httpd.conf内で確認出来ます。
デフォルトではどちらも _wwwでした。(apacheではなかった)

変更が完了するとApacheで実行出来るようになります。

ソースの編集を許可する

プロジェクトの所有をApacheに変更しましたが、
このままだと通常の※ユーザーに実行権限がないのでソースの編集が出来ません。
(※Macのログインユーザー)

ユーザをApacheのグループ_wwwへ所属させ、プロジェクトソースに対してグループの実行権限を与えるようにします。

ターミナルから、

Macのdsclコマンドを使用して、グループへ追加する

$ sudo dscl . -append /Groups/_www GroupMembership (ユーザ名)

グループの所属ユーザーを確認する

$ dscl . -read /Groups/_www

こちらを実行して表示される「GroupMembership:」にユーザーが存在していればOKです。

プロジェクトのあるパスへ移動して、グループの実行権限を与えます。
sudo chmod -R 775 laravel-project/

こちらの設定でエディタでの編集が可能になり、Laravelの簡易サーバでも今まで通り実行出来ます。

簡易サーバーでも実行出来るようにしたい場合

前述のプロジェクトの所有者を変更する方法だと当然Apacheでしか実行出来なくなります。
もし、Laravelの簡易サーバ(php artisan serveコマンド)とApacheのどちらでも実行出来るようにしておきたいという場合は
所有者、グループを変更するのではなくソースの権限を広くします。

chmodコマンドを実行しアクセスエラーとなったディレクトリ、ファイルのパーミッションを変更します。

ターミナルからプロジェクトのあるパスへ移動してコマンド実行。

(上の画像の場合)
sudo chmod -R 777 storage/framework/sessions/

参考:
【apache】mod_rewriteの設定について
PHPフレームワーク「Laravel」における処理の流れと、ルーティングを理解しよう

Follow me!