chikoblog

やってみたことの掃溜め

EC2/PHP7.4/Apache/Aurora MySQLでLaravel環境を作ってみた

少し前に業務でEC2/PHP7.4/Apache/Aurora MySQLでLaravel環境を作成したのでそのナレッジを残しておきます。

作業手順

今回利用したインスタンスタイプはt2.mediumですがt2.microとかでも同じ設定で作成は可能です。

環境構築

今回は単純なEC2(WEB)1台、Aurora1台構成の設定となります。
EC2とAuroraは通信可能なセキュリティグループを設定しておいてください。

ざっくりした図を書くと以下のような感じです。 f:id:Chiko_gorilla:20200305210538p:plain

気が向いたら環境作成用のテンプレートを作っておきます。

日付をJSTに設定する

EC2は初期の日付がUTCになっているので必要であれば以下の手順で変更します。

まずdateコマンドで現在の設定を確認します。

$ date
Tue Mar  3 07:21:04 UTC 2019

念のため/etc/llocaltimeのバックアップをcpコマンドで作成します。

$ ls /etc/localtime*
/etc/localtime
$ sudo cp /etc/localtime /etc/localtime.org
$ ls /etc/localtime*
/etc/localtime  /etc/localtime.org

タイムゾーンJSTに変更します。

$ sudo ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ date
Tue Mar  3 16:41:30 JST 2019
$ strings /etc/localtime
TZif2
TZif2
JST-9

再起動でタイムゾーンが戻らないように/etc/sysconfig/clockファイルに設定を書き込みます。
※書き込みをおこなう前に念のためcpコマンドでバックアップを作成します。

$ sudo cp /etc/sysconfig/clock /etc/sysconfig/clock.org
$ sudo vim /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false
$ diff /etc/sysconfig/clock /etc/sysconfig/clock.org
1,2c1,2
< ZONE="Asia/Tokyo"
< UTC=false
---
> ZONE="UTC"
> UTC=true

設定を反映させるためにrebootコマンドで再起動をおこないます。

$ sudo reboot
Swap設定

Swap設定の設定がされていないインスタンの場合ですと、
EC2にLaravelをインストールする際インスタンスによってメモリ不足でエラーになる時があります。その際は以下を参考にしてSwap設定をおこなってください。

freeコマンドでSwapの利用状況の確認をおこないます。
以下のようにSwapの結果が0の場合はSwapの設定が必要となります。

$ free
                       total          used             free    shared    buff/cache      available
Mem:        4037608      100016     3074136         468         863456      3708216
Swap:                    0                0                0

念のためgrepコマンドを使って/proc/meminfoでも確認しておきます。

$ grep Mem /proc/meminfo
MemTotal:        4037608 kB
MemFree:         3074136 kB
MemAvailable:    3708244 kB
$ grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB

以下のコマンドで512MBのSwapを作成します。

$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 0.277538 s, 1.9 GB/s

先ほど作成したswapfile1があるか念のため確認します。

$ ll /swapfile1
-rw-r--r-- 1 root root 536870912 Mar  3 16:47 /swapfile1

swapfile1ファイルの権限を変更し、フォーマットをおこないます。

$ sudo chmod 600 /swapfile1
$ sudo mkswap /swapfile1
Setting up swapspace version 1, size = 512 MiB (536866816 bytes)
no label, UUID=2331f2ba-449d-45ca-8d96-29e1fd7d1862

作成したswapfile1ファイルを有効化します。

$ sudo swapon /swapfile1
$ sudo swapon -s
Filename                Type        Size    Used    Priority
/swapfile1                          file            524284                0         -2

システムリブートでswapfile1ファイルを認識できるよう以下の設定をします。

$ sudo cp -p /etc/fstab /etc/fstab.org
$ sudo sh -c "echo '/swapfile1 swap swap defaults 0 0' >> /etc/fstab"
$ cat /etc/fstab | grep swapfile1
/swapfile1 swap swap defaults 0 0

Swapが設定できたことを確認します。

$ free
                       total          used            free    shared    buff/cache      available
Mem:        4037604       77708     3745892         412         214004      3747868
Swap:          524284               0       524284
PHP7.4/Apache/php-mysqlndなどのアプリインストール

まずはパッケージを最新にします。

$ sudo yum update -y

Amazon Linuxが持っているリポジトリPHP5.4しか入っていないので、 yumリポジトリPHP7.4が入っているremiリポジトリを使えるようにしてあげます。

対象のEC2にepel-releaseパッケージをインストールを行うため、下記のコマンドを実行します。

$ sudo amazon-linux-extras install epel -y
$ sudo yum install epel-release -y

