Laravel Docker AWS EC2デプロイ③

前回に続き、今回はLaravelを起動させていきます！

https://qiita.com/yyy752/items/b9d7674fc349f669e801

https://qiita.com/yyy752/items/601646d3683869521f9b

##Laravel起動
###1.ターミナルからインスタンスにリモート接続
※接続情報のコマンドに関しては、自身のインスタンスから「接続」ボタンで確認可能。
![スクリーンショット 2021-12-02 22.14.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/67091103-6adb-5e05-d138-9baddd00e435.png)


![スクリーンショット 2021-12-02 22.13.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/2dd826e4-2aad-542b-3b16-5a23cc598da2.png)




```
.ssh $ ssh -i "sample-key.pem" ec2-user@ec2-??-??-???-???.ap-northeast-1.compute.amazonaws.com
Last login: Thu Dec  2 17:55:23 2021 from p3014131-ipoe.ipoe.ocn.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
```

###2.Gitのユーザー名とEmailアドレスを設定。
※設定するユーザー名とEmailアドレスは自身のGithubアカウントに登録しているデータを入力してください。
 また、メールアドレスにダブルクォーテーションはいりません。

```
[ec2-user@ip-172-31-45-44 ~]$ git config --global user.name "ユーザー名"
[ec2-user@ip-172-31-45-44 ~]$ git config --global user.email メールアドレス
```

###3.amazon-linux-extrasコマンドを利用してPHPをインストール。
インストールできるパッケージ一覧に関しては、こちらの記事を参考にしてください！

https://qiita.com/katsutoshi_miyata/items/dc1870f4083b95c07031


```
[ec2-user@ip-172-31-45-44 ~]$ sudo amazon-linux-extras install -y php7.4
```

###4.Composerをインストールし、パスを通す。

```
[ec2-user@ip-172-31-45-44 ~]$ curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

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

[ec2-user@ip-172-31-45-44 ~]$ sudo mv composer.phar /usr/local/bin/composer
```

###5.Laravelのプロジェクトを/var/wwwディレクトリ以下に配置。

```
[ec2-user@ip-172-31-45-44 ~]$ cd /var/www
```

###6./var/wwwディレクトリの所有者とグループを変更。

```
[ec2-user@ip-172-31-45-44 www]$ sudo chown ec2-user:ec2-user /var/www
```

###7.デプロイしたいLaravelのプロジェクトをclone。

```
[ec2-user@ip-172-31-45-44 www]$ git clone https://github.com/???????.git
```

###8.Composerのパッケージをインストールするために必要なライブラリをインストール。

```
[ec2-user@ip-172-31-45-44 www]$ sudo yum install -y php-xml
・・・ #省力
完了しました！
```

###9.パッケージのインストール。

```
[ec2-user@ip-172-31-45-44 backend(アプリディレクトリ）]$ composer install
Composer could not find a composer.json file in /var/www
To initialize a project, please create a composer.json file. See https://getcomposer.org/basic-usage
```

###10.他に必要なパッケージをインストール。
Webサーバーにnginxを採用した場合、PHPを実行するために設定が必要です。
先ず、拡張機能を以下のコマンドで確認します。

