(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設定詳細については下記を参照
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」における処理の流れと、ルーティングを理解しよう