【備忘録】既存のlaravelのプロジェクトをubuntuにデプロイする手順

#はじめに
この記事は、過去にローカルのdocker環境で動かしたlaravelのプロジェクトを、AWSに移行する際に行った手順を備忘録としてまとめたものになります。AWSにデプロイする際は、動作速度を鑑みて、Dockerを使わずに直接Linux環境にデプロイしました。

#環境
OS : Ubuntu 20.04.2 LTS
server : nginx 1.18
DB : mysql 8.0
PHP 7.4
PHP-FPM 7.4

#1. 動作環境の確認
docker-compose.yml や backend/composer.json の内容をもとに、動作環境の確認を行う。
互換性のないバージョンをインストールすると、後ほど行うcomposer install でエラーになるので注意。

```json:backend/composer.json
    "require": {
        "php": "^7.3",
        "fideloper/proxy": "^4.2",
        "fruitcake/laravel-cors": "^2.0",
        "guzzlehttp/guzzle": "^7.0.1",
        "laravel/framework": "^8.0",
        "laravel/tinker": "^2.0",
        "laravel/ui": "^3.0"
    }
```
※ ^（キャレット）について : 
>^1.2.3 は >=1.2.3 <2.0.0 と同等（1.2.3 以上の最新のバージョン。但し 2.0.0 未満）
バージョンが 1未満の場合： ^0.3 は >=0.3.0 <0.4.0 と扱われます
キャレット（^）を使うと後方互換性を維持する範囲で更新されます。

上記の例では、phpのバージョンは7.3以上8.0未満である必要があることを意味する。
composer.jsonについてや、記号の定義などは下記のサイトを参考
https://www.webdesignleaves.com/pr/php/php_composer.php


#2. nginxのインストールと起動
nginxをインストールする

```
sudo apt update
sudo apt install nginx
```

nginxを起動

```
sudo service nginx start
```
ブラウザからIPアドレスにアクセスしてみて、nginxのページが表示されればOK

#3. PHPのインストール
PHP7.4のインストールを行う。
※この記事を書いた当時の最新のバージョンは8.0であり、デプロイしたいプロジェクトのPHPのバージョンは7.3以上8.0未満である必要があったため、バージョンを指定してインストールを行っている。

```
sudo apt -y install php7.4
```

#4. php-fpmのインストール
php-fpmのインストールを行う。

```
sudo apt install -y php-fpm
```
※php-fpmはWebサーバー上でPHPを動作せるために必要なもの（のはず）
php-fpmの説明は、以下のサイトが分かりやすかった
https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc
https://www.bnote.net/centos/php-fpm_on_nginx.html#:~:text=PHP%2DFPM%E3%81%A8%E3%81%AF,%E3%82%88%E3%81%86%E5%AE%9F%E8%A3%85%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

#5. mysqlのインストールと下準備

下記のコマンドで、mysqlのインストールを行う

```
sudo apt install -y mysql-server
```

次に、mysqlに入り、ユーザーの作成・データベースの作成・権限の設定を行う。

```
sudo mysql
mysql> create user [ユーザー名]@localhost identified by '[パスワード]';
mysql> create database [データベース名];
mysql> grant all on [データベース名].* to [ユーザー名]@localhost;
```

#6. Laravelプロジェクトのクローンと設定
###① /var/www/直下にLaravelのプロジェクトを配置する

```
cd /var/www
sudo git clone [URL]
```

また、必要に応じてブランチを切り替える

```
sudo git fetch origin develop
sudo git checkout develop
```

###② 【重要】 権限の変更を行う。
nginxはデフォルトで、www-dataというユーザー名でソースにアクセスしているので、所有者をwww-dataというユーザーに変更する。

```
sudo chown -R www-data [プロジェクト名]/
```

**確認**
/var/www直下で下記を実行し、

```
ls -al
```

```
drwxr-xr-x  4 root     root 4096 May  6 04:42 .
drwxr-xr-x 14 root     root 4096 May  6 04:39 ..
drwxr-xr-x  5 www-data root 4096 May  6 05:04 hohehohe
drwxr-xr-x  2 root     root 4096 May  6 04:41 html
```
上記のように該当プロジェクトの所有者がwww-dataに変わっていればOK

###③ パッケージのインストール
laravelのプロジェクトを動かすのに必要なパッケージのインストールを行う。

```
cd /var/www/[プロジェクト名]/backend
sudo apt install composer
sudo apt install php-mbstring php-xml php-json
sudo composer install
```
やっていることとしては、backend直下にある「composer.json」の情報をもとに、依存パッケージをインストールし、vendor/に配置している。（下記サイト参照）
https://qiita.com/masarufuruya/items/23131a465b7e9c8f3060

**確認**
lsコマンドで、一覧を確認し、vendorディレクトリが生成されていることを確認する

```
/var/www/hohehohe/backend$ ls
README.md  composer.json  package-lock.json  resources   vendor
app        composer.lock  package.json       routes      webpack.mix.js
artisan    config         phpunit.xml        server.php  
bootstrap  database       public             storage
```

###④ .envファイルの変更

.envファイルを作成する
※既に.envファイルがある場合は不要

```
sudo /var/www/hohehohe/backend
sudo cp .env.example .env
sudo php artisan key:generate
```

.envファイルの変更。
mysqlで作成したユーザー名・パスワード・データベース名に変更する。

```:.env
    DB_DATABASE = [データベース名]
    DB_USERNAME = [ユーザー名]
    DB_PASSWORD = [パスワード]
    DB_HOST=localhost
```

###⑤ マイグレーションの実行

必要に応じて、マイグレーションを行う

```
sudo /var/www/hohehohe/backend
sudo apt-get install php7.4-mysql
sudo php artisan migrate
```


#7. nginxの設定ファイルを変更する
nginxの設定ファイルである /etc/nginx/sites-enabled/default を開き、編集を行う。

```
sudo vi /etc/nginx/sites-enabled/default
```

※正確には
/etc/nginx/nginx.conf に設定が書かれており、その中で、
/etc/nginx/sites-enabled/default
を読むように書かれているので、serverに関することはここに書く

下記の点を変更する

###① rootの変更
デフォルトでは、/var/www/htmlを見に行くようになっているので、先程クローンしたプロジェクトを見に行くように変更

```
# root /var/www/html; # 変更前
root /var/www/[プロジェクト名]/backend/public; # 変更後
```

###②index.phpの追加
今回はPHPのプロジェクトなので、index.phpも読むように設定

```
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html index.php; #index.phpを追加
```

###③ locationの設定
指定されたファイルやディレクトリが存在しない場合に、/index.php$query_string へ内部リダイレクトするように設定

```
location / {
                # try_files $uri $uri/ =404; #変更前
                try_files $uri $uri/ /index.php?$query_string; #変更後
        }
```

※詳しい仕組みは、下記の記事が分かりやすかった
https://qiita.com/k_hoso/items/33ccb5e02e73a244ed31

###④ fastcgi_paramの設定
php-fpmを使う場合の設定を location ~ \.php$ で行なっている。
この辺は何やっているのか、詳しくは分かっていないので、勉強します。。

```
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;　# コメントアウトを外す
                # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # コメントアウトを外す
                # With php-cgi (or other tcp sockets):
                # fastcgi_pass 127.0.0.1:9000;
                fastcgi_split_path_info ^(.+\.php)(.*)$; # 追加
                fastcgi_param PATH_INFO $fastcgi_path_info; # 追加
        }
```

※公式サイトの例にあった
https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/

**【重要】 修正後、nginxの再起動を行う**

```
sudo service nginx restart
```


**完成！！！**