今回の記事ではAWSでEC2を利用したlaravelデプロイ方法に関して記載します。
AWSでEC2まで構築済み+ターミナルからEC2にログイン後からの作業を想定しています。
phpインストール
今回はphp7.3をインストール
$ sudo amazon-linux-extras install php7.3
$ sudo yum install php-mbstring php-pecl-memcached php-gd php-apcu php-xml
Apacheインストール
$ sudo yum install httpd
$ sudo systemctl start httpd
Composerインストール
[studyrecord@web1 ~]$ curl -sS https://getcomposer.org/installer | php
mvでcomposerファイルの移動
[studyrecord@web1 ~]$ sudo mv composer.phar /usr/local/bin/composer
laravelインストール前にzip unzipもインストールしておく
[studyrecord@web1 ~]$ sudo yum install -y zip unzip
root権限でexport PATH=$PATH:/usr/local/binのパスを通してcomposerのバージョンが表示されればOK
基本的にroot権限ではcomposerのインストールは推奨されていないですが、ここではhtmlディレクトリの権限を変更するか、root権限でそのままダウンロードするしかないので、root権限で実行しています
[studyrecord@web1 ~]$ cd /var/www/html
[studyrecord@web1 html]$ composer --version
Composer version 1.10.10 2020-08-03 11:35:19
[studyrecord@web1 html]$ sudo -i
[root@web1 ~]# composer --version
-bash: composer: コマンドが見つかりません
[root@web1 ~]# echo $PATH
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@web1 ~]# export PATH=$PATH:/usr/local/bin
[root@web1 ~]# composer --version
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Composer version 1.10.10 2020-08-03 11:35:19
Gitインストール
[studyrecord@web1 ~]$ sudo yum install git
ディレクトリ移動してgithubからpullする
[studyrecord@web1 ~]$ cd /var/www/html
[studyrecord@web1 html]$ sudo git clone githubのurl
mysql接続およびDB作成
EC2からRDSへ接続し、データベース作成
ユーザー名はRDS作成時に作成したものを使用します
[studyrecord@web1 html]$ mysql -h DBのエンドポイント -u ユーザー名 -p
mysql> CREATE DATABASE DB名;
Query OK, 1 row affected (0.01 sec)
envとdatabase.phpの編集
laravelのディレクトリに移動して編集します
[root@web1 studyrecord]# vim .env
DB_CONNECTION=mysql
DB_HOST=DBのエンドポイント
DB_PORT=3306
DB_DATABASE=DB名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
[root@web1 studyrecord]# vim config/database.php
'host' => env('DB_HOST', 'DBのエンドポイント'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'DB名'),
'username' => env('DB_USERNAME', 'ユーザー名'),
'password' => env('DB_PASSWORD', 'パスワード'),
'unix_socket' => env('DB_SOCKET', ''),
マイグレーションファイルの作成
php artisan migrateでテーブル作成後、作成できているか確認しましょう
[root@web1 studyrecord]# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.1 seconds)
Migrating: 2020_07_19_144033_create_studyrecord_table
Migrated: 2020_07_19_144033_create_studyrecord_table (0.06 seconds)
mysql> show databases;
+----------------------+
| Database |
+----------------------+
| information_schema |
| mysql |
| performance_schema |
| study_record_service |
+----------------------+
4 rows in set (0.00 sec)
mysql> use study_record_service;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+--------------------------------+
| Tables_in_study_record_service |
+--------------------------------+
| migrations |
| studyrecords |
| users |
+--------------------------------+
3 rows in set (0.00 sec)
権限とApacheの設定変更
権限を変更しないと動かないので変更しておきます
[root@web1 studyrecord]# chmod 777 bootstrap/cache -R
[root@web1 studyrecord]# chmod 777 storage -R
laravelではpublicディレクトリ内のindex.phpで全てのアクセスを受け、アクセス元のURLをみて各コントローラーに振り分けているのでDocumentRootをpublicディレクトリに変更する
[root@web1 studyrecord]# vim /etc/httpd/conf/httpd.conf
DocumentRootの変更
118 #
119 DocumentRoot "/var/www/html/studyrecord/public"
120
.htaccessの有効化
150 #
151 AllowOverride All
152
apacheの構文チェックをして再起動する
[root@web1 studyrecord]# httpd -t
Syntax OK
[root@web1 studyrecord]# systemctl restart httpd
[root@web1 studyrecord]# systemctl status httpd
アクセスログ確認
[root@web1 studyrecord]# tail -f /var/log/httpd/access_log
laravelリンクのhttps化
ロードバランサーでhttpsを待ち受け、内部のEC2にhttpで転送する場合、laravel内ではhttpで動作していることになる
なので、routeやredirectが全てhttp://となってしまう
対策として/app/Http/Middleware/TrustProxies.phpに信頼できるアクセス元を記入する
ALBのプライベートアドレスを追加する(今回はサブネットマスクと紐づけているためサブネットマスクのIPアドレスを記入している)
[root@web1 Middleware]# pwd
/var/www/html/studyrecord/app/Http/Middleware
[root@web1 Middleware]# vim TrustProxies.php
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array|string|null
*/
protected $proxies=[
'172.16.3.0/24',
'172.16.4.0/24'
];
/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
おまけ①(cron設定)
※cronの設定
[root@web1 logs]# crontab -e
crontab: installing new crontab
[root@web1 logs]# crontab -l
* * * * * php /var/www/html/studyrecord/artisan schedule:run >> /dev/null 2>&1
[root@web1 studyrecord]# systemctl restart crond.service
[root@web1 studyrecord]# systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2020-08-23 14:47:56 JST; 9s ago
Main PID: 4980 (crond)
CGroup: /system.slice/crond.service
└─4980 /usr/sbin/crond -n
8月 23 14:47:56 web1 systemd[1]: Stopped Command Scheduler.
8月 23 14:47:56 web1 systemd[1]: Started Command Scheduler.
8月 23 14:47:56 web1 crond[4980]: (CRON) INFO (Syslog will be used instead of sendmail.)
8月 23 14:47:56 web1 crond[4980]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 37% if used.)
8月 23 14:47:56 web1 crond[4980]: (CRON) INFO (running with inotify support)
8月 23 14:47:56 web1 crond[4980]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
おまけ②(名前をつける)
[studyrecord@ここの名前を変えたい時 ~]$ sudo hostnamectl set-hostname web1
[studyrecord@web1 ~]$