AWS EC2にLaravelアプリをデプロイする時に注意すべきポイント
Laravel フレームワークで作った LAMP スタックなアプリケーションを AWS の EC2 にデプロイしました。
ファイルをアップロードしてDBを設定すれば動くでしょと思っていましたが、結構大変な作業になってしまいました。
デプロイ方法について
丸ごとデプロイしています
htdocsディレクトリにプロジェクトディレクトリを丸ごと配置する方法をとっています。
サーバー側でcomposerは使っていません
開発環境のvendorディレクトリを丸ごとプロジェクトディレクトリ配下にコピーしました。
.htaccess を作成する
/opt/bitnami/apache2/htdocs/{プロジェクト}/.htaccess
を作成します。
▼中身
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ ^$1 [N] RewriteCond %{REQUEST_URI} (\.\w+$) [NC] RewriteRule ^(.*)$ public/$1 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ server.php </IfModule>
storage ディレクトリに書き込めるようにする
/opt/bitnami/apache2/htdocs/timecard/storage
というディレクトリ以下にはログ出力先の logs ディレクトリなど、Apache が書き込む場所があります。
storage ディレクトリの所有者、所有グループはともに bitnami だと思います。Bitnami では Apache は daemon ユーザー/グループで動作しますので、storage ディレクトリに書き込む権限がありません。そこで所有者グループを bitnami から daemon に変更して書き込めるようにします。
sudo chgrp -R daemon /opt/bitnami/apache2/htdocs/timecard/storage
【超重要】エラー画面のサーバー情報を伏せ字にする
これをやらないと、エラー画面に DBのパスワード など様々なサーバー情報が表示されてしまいます。ヤバすぎ。
▼修正ファイル
/opt/bitnami/apache2/htdocs/{プロジェクト}/config/app.php
▼最後あたりに debug_blacklist を追記します
return [ ・・・ // ここから 'debug_blacklist' => [ '_COOKIE' => array_keys($_COOKIE), '_SERVER' => array_keys($_SERVER), '_ENV' => array_keys($_ENV), ], // ここまで追記 ];
▼これでエラーになっても大丈夫
開発中は便利ですが、こんな重要な情報を設定一つで隠せないのはどうなの?とは思います。
.ENV ファイルの修正
環境設定ファイルである .ENV は以下のように修正しました。
APP_ENV=production APP_DEBUG=false APP_URL={プロジェクトのURL} DB_HOST=localhost DB_PASSWORD={Bitnamiのアプリケーションパスワード} MAIL_DRIVER=smtp MAIL_HOST=smtp.office365.com MAIL_PORT=587 MAIL_USERNAME={Office365の任意のアカウントのID} MAIL_PASSWORD={Office365の任意のアカウントのパスワード} MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS={Office365の任意のアカウントのID} MAIL_FROM_NAME="株式会社アーザス"
メール部分はOffice365のSMTPサーバを使用した場合の設定です。
今回は composer install していないので、APP_KEY は開発環境で生成された値のままです。
気になる方は
php artisan key:generate
で APP_KEY を生成しましょう。
SSL対応
ALB + ACM でサイトのSSL化をしています。そんな時はこのファイル
/opt/bitnami/apache2/htdocs/{プロジェクト}/app/Http/Middleware/TrustProxies.php
の一部を修正すれば、route() や asset() で出力されるパスがセキュアになります。
▼これだけ
//protected $proxies; protected $proxies = '**';
$url->forceScheme(‘https’); を使ったり、route() を url() にしたり、asset() のパラメータを変更して何とかセキュアにしようとしていましたが、こんな簡単なことでした。ずいぶん回り道をしました。
MySQL
MySQLのスキーマを設定したり、初期データの登録をします。
phpMyAdmin を使っても良いですし、せっかくLaravel を使っているので
php artisan migration
してもOKです。
もし動かなかったら
画面さえ表示されず5xx系エラー
Laravel フレームワーク自体が正常に動いていない可能性があるので、apacheのエラーログを見ましょう。
/opt/bitnami/apache2/logs/error_log
画面は表示されるが色々とおかしい
アプリケーションに問題があるので、Laravel のログを見ましょう。
/opt/bitnami/apache2/logs/error_log/laravel-{yyyy-mm-dd}.log
最後に
最初はPHPアプリケーションのデプロイですのでそこまで深く考えていませんでした。
でも Laravel、SSL、EC2、ALB が絡むと結構面倒ですね。