```
[ec2-user@ip-172-31-45-44 www]$ sudo yum list php* | grep amzn2extra-php7.4
php-cli.x86_64                      7.4.21-1.amzn2            @amzn2extra-php7.4
php-common.x86_64                   7.4.21-1.amzn2            @amzn2extra-php7.4
php-fpm.x86_64                      7.4.21-1.amzn2            @amzn2extra-php7.4
php-json.x86_64                     7.4.21-1.amzn2            @amzn2extra-php7.4
php-mysqlnd.x86_64                  7.4.21-1.amzn2            @amzn2extra-php7.4
php-pdo.x86_64                      7.4.21-1.amzn2            @amzn2extra-php7.4
php-xml.x86_64                      7.4.21-1.amzn2            @amzn2extra-php7.4
php.x86_64                          7.4.21-1.amzn2            amzn2extra-php7.4 
php-bcmath.x86_64                   7.4.21-1.amzn2            amzn2extra-php7.4 
php-dba.x86_64                      7.4.21-1.amzn2            amzn2extra-php7.4 
php-dbg.x86_64                      7.4.21-1.amzn2            amzn2extra-php7.4 
php-devel.x86_64                    7.4.21-1.amzn2            amzn2extra-php7.4 
php-embedded.x86_64                 7.4.21-1.amzn2            amzn2extra-php7.4 
php-enchant.x86_64                  7.4.21-1.amzn2            amzn2extra-php7.4 
php-gd.x86_64                       7.4.21-1.amzn2            amzn2extra-php7.4 
php-gmp.x86_64                      7.4.21-1.amzn2            amzn2extra-php7.4 
php-intl.x86_64                     7.4.21-1.amzn2            amzn2extra-php7.4 
php-ldap.x86_64                     7.4.21-1.amzn2            amzn2extra-php7.4 
php-mbstring.x86_64                 7.4.21-1.amzn2            amzn2extra-php7.4 
php-odbc.x86_64                     7.4.21-1.amzn2            amzn2extra-php7.4 
php-opcache.x86_64                  7.4.21-1.amzn2            amzn2extra-php7.4 
php-pecl-apcu.x86_64                5.1.18-1.amzn2            amzn2extra-php7.4 
php-pecl-apcu-devel.noarch          5.1.18-1.amzn2            amzn2extra-php7.4 
php-pecl-igbinary.x86_64            3.1.2-1.amzn2             amzn2extra-php7.4 
php-pecl-igbinary-devel.noarch      3.1.2-1.amzn2             amzn2extra-php7.4 
php-pecl-imagick.x86_64             3.5.1-1.amzn2             amzn2extra-php7.4 
php-pecl-imagick-devel.noarch       3.5.1-1.amzn2             amzn2extra-php7.4 
php-pecl-mailparse.x86_64           3.1.0-1.amzn2.0.2         amzn2extra-php7.4 
php-pecl-memcache.x86_64            4.0.5.2-1.amzn2           amzn2extra-php7.4 
php-pecl-memcached.x86_64           3.1.5-1.amzn2             amzn2extra-php7.4 
php-pecl-msgpack.x86_64             2.1.0-1.amzn2             amzn2extra-php7.4 
php-pecl-msgpack-devel.noarch       2.1.0-1.amzn2             amzn2extra-php7.4 
php-pecl-oauth.x86_64               2.0.5-1.amzn2             amzn2extra-php7.4 
php-pecl-redis.x86_64               5.2.1-1.amzn2             amzn2extra-php7.4 
php-pecl-ssh2.x86_64                1.2-1.amzn2               amzn2extra-php7.4 
php-pecl-uuid.x86_64                1.1.0-1.amzn2             amzn2extra-php7.4 
php-pgsql.x86_64                    7.4.21-1.amzn2            amzn2extra-php7.4 
php-process.x86_64                  7.4.21-1.amzn2            amzn2extra-php7.4 
php-pspell.x86_64                   7.4.21-1.amzn2            amzn2extra-php7.4 
php-snmp.x86_64                     7.4.21-1.amzn2            amzn2extra-php7.4 
php-soap.x86_64                     7.4.21-1.amzn2            amzn2extra-php7.4 
php-sodium.x86_64                   7.4.21-1.amzn2            amzn2extra-php7.4 
php-xmlrpc.x86_64                   7.4.21-1.amzn2            amzn2extra-php7.4 
```

今回は以下のパッケージをインストールします！


|パッケージ  |目的 |
|-|-|
|php-devel  |拡張機能のソースをコンパイルするために必要。 |
|php-opcache  |処理の高速化のため。  |
|php-mbstring|マルチバイト文字列関連の関数を使うために必要。|
|php-xml|xmlを利用するために必要。|


```
[ec2-user@ip-172-31-45-44 www]$ sudo yum install php php-devel php-opcache php-mbstring php-xml
・・・ #省略
完了しました！
```

###11.php-fpmの自動起動の設定。

```
[ec2-user@ip-172-31-45-44 www]$ sudo systemctl start php-fpm.service

[ec2-user@ip-172-31-45-44 www]$ sudo systemctl enable php-fpm.service
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

[ec2-user@ip-172-31-45-44 www]$ systemctl status php-fpm.service
● 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 金 2021-12-03 15:53:17 UTC; 41s ago
 Main PID: 9421 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php-fpm.service
           ├─9421 php-fpm: master process (/etc/php-fpm.conf)
           ├─9422 php-fpm: pool www
           ├─9423 php-fpm: pool www
           ├─9424 php-fpm: pool www
           ├─9425 php-fpm: pool www
           └─9426 php-fpm: pool www

12月 03 15:53:17 ip-???-??-??-??.ap-northeast-1.compute.internal systemd[1]: Starting The PHP FastCGI Pr....
12月 03 15:53:17 ip-???-??-??-??.ap-northeast-1.compute.internal systemd[1]: Started The PHP FastCGI Pro....
Hint: Some lines were ellipsized, use -l to show in full.
```

