AWSへのlaravelデプロイ方法

Pocket

今回の記事では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 ~]$