Laravel 環境構築 AWS EC2(nginx + PHP) + RDS

#前提
ec2インスタンス作成済み
sshできる

#パッケージアップデート

```bash
sudo yum update
```

#PHP
2020/09/11現在
amazon-linux-extras リポジトリにPHP7.4があります

```bash
sudo amazon-linux-extras enable php7.4

##こんな出力があります
Now you can install:
 # yum clean metadata
 # yum install php-cli php-pdo php-fpm php-json php-mysqlnd
```

有効化の後yum を使用してトピックをインストールします。
`Now you can install:`のコマンド突っ込めば大丈夫です

```bash
sudo yum install php-cli php-pdo php-fpm php-json php-mysqlnd -y
```

```bash
php -v
PHP 7.4.9 (cli) (built: Aug 21 2020 21:45:11) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
```

## 足りない拡張追加
Laravelのサーバー要件

>※Laravel 7.x
PHP >= 7.2.5
BCMath PHP拡張
Ctype PHP拡張
Fileinfo PHP extension
JSON PHP拡張
Mbstring PHP拡張
OpenSSL PHP拡張
PDO PHP拡張
Tokenizer PHP拡張
XML PHP拡張

これに従い追加します
追加済みの拡張を調べます

```bash
php -m | grep -e bcmath -e PDO -e ctype -e fileinfo -e json -e mbstring -e openssl -e pdo -e tokenizer -e ^xml$
```

`php -m`でインストール済み拡張が出力されます
`コマンド | grep [オプション] 検索パターン`でコマンドでの出力に対してgrep(絞り込み)
が掛かります
`-e 検索パターン`をたくさん使用して複数の単語に対して引っかかる検索かけています。

私の環境ですと下記の拡張がインストール済みのようでした。
なので、そのほかをインストールしていきます

```bash
ctype
fileinfo
json
openssl
PDO
pdo_mysql
pdo_sqlite
tokenizer

# 足りないもの
# bcmath
# mbstring
# xml
```

`bcmath`,`mbstring`,`xml`が足りないので追加します

```bash
sudo yum install php-bcmath php-mbstring php-xml -y
```

## opcache
###インストール
設定ではないけど、opcacheを入れます

```bash
sudo yum install php-opcache
```

###確認

```bash
php -v
#PHP 7.4.9 (cli) (built: Aug 21 2020 21:45:11) ( NTS )
#Copyright (c) The PHP Group
#Zend Engine v3.4.0, Copyright (c) Zend Technologies
#    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
```

###設定値の変更

`php.ini`の場所を調べます

```bash
php --ini
```

```bash
 php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/10-opcache.ini,
/etc/php.d/20-bcmath.ini,
/etc/php.d/20-bz2.ini,
/etc/php.d/20-calendar.ini,
#...
```

`opcache.ini`で設定を変えます

```bash
sudo vi /etc/php.d/10-opcache.ini
```

https://www.php.net/manual/ja/opcache.installation.php
推奨設定に合わせて編集します

>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

>FPMとは、FastCGI Process Managerの略でPHP5.4.0から公式サポートされたPHP標準のアプリケーションサーバです。名前にあるFastCGIというプロトコルで通信するよう実装されています。 FastCGIは、Webサーバとアプリケーションサーバの間で使われるプロトコルの一つで、ここでの例ではnginxとPHP-FPMの間で交わされるプロトコルとなります。

参考
https://hacknote.jp/archives/27419/
https://hackers-high.com/linux/php-fpm-config/

###起動

```bash
sudo service php-fpm start
```

###確認

```bash
 sudo systemctl status php-fpm

 php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2020-09-11 17:15:02 JST; 1 day 17h ago
```

###自動起動

```bash
sudo systemctl enable php-fpm
```


# Composer
##インストール
https://getcomposer.org/download/

公式のコマンドを叩いていきます

```bash
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

##移動

```bash
sudo mv composer.phar /usr/local/bin/composer
```

##確認

```bash
composer

   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.10.13 2020-09-09 11:46:34
```

# nginx

##インストール
PHPと同様にamazon-linux-extras リポジトリにあります

```
sudo amazon-linux-extras enable nginx1

##こんな出力があります
Now you can install:
 # yum clean metadata
 # yum install nginx
```

インストール

```bash
sudo yum install nginx -y
```

```bash
nginx -v
nginx version: nginx/1.18.0
```

##起動
インストールしただけだと、起動していない

```bash
sudo systemctl start nginx
```
(上記コマンドを叩いても出力はなにもないです)

起動しているか確認します

```bash
sudo systemctl status nginx

nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/nginx.service.d
           └─php-fpm.conf
   Active: active (running) since 金 2020-09-11 08:15:02 UTC; 2s ago
```

##自動起動設定
現状EC2再起動するたび、自力で立ち上げないといけない

```bash
sudo systemctl enable nginx 
```

##画面確認
EC2のIPをブラウザで入力

![スクリーンショット 2020-09-13 1.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/18b3172a-53b3-7929-3e0f-d5d1c2fda499.png)

#Gitインストール

```bash
sudo yum install git
git --version
# >git version 2.23.3
```

#PHP + nginx設定

両方のインストールが終わったので疎通していきます

##php-fpm設定

設定変更する前にコピーとっておくと良いかもしれません

```bash
sudo vi /etc/php-fpm.d/www.conf
```

下記の内容に更新します
それぞれ`/検索ワード`とかで検索して書き換えましょう

```conf
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

