Heroku スターターガイド (Laravel)
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年05月04日(木)
Table of Contents
このガイドでは、Laravel 5 アプリケーションの設定とデプロイについて順に説明します。Heroku で PHP を使用するための一般的な概要については、『Heroku スターターガイド (PHP)』を参照してください。
前提条件
- PHP (および理想的には一部の Laravel) に関する知識。
- Heroku ユーザーアカウント。無料ですぐにサインアップできます。
- PHP、Composer、および Heroku CLI がコンピューターにインストールされ、『Heroku スターターガイド (PHP)』に精通していること。
Laravel アプリケーションの作成
このチュートリアルのアプリケーションは、『Laravel インストール』ガイドに基づいています。この記事の手順に従う前に一読することをお勧めします。
新しい Laravel プロジェクトのインストール
composer create-project
コマンドは、laravel/laravel 標準アプリケーションスケルトンに基づいて新しいプロジェクトを立ち上げられる方法の 1 つです。下のコマンドは、最新版のフレームワークを使用して、hello_laravel_heroku
という名前のディレクトリ内にこのプロジェクトを設定します。
多数の依存関係をダウンロードし、いくつかのフックを実行した後、Composer は、指定したディレクトリ内で完全に機能的なプロジェクトを設定するので、そのディレクトリへ cd
で移動できます。
$ composer create-project laravel/laravel --prefer-dist hello_laravel_heroku
Installing laravel/laravel (v5.1.11)
- Installing laravel/laravel (v5.1.11)
Downloading: 100%
Created project in hello_laravel_heroku
...
...
$ cd hello_laravel_heroku
Git リポジトリの初期化
ここで、Get リポジトリを初期化し、現在の状態をコミットします。
$ git init -b main
Initialized empty Git repository in ~/hello_laravel_heroku/.git/
$ git add .
$ git commit -m "new laravel project"
[main (root-commit) 6ae139d] new laravel project
76 files changed, 5458 insertions(+)
...
Heroku にデプロイする
アプリケーションを Heroku にデプロイするには、正しい設定で Web サーバーを起動するために使用するコマンドを Heroku に指示する Procfile
を最初に作成する必要があります。作成し終えたら、Heroku 上にアプリケーションインスタンスを作成し、いくつかの Laravel 環境変数を設定し、単に git push
を行ってコードをデプロイします。
Procfile
の作成
デフォルトで、Heroku は、PHP とともに Apache Web サーバーを起動して、プロジェクトのルートディレクトリからアプリケーションを提供します。
ただし、アプリケーションのドキュメントルートは public/
サブディレクトリであるので、正しいドキュメントルートを設定する Procfile
を作成する必要があります。
$ echo "web: heroku-php-apache2 public/" > Procfile
$ git add .
$ git commit -m "Procfile for Heroku"
[main 1eb2be6] Procfile for Heroku
1 file changed, 1 insertion(+)
create mode 100644 Procfile
Heroku での新しいアプリケーションの作成
プッシュ先として使用できる新しい Heroku アプリケーションを作成するには、heroku create
コマンドを使用します。
$ heroku create
Creating mighty-hamlet-1982... done, stack is heroku-18
http://mighty-hamlet-1982.herokuapp.com/ | git@heroku.com:mighty-hamlet-1982.git
Git remote heroku added
ご覧のように、アプリケーションにはランダムな名前が自動的に選択されました (上記の例では mighty-hamlet-1982
)。
これでアプリケーションをデプロイする準備がほとんど整いました。次のセクションに従って、Laravel アプリが正しい設定で実行していることを確認します。
Laravel 暗号化鍵の設定
アプリケーションの暗号化鍵は、ユーザーセッションや他の情報を暗号化するために Laravel により使用されます。この値は APP_KEY
環境変数から読み取られます。
設定では、選択した暗号のルールに準拠する必要があるので、有効な鍵を生成する最も簡単な方法は php artisan key:generate --show
コマンドを使用する方法で、これはコピーした後に次のステップにペーストできる鍵を出力します。
単に heroku config
コマンドを使用して環境変数を設定できるので、初めてアプリをデプロイする前に、最後のステップとして heroku config:set
を実行します。
$ heroku config:set APP_KEY=…
Setting config vars and restarting mighty-hamlet-1982... done, v3
APP_KEY: ZEqur46KTEG91iWPhKGY42wtwi3rtkx2
上記のコマンドの …
を php artisan key:generate --show
コマンド出力からコピーした鍵に置き換えます。
上記のコマンドの …
プレースホルダーを手動で置き換える代わりに、
heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show)
を実行することもできます。
Heroku へのプッシュ
次に、Heroku にデプロイします。
$ git push heroku main
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 379 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Fetching custom git buildpack... done
remote: -----> PHP app detected
remote: -----> Resolved 'composer.lock' requirement for PHP to version 5.6.14.
remote: -----> Installing system packages...
remote: - PHP 5.6.14
remote: - Apache 2.4.10
remote: - Nginx 1.6.0
remote: -----> Installing PHP extensions...
remote: - mbstring (composer.lock; bundled)
remote: - zend-opcache (automatic; bundled)
remote: -----> Installing dependencies...
remote: Composer version 1.0.0-alpha10 2015-04-14 21:18:51
remote: Loading composer repositories with package information
remote: Installing dependencies from lock file
...
remote: - Installing laravel/framework (v5.1.19)
remote: Downloading: 100%
remote:
remote: Generating optimized autoload files
remote: Generating optimized class loader
remote: Compiling common classes
remote: -----> Preparing runtime environment...
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing... done, 74.5MB
remote: -----> Launching... done, v5
remote: https://mighty-hamlet-1982.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/mighty-hamlet-1982.git
1eb2be6..1b70999 main -> main
以上です。heroku create
により提供された URL を手動で指定するか、Heroku CLI を使用して新しいブラウザーウィンドウを立ち上げることによって、現在ブラウザーを開いている場合、アプリケーションが応答します。
$ heroku open
Opening mighty-hamlet-1982... done
「Laravel 5」というメッセージがブラウザーに表示されます。
ベストプラクティス
本番用ログ記録先の変更
デフォルトで、Laravel はエラーやメッセージのログをディスク上のディレクトリに記録しますが、これは、Heroku が 一時的なファイルシステムを使用し、実行中のすべての dyno にわたるイベントのストリームとしてログを扱うので理想的ではありません。
エラーが発生した場合、エラーが heroku logs
に表示されていることを確認するには、すべての関連するチャネルで errorlog
ドライバーを使用するように config/logging.php
での対応する設定を変更する必要があります。たとえば次のようになります。
<?php
return [
'default' => env('LOG_CHANNEL', 'stack'),
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
],
'single' => [
'driver' => 'errorlog',
'level' => 'debug',
],
…
必ず次の変更内容を追加、コミット、および適切な場合はプッシュしてください。
$ git add config/logging.php
$ git commit -m "use errorlog"
[main 1b70999] use errorlog
1 file changed, 1 insertion(+), 1 deletion(-)
$ git push heroku main
上記のコードスニペットで確認できるように、最新の標準的な Laravel インストールではすでに、LOG_CHANNEL
環境変数を優先してデフォルトのログ書き込み先を決定しています。
Laravel のデフォルトのログ記録設定でも errorlog
がログ記録チャネルであるため、この環境変数を使用して、コードを変更せずにアプリのログ書き込み先を設定できます。
$ heroku config:set LOG_CHANNEL=errorlog
ロードバランサーを信頼する
Heroku の HTTP ルーティングは、とりわけロードバランシングと SSL 接続の終了を担っているリバースプロキシのレイヤーを通過するように各リクエストをルーティングします。これは、dyno が受信したリクエストの REMOTE_ADDR
環境変数には最後のルーターの IP アドレスが含まれ、元のリクエストが HTTPS で送信されるようになっていても、内部リクエストは常に HTTP プロトコルを使用するように強制されるということを意味します。
ほとんどの一般的なロードバランサーまたはリバースプロキシと同様に、Heroku は元のリクエスト情報を X-Forwarded-…
ヘッダーで提供します (ここ)を参照)。Laravel は、HTTP リクエストの処理に Symfony フレームワークのコンポーネントを使用します。 Symfony は、簡単に、このようなヘッダーを信頼するように設定できます。
Heroku はすべてのリクエストを最初にロードバランサーを通じてアプリケーションに送信し、そのロードバランサーが常にヘッダーを設定するので (クライアントがそれらの値を偽造することを不可能にします)、信頼されるプロキシとして現在のリモートアドレス (これが Heroku ルーター) を扱うように Laravel を設定できます。
Heroku のルーターは Forwarded
および X-Forwarded-Host
ヘッダーを設定しないので、Laravel がこれらのヘッダーを信頼できないようにすることも非常に重要ですが、Symfony の Request コンポーネントは信頼されるプロキシが設定された後すぐにそれらを信頼します。
プロキシを信頼するための Laravel のドキュメントに従って、最終的な App\Http\Middleware\TrustProxies
ミドルウェアは次のようになります。
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
protected $proxies = '*';
protected $headers = Request:: HEADER_X_FORWARDED_AWS_ELB;
}
このアプローチでは、アプリケーションを他の環境にデプロイした場合、すべてのトラフィックが信頼されるソースを通じて到着することを、同様に確認するか、アプリケーションが実行している環境として Heroku を検出したときに、信頼されるプロキシだけを条件付きで設定する必要があります。
参考情報
- 「Heroku PHP サポート」Dev Center の記事を読み、使用可能なバージョン、拡張、機能、および動作について学習します。
- Apache、Nginx、および PHP の設定の詳細については、PHP の Web サーバーおよびランタイム設定のカスタマイズに関する手順を確認してください。
- その他のリソースについては、「Dev Center での PHP カテゴリ」を参照してください。