2018.01.08

HerokuでLaravelアプリを動かすときの注意点5つ


Laravel で書いた Web アプリを Heroku で運用してみて気づいた注意点を書きます。

PHPバージョン

Heroku で使用する PHP のバージョンは composer.jsonrequire で指定します。

composer.json
"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ボタンをクリック。

heroku_setting_1.png

すると設定フォームが現れるので、KEYAPP_KEYVALUE に先ほどの出力値を入力し、Add ボタンをクリックすればOKです。

heroku_setting_2.png

いろいろ説明しましたが、こちらのコマンド一発で設定できます。

$ heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show)

エラーログ

ログの出力先を config/app.php で以下のように指定すると、heroku log コマンドでアプリケーションログを閲覧できます。

config/app.php
return [
    // ...
    'log' => 'errorlog',
    // ...
];

本番環境以外ではアプリケーション内にログを出力したいときは、設定値を .env ファイルに逃がしてあげると良いでしょう。

config/app.php
return [
    // ...
    'log' => env('LOG_OUTPUT', 'errorlog'),
    // ...
];
.env
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 というファイルを作成し、そこに設定を書き込みます。

.user.ini
post_max_size = 20M
upload_max_filesize = 5M

以上、HerokuでLaravelアプリを動かすときの注意点でした。