###12.php-fpmとnginxの接続設定
参考記事：https://knmts.com/become-engineer-30/

先ずはphp-fpmから設定。
viモードはrootユーザーでないとファイルに書き込みができないので、書き込みをするときはec2ユーザーからrootユーザーにスイッチしてください。

```
[ec2-user@ip-172-31-45-44 ~]$ sudo su - #rootにスイッチ
```

```
[root@ip-172-31-45-44 ~]# cd /etc/php-fpm.d/
[root@ip-172-31-45-44 php-fpm.d]# sudo cp www.conf www.conf_bk_yyyyMMdd #念の為バックアップ
[root@ip-172-31-45-44 php-fpm.d]# vi www.conf
```

viで開いたら、「i」で挿入モードにして以下の箇所を変更。
変更したら「etc」で通常モードにして「:wq」で保存して終了。


```
### 24行目あたり ###
# 変更前
user = apache
# 変更後
user = nginx

### 26行目あたり ###
# 変更前
group = apache
# 変更後
group = nginx

### 48行目あたり ###
# 変更前
;listen.owner = nobody
# 変更後
listen.owner = nginx

### 49行目あたり ###
# 変更前
;listen.group = nobody
# 変更後
listen.group = nginx

### 50行目あたり ###
# 変更前
;listen.mode = 0660
# 変更後
listen.mode = 0660
```

次はnginxの設定。
先ずnginx.confの場所を探しましょう！

lsコマンドでファイルやディレクトリの情報を表示しますが、-lオプションをつけることで詳細まで表示させることができます。

```
[root@ip-172-31-45-44 ~]$ ls -l /etc | grep nginx
drwxr-xr-x  4 root root     4096 12月  2 12:38 nginx
```

/etc下にnginx関係のファイルがあることがわかりました。
ちなみに、表示された実行結果の各意味についてはこのようになっています。

https://eng-entrance.com/linux_command_ls#-l


・左から順に、

```
ファイルタイプ、パーミション、ハードリンクの数、オーナー名、グループ名、バイトサイズ、タイムスタンプ、ファイル名
```
一番左のrwxr-xr-xに`「d」`がついていますが、これは`「ディレクトリ」`の意味を示しています！

では、nginx.confの場所がわかったところで実際に編集していきます。

```
[root@ip-172-31-45-44 ~]# vi /etc/nginx/nginx.conf
```

nginx.confの編集内容はこんな感じです。
書き方間違えるとnginxが起動しなくなるので、わからない方はこちらの記事を参考にしてみてください。

https://hack-le.com/nginx/

https://www.cyberowl.co.jp/blog/technology/1230#jy5xjxke

今回は下記記事を参考に編集しました。

https://knmts.com/become-engineer-30/




```
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/laravel-zaikokanri/backend/public;

        add_header X-Frame-Options "SAMEORIGIN"; 
        add_header X-Content-Type-Options "nosniff";

        index index.php;

        charset utf-8;

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

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

        location ~ /\.(?!well-known).* {
            deny all;
        }

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

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

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}
```

これで一度nginxが起動するか確認してみましょう！

```
[root@ip-172-31-45-44 ~]$ sudo systemctl start nginx.service #nginx起動

[root@ip-172-31-45-44 ~]$ sudo systemctl status nginx.service #起動状態確認
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/nginx.service.d
           └─php-fpm.conf
   Active: active (running) since Sat 2021-12-04 15:13:41 UTC; 28s ago
  Process: 16931 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 16926 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 16925 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 16933 (nginx)
   CGroup: /system.slice/nginx.service
           ├─16933 nginx: master process /usr/sbin/nginx
           └─16934 nginx: worker process

Dec 04 15:13:41 ip-172-31-45-44.ap-northeast-1.compute.internal systemd[1]: Startin...
Dec 04 15:13:41 ip-172-31-45-44.ap-northeast-1.compute.internal nginx[16926]: nginx...
Dec 04 15:13:41 ip-172-31-45-44.ap-northeast-1.compute.internal nginx[16926]: nginx...
Dec 04 15:13:41 ip-172-31-45-44.ap-northeast-1.compute.internal systemd[1]: Started...
Hint: Some lines were ellipsized, use -l to show in full.

```