remiリポジトリの有効化をおこないます。

$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
Retrieving http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
warning: /var/tmp/rpm-tmp.30IKQl: Header V4 DSA/SHA1 Signature, key ID 00f97f56: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:remi-release-7.7-2.el7.remi      ################################# [100%]

PHP7.4/Apacheをインストールしていきます。

$ sudo yum install -y php74 php74-php php74-php-fpm
$ sudo ln -s /usr/bin/php74 /usr/bin/php
$ php -v
PHP 7.4.3 (cli) (built: Feb 18 2020 11:53:05) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

その他Laravelに必要なPHP7.4のパッケージをインストールします。

$ sudo yum install php74-php-mbstring.x86_64 -y
$ sudo yum install php74-php-xml.x86_64 -y
$ sudo yum install php74-php-pdo.x86_64 -y
$ sudo yum install php74-php-mysqlnd.x86_64 -y

php-mysqlndのインストールをします。

$ sudo yum install php74-php-mysqlnd.x86_64 -y

mysqlコマンドを使えるようにしておきたいので下記もインストールします。

$ sudo yum install mysql-community-client mysql-community-devel
パーミッション設定

wwwグループを追加してec2-userを所属させます。

$ sudo groupadd www
$ sudo usermod -a -G www ec2-user
$ exit

一度ログアウトして再度EC2にログインします。 cat /etc/groupコマンドで設定内容の確認をおこないます。

$ cat /etc/group |grep www
www:x:1002:ec2-user

/var/www以下の所有者情報を再帰的に変更します。

$ sudo chown -R ec2-user:www /var/www
$ sudo chmod 2775 /var/www
$ find /var/www -type d -exec sudo chmod 2775 {} +
$ find /var/www -type f -exec sudo chmod 0664 {} +
Laravelインストール

まずはComposerをインストールします。

$ cd ~
$ curl -sS https://getcomposer.org/installer | sudo php
All settings correct for using Composer
Downloading...

Composer (version 1.9.3) successfully installed to: /home/ec2-user/composer.phar
Use it: php composer.phar

$ sudo cp composer.phar /usr/local/bin/composer
$ sudo ln -s /usr/local/bin/composer /usr/bin/composer

Laravelプロジェクトの作成をおこないます。

$ cd /var/www
$ sudo composer create-project --prefer-dist laravel/laravel

ドキュメントルートの変更をおこないます。

$ sudo vim /etc/httpd/conf.d/custom.conf
# ドキュメントルート
DocumentRoot "/var/www/laravel/public"

# .htaccess 有効化
<Directory /var/www/laravel/public>
    AllowOverride All
</Directory>

Apache再起動とLaravel配下のパーミッションの変更します。

$ sudo service httpd restart
$ sudo chmod -R 777 /var/www/laravel/storage
$ sudo chmod -R 777 /var/www/laravel/bootstrap/cache/

ここまで設定したらEC2のパブリック DNS名でブラウザアクセスをおこなうとLaravelの画面が見れるかと思います。 f:id:Chiko_gorilla:20200305204851p:plain

LaravelのAurora接続設定

LaravelをAuroraに接続する際に/var/www/laravel/配下の.envファイスの設定を変更する必要があります。
変更箇所は色変えておきました。

$ sudo cd /var/www/laravel/
$ sudo vim .env
~~~省略~~~
DB_HOST=Auroraのエンドポイント
DB_PORT=3306
DB_DATABASE=Aurora作成時に設定したデータベース名
DB_USERNAME=Aurora作成時に設定したDBマスターユーザ名
DB_PASSWORD=Aurora作成時に設定したDBマスターパスワード
~~~省略~~~

Auroraに接続をして、Aurora作成時に設定したデータベース名と同じデータベースを作成します。今回は例としてtestdbとします。

$ mysql -h Auroraクラスタのエンドポイント -u DBマスターユーザ名 -p
Enter password:DBマスターパスワード

mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database testdb;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testdb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

migrationの実行をおこないます。

$ sudo 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: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)

テーブルが作成されているか確認します。

$ mysql -h Auroraクラスタのエンドポイント -u DBマスターユーザ名 -p
Enter password:DBマスターパスワード

mysql> use testdb;
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_testdb   |
+--------------------+
| failed_jobs        |
| migrations         |
| users              |
+--------------------+
3 rows in set (0.03 sec)

これでEC2/PHP7.4/Apache/Aurora MySQLでLaravel環境構築は完了となります。

終わりに

純粋に作成したときにいろいろ困ったので、
メモ書きを残しておこうと思いました。

PHP7.4の利用やWEBとDBを別のインスタンスでLaravelを構築予定の方の役に立てば幸いです。