# 以下はお好み
pm = static
pm.max_children = 5
pm.max_requests = 1500
```

ちなみに、`pm`関係の設定値はデフォルトでも良いです
下記が参考になるので、チューニングしたい方はどうぞ
https://hackers-high.com/linux/php-fpm-config/

##nginx設定

```bash
sudo vi /etc/nginx/nginx.conf
```

ドキュメントルートは自由に

```nginx
 server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www;
        index  index.php index.html index.htm;

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

        location ~ \.php$ {
            root           /var/www;
            fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
#~中略~
```

##確認

```bash
sudo mkdir /var/www
sudo chmod 777 /var/www
cd /var/www
echo "<?php phpinfo(); " > index.php
```

ドキュメントルートの内`phpinfo()`だけの、`index.php`作ってます
IPをブラウザで確認して、表示されてればPHP使えるようになりました

![スクリーンショット 2020-09-13 14.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/ab50ffab-8405-b233-105d-c687627c10b2.png)

#RDS

AWSにログインしRDS on MySQLでDBを作成しておきます
(参考 -> https://noumenon-th.net/programming/2020/04/10/ec2-rds-laravel/

エンドポイントと、ユーザーとパスワードを用いるのでとっておきましょう

![スクリーンショット 2020-09-14 1.41.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/1b9382a3-c5c1-4fc0-17d9-88f75cdfb162.png)


EC2にSSH接続し、下記コマンドでmysqlをインストールします

```bash
sudo yum install mysql -y
```

終わったら、エンドポイントとユーザー、パスワードを用いて接続します
うまくつながらなかったら、だいたいセキュリティグループとかなので、AWSのRDS等見直してみてください

```bash
mysql -h エンドポイント -u ユーザー名 -p
Enter password:
```

つながればOK

```conf
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 8.0.17 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]>
```

データベースを作成していなかったら(RDS作成時に指定できる)
`CREATE DATABASE`で作成してください
(参考 => https://www.dbonline.jp/mysql/database/index1.html#section1)

#Laravel

これまででLaravelの下準備は整っています
デプロイの場合もgitからcloneすれば良いので大丈夫です

まずはドキュメントルートに移動します
nginxで`/var/www`を指定していたのでそこに移動します

```bash
cd /var/www
```

ComposerからLaravelを入れます

```
composer create-project --prefer-dist laravel/laravel 【名前】
```
【名前】は自由に
今回は`laravel-app`にしました
ちなみに、Laravelのバージョン指定したい場合、【名前】のあとに、5.8とか6.xとか入れたら良いです
　

メモリ足りなくて下記のようなエラー出たら、下記の記事の手順でswapを作成してください
https://qiita.com/ntm718/items/88d3fc787f4f18ad1f20

```
mmap() failed: [12] Cannot allocate memory

mmap() failed: [12] Cannot allocate memory
```

インストールしたら、指定した名前のディレクトリに移動します
私は`laravel-app`にしたので、今後置き換えてお読みください

```bash
cd laravel-app
php artisan key:generate --ansi
sudo chmod -R 777 storage
sudo chmod -R 777 bootstrap/cache/
```

この段階でブラウザで下記のようにアクセスすると、Laravelの初期画面が出ます
`ipアドレス/laravel-app/public`

![スクリーンショット 2020-09-14 2.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/911cff46-e568-f2cd-81d0-ffdf5c29922e.png)


ここまで来たら、あと少しです

`vi .env`

DBの接続情報を書き換えます

```config:.env
DB_CONNECTION=mysql
DB_HOST=エンドポイント名
DB_PORT=3306
DB_DATABASE=作ったDB名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```

保存し、`php artisan migrate`します
ちゃんと実行されたらOK


```bash
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (51.33ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (38.25ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (39.88ms)
```

最後にドキュメントルートを変更しましょう
現状だと`ipアドレス/laravel-app/public`なので、`laravel-app/public`までをドキュメントルートに設定したら良さそうですね

```bash
sudo vi /etc/nginx/nginx.conf
```

`laravel`の`public`がドキュメントルートに来るように修正します

```
server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/laravel/public;
        index  index.php index.html index.htm;

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

        location ~ \.php$ {
            root /var/www/laravel/public;
            fastcgi_pass   unix:/run/php-fpm/www.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

~中略~
```

再起動

```bash
sudo systemctl restart nginx
```

ipアドレスにアクセスしたら、laravelの画面が出たら終了

Route53でドメイン設定して、SSLしたらそれっぽくなるはず

ドメイン設定編(事前にEC2とElastic IPを紐付けておく必要あり)
https://qiita.com/ntm718/items/c01fa4fc47d21893974e

#終わりに
Docker使うならECR ECSのがいいんだろうか
そもそも、個人でやるにはAWSは料金が怖すぎて無料期間あるやつしか使う気がしない...
勉強で作ったらVPSとかのがいいんでしょうか...