Lravel+EC2+Nginxでデプロイする

Lravel+EC2+Nginxでデプロイする

環境
Amazon Linux2

参考サイト
[EC2・RDSでLaravelの環境構築【PHP・MySQL・Nginx】](https://qiita.com/yuta_sawamura/items/e925ac687eddfef359fa)

こちらだとPHP-fpmｍとNginxの設定に関しての表記が少なくてハマってしまった所があったので、
そこを補いつつ全体の流れを書いて行こうと思います。

###全体の流れ
①EC2インスタンスの作成
②SSHでEC2に接続
③Nginxのインストール
④PHPのインストール
⑤Nginxを使用するためのPHP-fpmの設定
⑥GitHubからLaravelのリポジトリのclone
⑦Nginxの設定変更
⑧Laravelアプリの設定変更など
⑨RDSの作成
⑩セキュリティグループの設定
⑪.envファイルの設定変更とマイグレーション
・ハマったところと解決法のまとめ
・yumとは
・ApacheとNginxとPHP-FPMの関係性の図解

###EC2インスタンスの作成
ここは標準的な操作で良かったので、参考サイトを参照する。
[EC2・RDSでLaravelの環境構築【PHP・MySQL・Nginx】](https://qiita.com/yuta_sawamura/items/e925ac687eddfef359fa)

###SSHでEC2に接続
ファイルのアクセス権を400に変更してから接続

```
アクセス権変更コマンド
chmod 400 xxxxxxxxx.pem
ssh接続コマンド
ssh -i xxxxxxxxxxxxxxxxxx
```
EC2のここに書いてあります。
![スクリーンショット 2021-10-27 14.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687490/625b6886-68e8-1d6b-6ddd-66667953c354.png)

###Nginxのインストール
yumのアップデート

```
sudo yum update -y
```

nginxのインストール
バージョンは任意のものを指定する。

```
sudo amazon-linux-extras install nginx1.12 -y
```

nginxの起動

```
sudo systemctl start nginx
```

ブラウザのアドレスバーにEC2インスタンスのIPv4アドレスを入力。
nginxの画面が表示されます。


![スクリーンショット 2021-11-07 16.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687490/e701e653-b2d6-97eb-fd76-8297caf1bd01.png)


###④PHPのインストール

PHPのインストール
バージョンは任意のものを指定する。

```
sudo amazon-linux-extras install php7.3
```
PHPがインストールされているか確認

```
php -v
```
###⑤Nginxを使用するためのPHP-fpmの設定
nginxが使えるようにするために、PHP-fpmの設定を変更する。

```
sudo vi /etc/php-fpm.d/www.conf
```
・「user = apache」→「user = nginx」に変更
・「group = apache」→「group = nginx」
・「listen.owner = apache」→「listen.owner = nginx」
・「listen.group = apache」→「listen.group = nginx」

```
; 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 = /var/run/php-fpm/php-fpm.sock

#（中略）

;listen.owner = nginx
;listen.group = nginx
;listen.mode = 0660


```

nginxを再起動

```
sudo systemctl restart nginx
```

###⑥GitHubからLaravelのリポジトリのclone
**Composerとは**
>ComposerとはPHPのパッケージ管理システムです。 PHPのライブラリなどをファイルに記述して管理することで、簡単にライブラリのインストールやアンインストールなど、様々な管理が簡単できるようになります

Composerのインストール

```
cd ~
sudo curl -sS https://getcomposer.org/installer | php　# コンポーザーのインストール
sudo chown root:root composer.phar 
sudo mv composer.phar /usr/bin/composer # パスを通す
composer # インストールされたか確認
```

**php-mbstringとは**
>PHPのmbstringとは、PHPでマルチバイト文字を使用できるようにする、PHPの拡張モジュールのことです。 マルチバイト文字とはひらがなや漢字など、2バイト以上で表現される文字のことで、mbstringの設定を行うことで、PHP内で日本語文字を扱えるようになります。

**php-xmlとは**
>PHPから XML(文章の見た目や構造を記述するためのマークアップ言語の一種)を取り扱うために必要。

php-mbstringとphp-xmlをインストール

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

Gitのインストール

```
sudo yum install git 
```
Gitがインストールされたかを確認

```
git --version
```
・GitHubのリポジトリからcloneするためのディレクトリをEC2内に作成
・作成したディレクトリに移動

```
sudo mkdir /var/www
cd /var/www
```
・今回はHTTPS方式でクローンする
・GitHubのリポジトリのHTTPSアドレスをコピーしてsudo git clone　の後に貼り付けると下記のようになるのでエンターを押して実行する
・アカウント名やパーソナルアクセストークンを聞かれる可能性がある

```
sudo git clone https://github.com/[ユーザー名]/[リポトリ名].git
```

###⑦Nginxの設定変更

nginxの設定はnginx.confに書かれている。よく見に行くファイルなので下記のパス(/etc/nginx/nginx.conf)は覚えておいてもいいぐらい。

```
sudo vi /etc/nginx/nginx.conf
```
・エラーログのパスが書いてある。ここもよく見に行くので、ここに記載されてることを覚えておけばいいかな
・rootのパスをcloneしたディレクトリの中のpublicに変更。ここを見に行くようにする設定
・locationを変更


```/etc/nginx/nginx.conf
#(中略)

error_log /var/log/nginx/error.log;


#(中略)

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/リポジトリ名/public; # ここを修正

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            try_files $uri $uri/ /index.php$is_args$args; # ここを修正
        }
#---------------ここから下を追加(fastcgi_passは適宜変えてください)-------------------
  location ~ \.php$ {
             fastcgi_split_path_info ^(.+\.php)(/.+)$;
             fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;
             fastcgi_index index.php;
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             include       fastcgi_params;
    }
#---------------ここから上を追加-------------------

        error_page 404 /404.html;
            location = /40x.html {
        }

     #  error_page 500 502 503 504 /50x.html;  # ここをコメントアウト
     #      location = /50x.html {　# ここをコメントアウト
     #  }　# ここをコメントアウト
    }
#(中略)
```
Nginxを再起動

```
sudo systemctl restart nginx
```

###⑧Laravelアプリの設定変更など
composerのインストール

```
cd /var/www/リポジトリ名
sudo composer install 
```
storageディレクトリの権限変更

```
sudo chmod -R 777 storage/ 
```

.envファイルの作成
デフォルトではローカルからGitHubにはpushされてない設定なので、通常だとローカルには.envファイルがあるのに、GitHub上にはない。
だから、cloneしたLaravelアプリにも.envがない。
なので、.envファイルを作成する必要がある。

```
sudo touch .env 
```
DBの設定はRDSの設定後に行いますので、/var/www/リポジトリ名/.envが下記のようになるようにコピペする。

```/var/www/リポジトリ名/.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
```
これでIPv4パブリックIPをブラウザのアドレスバーに入力すればLaravelの画面が表示される。


###⑨RDSの作成
Virtual Private Cloud (VPC)、サブネットグループ、既存のVPCセキュリティグループはEC2の設定に合わせました。
最初のデータベース名、マスターユーザー名、マスターパスワードはこの後.envファイルの設定の際に使用するのでメモしておいてください。
設定の詳細画像を見ながら設定したい方は今回の参考サイトを参考にしてください。
[EC2・RDSでLaravelの環境構築【PHP・MySQL・Nginx】](https://qiita.com/yuta_sawamura/items/e925ac687eddfef359fa)

###⑩セキュリティグループの設定
今回のRDSのセキリティグループの設定はEC2と同一のものにしました。

セキリティグループのインバウンドルールの設定は、「HTTP」「SSH」を既存で追加していますので、ここで新たに「MYSQL/Auora」を追加しましょう。
設定の詳細画像を見ながら設定したい方は今回の参考サイトを参考にしてください。
[EC2・RDSでLaravelの環境構築【PHP・MySQL・Nginx】](https://qiita.com/yuta_sawamura/items/e925ac687eddfef359fa)

###⑪.envファイルの設定変更とマイグレーション

.envの設定に先ほどのRDSの設定した値を入力します。

```
sudo vi .env
```
```/var/www/リポジトリ名/.env
DB_CONNECTION=mysql
DB_HOST=エンドポイント
DB_PORT=3306
DB_DATABASE=最初のデータベース名
DB_USERNAME=マスターユーザー名
DB_PASSWORD=マスターパスワード
```

マイグレーション

```
sudo php artisan migrate
```
これでIPv4パブリックIPをブラウザに入力するとデータベースが繋がった状態でLaravelの画面が表示されます。


###ハマったところと解決法のまとめ

**RDSでマイグレーションができない**
状態：エラー文が出ずに応答待ち
原因：RDSのインバウンドのルール設定がおかしかった。マイIPにしていた。EC2からの接続だからEC2のIPアドレスを設定しないといけなかった

**.envファイルの設定変更とマイグレーション**
mysqlでRDSへの接続をする
mysqlから出る
php artisan migrate
※ここがどのようなハマり方をしていたのかのメモをしていなかったため、とりあえず書いていたものを記載してみた。なにかのヒントになるといいかなぐらい。


**key generateを要求された**
key generateをすれば解決

```
php artisan key:generate
```

**failed to open stream: No such file or directory inが出た**
Composerをインストールすれば解決

```
sudo composer install
```
**キャッシュのクリア**
```
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
sudo composer dump-autoload
```

キャッシュのクリアまとめて実行

```
php artisan cache:clear; php artisan config:clear; php artisan route:clear; php artisan view:clear; sudo composer dump-autoload
```

###yumとは
0. パッケージ管理システム
0. rpmというパッケージ管理システムをラッパーしている
 yum = rpm + 「リポジトリ」による自動更新機能 + 依存関係の管理 
 (検出だけじゃない)

「リポジトリ」とは
パッケージを複数格納している場所のこと

・yumで「パッケージの情報を管理する」
・Linuxで「パッケージ(yum)を読み解き、ソフトウェアを正しく動作させるようにする」
[yum installで学ぶ！ yum の仕組み](https://tech-blog.rakus.co.jp/entry/2017/12/14/105052)


###ApacheとNginxとPHP-FPMの関係性の図解
![スクリーンショット 2021-10-27 14.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687490/ffcd57e1-5dd2-1c52-140d-05a2609c378a.png)

![スクリーンショット 2021-10-27 14.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687490/d6957c24-4fc1-dfaf-faf6-c9bdc57258ff.png)


参考サイト集
Amazon LinuxにMysqlのclientだけインストールしてRDSへの接続する方法
https://qiita.com/tamorieeeen/items/d9b2af588f1dfd43120d
Amazon EC2にNginx+PHP8でLaravel8環境を構築する
https://knmts.com/become-engineer-30/