EC2 でLaravel 9 (PHP8 + Nginx1.2 + RDS MySQL) の環境構築

# はじめに
EC2でLaravel9を構築する機会があったため、まとめておきます

# 事前構築
- vpc subnetなどのネットワーク
- RDS
- EC2 (Amazon linux 2)

# EC2 初期設定
EC2起動後、初期設定を行います。
不要であれば、飛ばして構いません。

## タイムゾーンを日本に変更

```terminal
$ date
2022年  8月 23日 火曜日 09:56:37 UTC

$ sudo vim /etc/sysconfig/clock
```

```diff_conf:/etc/sysconfig/clock
- ZONE="UTC"
- UTC=true
+ ZONE="Asia/Tokyo"
+ UTC=False
```

```terminal
$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime

$ date
2022年  8月 23日 火曜日 18:56:32 JST
```

## SSHのポート変更
SSHのデフォルトポートである22から49120に変更します。
```terminal
$ sudo vim /etc/ssh/sshd_config
```

```diff_conf:/etc/ssh/sshd_config
+ Port 49120
```
sshdを再読み込みすると、次回からsshポートは49120になります。

```terminal
$ sudo service sshd reload
```

セキュリティーグループのsshのインバウンドルールの変更を忘れずにしましょう。

変更前![スクリーンショット 2022-08-23 18.48.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/d065da55-d64d-9633-119b-2e6dfb9abae9.png)
↓
変更後
![スクリーンショット 2022-08-23 18.47.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/f8ba3408-c6ad-6d60-7d33-7c6122921eb9.png)


# phpインストール
phpをインストールします。
```terminal
$ cd 

$ sudo yum update -y


// amazon-linux-extras パッケージがあるか確認
$ amazon-linux-extras

// php8.0を有効化
$ sudo amazon-linux-extras enable php8.0

// php8.0をインストール
$ sudo amazon-linux-extras install -y php8.0

// laravelで必要なモジュールをインストール
$ sudo yum install -y php-mbstring php-xml php-bcmath

// metadataを削除
$ yum clean metadata
```


# nginxインストール

```terminal
$ cd 

// nginx1.2を有効化
$ sudo amazon-linux-extras enable nginx1

// nginx1.2をインストール
$ sudo amazon-linux-extras install nginx1

// metadataを削除
$ yum clean metadata

// nginxのmod類をインストール
$ sudo yum -y install nginx-mod*

// インストールされたか確認
$ rpm -qa|grep nginx
```

# php-fpmの設定ファイル修正

```terminal
$ sudo vim /etc/php-fpm.d/www.conf
```

```diff_conf:/etc/php-fpm.d/www.conf
- user = apache
- group = apache
- ;listen.owner = nobody
- ;listen.group = nobody
- ;listen.mode = 0660

+ user = nginx
+ group = nginx
+ listen.owner = nginx
+ listen.group = nginx
+ listen.mode = 0660
```
再起動
```terminal
$ sudo systemctl restart nginx
$ sudo systemctl restart php-fpm
```

# nginxとphp-fpmの自動起動設定
```terminal
sudo systemctl enable nginx
sudo systemctl enable php-fpm
```

再起動して、EC2のpublic IPでブラウザを開くと、nginxのデフォルト画面が確認できます。
セキュリティーグループは、httpの80番のportを開けましょう。
```terminal
$ sudo systemctl restart nginx
$ sudo systemctl restart php-fpm
```
![スクリーンショット 2022-08-22 18.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/af6b486a-eaa1-c13d-1cf8-2b691689b879.png)

# composerをインストール

下記のウェブサイトが最新なので、そちらを参考にしましょう。

https://getcomposer.org/download/


```terminal
$ cd 

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

$ php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

$ php composer-setup.php

$ php -r "unlink('composer-setup.php');"

$ sudo mv composer.phar /usr/local/bin/composer

// composerのバージョンを確認しましょう。
$ composer -V
```

# laravelをインストール
laravelは、`/var/www/html`のパスになるようプロジェクトを作成します。
```terminal
$ cd /var
$ sudo mkdir /var/www
$ sudo chown ec2-user:nginx /var/www
$ composer create-project --prefer-dist laravel/laravel html

$ cd html

// ディレクトリは、所有権限775にします
$ sudo find ./ -type d -exec chmod 775 {} +
// ファイルは、所有権限664にします
$ sudo find ./ -type f -exec chmod 664 {} +

$ sudo chown -R nginx:ec2-user ./

// storage bootstrap/cacheは、所有権限777にします
$ sudo chmod -R 777 storage bootstrap/cache
```

envファイルは、作成したRDSをもとに修正します。

```terminal
$ sudo vim .env
```
```/var/www/html/.env
DB_CONNECTION=mysql
DB_HOST=RDSのライターエンドポイント
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```

**APP_KEY=** が空の場合、`php artisan key:generate`でkeyが作成され、.envに鍵情報が入ります。

## nginx.confを修正
`/etc/nginx/nginx.conf`を一部修正します。

```terminal
$ sudo vim /etc/nginx/nginx.conf
```
```diff_conf:/etc/nginx/nginx.conf
# 〜〜省略
    server {
        listen       80;
        listen       [::]:80;
-       server_name  _;
+       server_name  test.com;
-       root         /usr/share/nginx/html;
+       root         /var/www/html/public;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
+       location / {
+           try_files $uri $uri/ /index.php?$query_string;
+       }
-       error_page 404 /404.html;
-       location = /404.html {
-       }

-       error_page 500 502 503 504 /50x.html;
-       location = /50x.html {
-       }
    }
# 〜〜省略
```

`server_name`はドメインが決まっている場合、変更しましょう。
EC2のpublic IPでアクセスする場合、変更する必要はありません。

修正後、nginxを再起動(読み込み)すると、laravelのトップ画面が表示されます。
```terminal
$ sudo nginx -s reload
```

![スクリーンショット 2022-08-22 19.10.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/558610e4-eea8-73d1-4e70-ae78378cabd3.png)


# 参考記事

https://qiita.com/ntm718/items/f896c8e4fb801777954b

https://qiita.com/assy-nkm/items/0bcc6564538a0604b2ce