【AWS環境構築メモ⑩】EC2インスタンスにLaravel環境を構築してアプリのデプロイをする

## 0.はじめに

**作成したEC2インスタンスにLaravel環境を構築します。**
**また、RDS(MySQL)との接続とチェックも行います。**

**今回のタスクでAWS本番環境構築はおおよそ完了します!!**

**EC2 : Nginx, php-fpm**
**RDS : MySQL**

## 1.前回の記事

**[【AWS環境構築メモ⑨】RDSを作成する](https://qiita.com/yuuichimizuta/items/ac43d5e2be0c1d8f1bc2)**

## 2.前提条件

- **AWSアカウント作成済み**
- **リージョンはアジアパシフィック(東京) ap-northeast-1**
- **VPC作成済み**
- **セキュリティーグループ作成済み**
- **EC2インスタンス作成済み**
- **SSL証明書発行済み**
- **ELB作成済み**
- **Aレコードのエイリアス作成済み**
- **RDS作成済み**
- **RDS作成時のマスターユーザー名、パスワード、DB名をメモしている**

## 3.作成手順(サマリー)

|順番|手順|
|---|---|
|1|yum アップデート|
|2|PHP インストール|
|3|nginx インストール|
|4|Composer インストール|
|5|Node.js インストール|
|6|MySQL　インストール / 接続確認|
|7|Git インストール|
|8|git clone|
|9|php-fpm, nginxの設定|
|10|.envの設定|
|11|composerインストールとマイグレーション|
|12|アクセス確認|

## 4.作成手順

### 1.yum アップデート

**yum(パッケージ管理システム)のアップデート**

- **EC2にSSH接続**
- **yumのアップデート**

```
$ ssh ec2-user@関連付けたElasticIPアドレス -i ~/.ssh/キーペア名.pem
$ sudo yum update -y
```

### 2.PHP インストール

- **PHP, 拡張のインストール**
- **opcache インストール**  **[(opcacheについて(公式ドキュメント))](https://www.php.net/manual/ja/book.opcache.php)**
- **PHPインストール確認z**

```:ec2-user
// PHP, 拡張のインストール
$ sudo amazon-linux-extras enable php7.4
$ sudo yum install php-cli php-pdo php-fpm php-json php-mysqlnd -y
$ sudo yum install php-bcmath php-mbstring php-xml -y

// opcache インストール
$ sudo yum install php-opcache

// PHPのバージョン確認
$ php -v
```

- **opcache.iniの設定を変更する**

**[推奨される php.ini の設定](https://www.php.net/manual/ja/opcache.installation.php)**

```:ec2-user
$ sudo vi /etc/php.d/10-opcache.ini
```
```PHP:10-opcache.ini
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
```

- **php-fpmを起動**
- **php-fpmの状態確認**
- **自動起動に設定**

```:ec2-user
$ sudo service php-fpm start
$ sudo systemctl status php-fpm
  // Active: active (running)なら起動中

$ sudo systemctl enable php-fpm
```

### 3.nginx インストール 

- **nginxのインストール**
- **インストール確認**

```:ec2-user
// nginxのインストール
$ sudo amazon-linux-extras enable nginx1
$ sudo yum install nginx -y

// nginxのバージョン確認
$ nginx -v
```

- **nginxを起動**
- **nginxの状態確認**
- **自動起動に設定**

```:ec2-user
$ sudo systemctl start nginx
$ sudo systemctl status nginx
  // Active: active (running)なら起動中

$ sudo systemctl enable nginx
```

### 4.Composer インストール

- **Composerのインストール**
- **Composerの移動**
- **Composerのバージョン確認**

```:ec2-user
//Composerのインストール
$ sudo curl -sS https://getcomposer.org/installer | php

//composerの移動
$ sudo chown root:root composer.phar
$ sudo mv composer.phar /usr/bin/composer

//Composerのバージョン確認
$ composer -V

↓↓以下のように表示されたらOK↓↓

   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.2.6 2022-02-04 17:00:38
```

### 5.Node.js インストール

- **Node.jsのインストール**
- **Node.jsのバージョン確認**
- **gcc-c++のインストール**

```:ec2-user
// Node.jsのインストール
$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
$ sudo yum install -y nodejs

// Node.jsのバージョン確認
$ node -v

// gcc-c++のインストール
$ sudo yum -y install gcc-c++
```

### 6.MySQL　インストール / 接続確認

**EC2(Amazon Linux)にはMariaDBがデフォルトでインストールされているので、
アンインストールした後にMySQLをインストールします**

- **MariaDBのパッケージ削除**

```:ec2-user
$ sudo yum remove mariadb-*
```

- **MySQLのリポジトリをyumに追加する**
- **有効化する**
- **yumリポジトリの確認**

```:ec2-user
$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm -y
$ sudo yum-config-manager –enable mysql80-community
$ sudo cat /etc/yum.repos.d/mysql-community.repo

//以下の結果が出ていればOK
   ↓　↓　↓
[mysql-cluster-8.0-community]
name=MySQL Cluster 8.0 Community
baseurl=http://repo.mysql.com/yum/mysql-cluster-8.0-community/el/7/$basearch/
enabled=0
gpgcheck=1
```

- **MySQLのインストール**

```:ec2-user
$ sudo yum install --enablerepo=mysql80-community mysql-community-server
$ sudo yum install --enablerepo=mysql80-community mysql-community-devel

//インストール時にGPGキーに関するエラーが出た場合は以下コマンドを実行
$ sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
```

**参考 : [[MySQL] アップデート時にGPGキーのエラーで停止してしまう場合](https://blog.katsubemakito.net/mysql/mysql-update-error-gpg)**

- **MySQLのログファイル作成**

```:ec2-user
$ sudo touch /var/log/mysqld.log
```

- **インストールされたMySQLパッケージの確認**

```:ec2-user
$ yum list installed | grep mysql
//　以下が表示されたら完了
   ↓ ↓ ↓
mysql-community-client.x86_64  8.0.28-1.el7                   @mysql80-community
mysql-community-client-plugins.x86_64  8.0.28-1.el7           @mysql80-community
mysql-community-common.x86_64  8.0.28-1.el7                   @mysql80-community
mysql-community-devel.x86_64   8.0.28-1.el7                   @mysql80-community
mysql-community-icu-data-files.x86_64  8.0.28-1.el7           @mysql80-community
mysql-community-libs.x86_64    8.0.28-1.el7                   @mysql80-community
mysql-community-server.x86_64  8.0.28-1.el7                   @mysql80-community
mysql80-community-release.noarch
```

- **MySQLのバージョン確認**

```:ec2-user
$ mysqld --version
```

- **MySQLの起動**
- **状態確認**
- **自動起動に設定**

```:ec2-user
$ sudo systemctl start mysqld.service
$ sudo systemctl status mysqld.service
$ sudo systemctl enable mysqld.service
```

- **MySQLの接続確認**
  - エンドポイントは作成したRDSの[接続とセキュリティ]から確認できます
  - マスターユーザー、パスワードはRDS作成時に設定したもの

```:ec2-user
$ mysql -h エンドポイント -u 設定したマスターユーザー名 -p
Enter password:設定したパスワード

//以下のように表示されたら接続成功
  ↓ ↓ ↓
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 313101
Server version: 8.0.27 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

### 7.Git インストール

- **Gitのインストール**
- **Gitのバージョン確認**

```:ec2-user
$ sudo yum install git -y
$ git --version
```

### 8.git clone

**/var/www/にGitHubのリポジトリをクローンする**

- **/var/www/に移動**
  - もし存在しなかった場合は、mkdirコマンドで作成。(sudo mkdir /var/www)
- **/var/www/に書き込み権限追加**
- **git cloneする**
- **確認**
- **~/に戻る**

```:ec2-user
$ cd /var/www
$ sudo chmod 777 /var/www
$ git clone リモートリポジトリURL
$ ls -l
$ cd ~/
```

### 9.php-fpm, nginxの設定

**php-fpmの設定**

- www.confを編集

```:ec2-user
sudo vi /etc/php-fpm.d/www.conf
```
- **以下の内容に変更**
```PHP:www.conf
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx  //変更箇所
; RPM: Keep a group allowed to write in log dir.
group = nginx  //変更箇所

・・・省略・・・

;listen.owner = nginx  //変更箇所
;listen.group = nginx  //変更箇所
;listen.mode = 0660   //変更箇所
```

**nginxの設定**

- **ドメイン名.confの設定**
　
```:ec2-user
sudo vi /etc/nginx/conf.d/ドメイン名.conf
```

- **以下の内容に変更**

**開発環境と同じ設定にする。**

**参照 : [【Docker+Laravel6メモ】開発環境構築についてまとめてみました](https://qiita.com/yuuichimizuta/items/85015a63a8e53c058cb2#nginx%E8%A8%AD%E5%AE%9A)**

```:ドメイン名.conf
server {
    listen       80;
    server_name  ドメイン名;

    root /var/www/アプリディレクトリ名/public;
    index index.php index.html index.htm;

    access_log  /var/log/nginx/dev.access.log main;
    error_log  /var/log/nginx/dev.error.log;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
	root /var/www/アプリディレクトリ名/public;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
    }
}
```

**php-fpm, nginxの再起動**

- **php-fpm再起動**
- **状態確認**

```:ec2-user
$ sudo systemctl restart php-fpm
$ sudo systemctl status php-fpm
```

- **nginx再起動**
- **状態確認**

```:ec2-user
$ sudo systemctl restart nginx
$ sudo systemctl status nginx
```

### 10..envの設定

- **アプリディレクトリへ移動**
- **.env作成**
- **.envの設定**

```:ec2-user
$ cd /var/www/アプリディレクトリ名
$ cp .env.example .env
$ vi .env
```

- **.envを以下の内容に変更**

```PHP:.env
APP_NAME="アプリ名"  //変更箇所
APP_ENV=production  //変更箇所
APP_KEY=
APP_DEBUG=false  //変更箇所(削除してもOK)
APP_URL=https://ドメイン名  //変更箇所

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=エンドポイント  //変更箇所 (RDS作成時に設定したもの)
DB_PORT=3306
DB_DATABASE=DB名  //変更箇所 (RDS作成時に設定したもの)
DB_USERNAME=マスターユーザー名  //変更箇所 (RDS作成時に設定したもの)
DB_PASSWORD=マスターパスワード  //変更箇所 (RDS作成時に設定したもの)

・・・省略・・・
```

- **APP_KEYの生成**
- **APP_KEYの確認**
- **権限の変更(660)**

```:アプリディレクトリ
$ php artisan key:generate
$ cat .env
$ chmod 660 .env
```

### 11.Composerインストールとマイグレーション

- **Composer　インストール(本番環境用)**
- **Composerバージョン確認**

```:アプリディレクトリ
$ composer install --no-dev
$ composer
```

- **マイグレーション実行**
- **シーダー実行(必要あれば)**

```:アプリディレクトリ
$ php artisan migrate
$ php artisan db:seed
```

- **キャッシュ作成**

```:アプリディレクトリ
php artisan config:cache
```

### 12.アクセス確認

- **storegeとbootstrap/cacheの権限変更**

```:アプリディレクトリ
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache
```

- **[https://ドメイン名/]でアプリが表示されることを確認**
- **[http://ドメイン名/]でも[https]でアクセスできることを確認**

<font color="Green">**無事アプリのホーム画面が表示されたら完了です。**</font>

<font color="orangered">**Laravel環境構築とアプリのデプロイが完了しました!!**</font>

## 5.最後に

以上でEC2インスタンスのLaravel環境構築、アプリのデプロイ完了しました。

**これでAWSの本番環境構築はほぼ完成です。**

![スクリーンショット 2022-04-01 2.18.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891391/e30dd2af-4bd5-9c1d-4279-272b043d1826.png)

**最後にCircleCIを使用した自動デプロイ設定をします。**
**またS3を使用した画像アップロードについても記事を執筆中です。**

**【AWS環境構築メモ⑪】CircleCIを使用した自動デプロイ(執筆中)**
**【AWS環境構築メモ⑫】AWS S3を使用した画像アップロード(執筆中)**

## 6.参考

https://noumenon-th.net/programming/2020/04/10/ec2-rds-laravel/

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

https://qiita.com/miriwo/items/eb09c065ee9bb7e8fe06