Laravel で書いた Web アプリを Heroku で運用してみて気づいた注意点を書きます。
PHPバージョン
Heroku で使用する PHP のバージョンは composer.json
の require
で指定します。
"require": {
"php": "~7.1.0"
},
上の記述ですと、PHP は 7.1 系に固定されます。変更を Heroku に反映させるためには一度 composer update
コマンドを実行し composer.lock
ファイルを生成してからデプロイしましょう。
Laravel プロジェクトを作成すると PHP バージョンの設定は "php": ">=7.0.0"
(Laravel 5.5の場合)等と記述されており、常に最新版が使用されるように書かれています。この設定のままですと、Heroku で新たな PHP バージョンがリリースされた後にデプロイすると自動的にアプリケーションで使用する PHP バージョンが切り替わります。
PHPのバージョンアップに際して後方互換性のない変更があった関数や機能を使っていると、自動的にアプリケーションが動かなくなります
私は実際、意図せず PHP 7.1 から 7.2 にバージョンアップしてしまい一部機能が動かなくなったことがあったので、バージョンは固定することをお勧めします。。。
APP_KEY
APP_KEY
の Heroku での設定方法です。
下記コマンドを実行すると APP_KEY
の値が生成され、ターミナルに出力されます。
heroku run "php artisan key:generate --show" --app=foo_bar
# 出力例 -> base64:NdG/+7usihflcmirgjs8ejpcy985mY9kfO/ANY2sW/Y=
次にその出力された値を Heroku の設定画面に登録します。Dashboard 画面の Settings タブ > Config Variables > Reveal Config Varsボタンをクリック。
すると設定フォームが現れるので、KEY
に APP_KEY
、VALUE
に先ほどの出力値を入力し、Add ボタンをクリックすればOKです。
いろいろ説明しましたが、こちらのコマンド一発で設定できます。
$ heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show)
エラーログ
ログの出力先を config/app.php
で以下のように指定すると、heroku log
コマンドでアプリケーションログを閲覧できます。
return [
// ...
'log' => 'errorlog',
// ...
];
本番環境以外ではアプリケーション内にログを出力したいときは、設定値を .env
ファイルに逃がしてあげると良いでしょう。
return [
// ...
'log' => env('LOG_OUTPUT', 'errorlog'),
// ...
];
LOG_OUTPUT=daily
2018/12/10 追記
Laravel 5.7 の config ディレクトリは構成が変わっていて、logging.php
にログ周りの設定は記述します。環境変数 LOG_CHANNEL
にログの出力先を指定できるようになっているので、コードを書き換える必要はなく、Heroku 側のセッティングを errorlog
にしてやれば OK です。
$ heroku config:set LOG_CHANNEL=errorlog
ファイルシステム
※ Laravel固有の話題ではありません。
まず Heroku の仕様として、アプリが動いている環境(dyno)が停止または再起動するたびにバージョン管理していない静的ファイルは消去されます。この仕組みは「Ephemeral filesystem」と呼ばれます。Ephemeral というのは儚い、短命な、という意味ですね。
例えばユーザーがアップロードした画像ファイルを普通にアプリケーション内に保存しておくと、デプロイを行うたびに環境は再起動されるため、そのファイルは消えてしまいます。
解決策としては、アップロードファイルはS3などの外部領域に保存します。Laravel なら簡単に S3 との通信処理を実装できます(公式マニュアル)。
初めて Heroku を導入した時はこれを知らなくて、「アップロードした写真が反映されない!」と、ちょっと焦りました
php.ini
php.ini
の設定を適用するためには public
ディレクトリに .user.ini
というファイルを作成し、そこに設定を書き込みます。
post_max_size = 20M
upload_max_filesize = 5M
以上、HerokuでLaravelアプリを動かすときの注意点でした。