無事起動できてますね！

次に、クローンしたLaravelのプロジェクトディレクトリ内に移動して.envファイルの作成とAPP_KEYの生成を行います。

```
[root@ip-172-31-45-44 www]# cd /laravel-zaikokanri/backend #移動

[root@ip-172-31-45-44 backend]# cp .env.example .env #作成

[root@ip-172-31-45-44 backend]# php artisan key:generate #キーの生成
PHP Warning:  require(/var/www/laravel-zaikokanri/backend/vendor/autoload.php): failed to open stream: No such file or directory in /var/www/laravel-zaikokanri/backend/artisan on line 18
PHP Fatal error:  require(): Failed opening required '/var/www/laravel-zaikokanri/backend/vendor/autoload.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/laravel-zaikokanri/backend/artisan on line 18
```

キーの生成でエラーが発生しました。
※下記記事を参考に解決。

これは`composer install`で解決できます。
原因としてよくあるのが、GitHubなどで他人のリモートリポジトリからクローンしてきたLaravelのプロジェクトフォルダの場合、基本的に /vendor フォルダは個々の環境に依存してGitの管理下に置かれないため、このようなエラーの原因となることがあります。

https://qiita.com/chimayu/items/82d9d457a056829b3b2e

composer installが完了したら再度php artisanを実行します！
これで無事キーを生成できました！

```
[root@ip-172-31-45-44 backend]# php artisan key:generate
Application key set successfully.
```

.envファイルの中を見てキーが設定されているか確認します。

```
[root@ip-172-31-45-44 backend]# cat .env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=??????????????????????????= #ここで問題なく設定されてますね！
APP_DEBUG=true
APP_URL=http://localhost
```

###13.DBの接続設定

最後に/config/database.phpと.envファイルを設定して、RDSとアプリを繋げます。

参考記事：

https://qiita.com/tetsu-upstr/items/1f2deddb6808afca2f2b

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

`.env`

```
#各RDSの設定内容を入力
DB_CONNECTION=mysql
DB_HOST=database-1.??????????.ap-northeast-1.rds.amazonaws.com
DB_PORT=3306
DB_DATABASE=laravel_zaiko 
DB_USERNAME=admin 
DB_PASSWORD=????? #マスターパスワード
```

`/config/database.php`
env()で囲んである箇所は.envの内容を読み込むようになっていますが、第二引数に直接書き込んでも大丈夫です。
また、RDSに登録したDBの内容はコンソールのRDS画面でDBを選択すれば確認ができます。

```
'default' => env('DB_CONNECTION', 'mysql'),

'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', 'database-1.???????????.ap-northeast-1.rds.amazonaws.com'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'laravel_zaiko'),
            'username' => env('DB_USERNAME', 'admin'),
            'password' => env('DB_PASSWORD', '??????'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
```

設定が完了したらmigrateしてDBが作成されているか確認しましょう。
前回一度migrateしてるので、今回はリフレッシュします。

```
[root@ip-172-31-45-44 backend]# php artisan migrate:refresh
Migration table created successfully.
```

```
#mysqlログインコマンド
$ mysql -h database-1.????????.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p
```

また、ログインコマンド実行後にパスワードの入力を求められますが、そちらは自身で設定したマスターパスワードになります。
※もしマスターパスワードを忘れた場合は[こちらの手順](https://aws.amazon.com/jp/premiumsupport/knowledge-center/reset-master-user-password-rds/)で簡単にパスワードを変更できます。

```
[ec2-user@ip-172-31-45-44 ~]$ mysql -h database-1.????????.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p

Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 24
Server version: 8.0.23 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)]> show databases; #DB確認
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel_zaiko      |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
```

無事作成できてますね！

###14.アプリ起動確認
では、最後にnginxを再起動後パブリックIPv4DNSからアクセスし、アプリの画面が表示されるかブラウザで確認しましょう！

![スクリーンショット 2021-12-13 17.43.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/e4e36b03-6fbc-f192-1283-8451d3cf7f02.png)


無事アプリのログイン画面が表示されました！

だいぶ長くなったので今回はここまでにします。
この後はアプリの動作確認をしたり、必要な実行コマンドがあれば実行して正常にアプリが動作するよう修正していきます！

https://qiita.com/yyy752/items/ce4d38a21b0a01b2be2e