Laravel勉強 その5 Laravelのデプロイ

## 前回記事
[Laravel勉強 その4 Laravelのディレクトリ構造](https://qiita.com/masa_skd30/items/ededae79770752532e61)

## 目的
- 勉強のため、Laravel 7.xの公式ドキュメントを読み解いていく。
- 今回は、公式ドキュメントの「デプロイ」の章を扱う。
  ※Homestead、Valetの章は読み飛ばす。

## 参考
[Laravel 7.x デプロイ](https://readouble.com/laravel/7.x/ja/deployment.html)


## イントロダクション
>Laravelアプリケーションをプロダクションとしてデプロイする準備ができたら、アプリケーションをできるだけ確実かつ、効率的な実行を行うには、いくつか重要な手順を行う必要があります。
>このドキュメントでは、アプリケーションを確実にデプロイするため、重要なポイントを説明します。

はい。

## サーバ設定
### Nginx
>Nginxを実行しているサーバにアプリケーションをデプロイするには、Webサーバの設定として以下の設定ファイルが最初の参考となるでしょう。
>ほとんどの設定と同様に、このファイルはサーバの設定に合わせてカスタマイズする必要が起きるでしょう。

``` 
server {
    listen 80;
    server_name example.com;
    root /srv/example.com/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

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

せっかくなので、Nginxの勉強も兼ねて設定の内容を見ていく。
参考：[nginxの基本設定を改めてちゃんと調べてみた](https://qiita.com/hclo/items/35f00b266506a707447e)

```
listen 80;
server_name example.com;
root /srv/example.com/public;
```

- 受けるPORTは80。
- ホスト名が「example.com」の場合に、serverブロック内の設定を適応する。
- ルートディレクトリは/srv/example.com/publicとする。

``` 
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
```

- この辺りは、セキュリティ面を考慮してヘッダーを追加している。
  - クリックジャッキング対応として、自身と生成元が同じフレーム内に限りページを表示する設定をする。
  - クロスサイトスクリプティング（XSS）に対するフィルタ機能を強制的に有効にする。
  - Internet Explorer が MIME Sniffing 機能で content-type 宣言を回避するのを防止する。

```
index index.php;

charset utf-8;
```

- ディレクトリへのアクセスに対して、index.phpを呼び出す。
- レスポンスヘッダのContent-Typeに、charset=utf-8を付与する。

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

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }

error_page 404 /index.php;

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;
}

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

- 全リクエストに対して
  - URLに記載されたファイルが存在しているかを確認。
  - URLに記載されたディレクトリが存在しているかを確認。
  - どちらもなければ、/index.php$query_string へ内部リダイレクトする。
- 「/favicon.ico」へのリクエストに対しては、アクセスログは記載せず、エラーログも捨てる。
- 「/robots.txt」へのリクエストに対しては、アクセスログは記載せず、エラーログも捨てる。
- 404の場合、index.phpを呼び出す。
- 「.php」で終わるリクエストに対して
  - NginxがFastCGIプロトコルを使用してプロキシする実際のサーバーを定義。UNIXドメインソケットを使用して、php7.4-fpmと通信する。
  - FastCGIパラメーターの「SCRIPT_FILENAME」を指定する。
  - 正直、理解しきれていないけど、php-fpmを経由してLaravelの開始スクリプトのindex.phpを実行しましょう、ということみたい。（違う？）
- 「/.well-known」以下以外へのリクエストに対しては、全て拒否する。


## 最適化
### オートローダー最適化
>プロダクションへデプロイする場合、Composerのクラスオートローダマップを最適し、Composerが素早く指定されたクラスのファイルを確実に見つけ、ロードできるようにします。
``` 
composer install --optimize-autoloader --no-dev
``` 

>Tip!! オートローダを最適化することに加え、プロジェクトのソースコントロールリポジトリへ、composer.lockファイルをいつも確実に含めましょう。
>composer.lockファイルが存在すると、プロジェクトの依存パッケージのインストールが、より早くなります。

あんまりよくわからないけど、これを使用すると早くなるってことみたい。

### 設定ローディングの最適化
>アプリケーションをプロダクションへデプロイする場合、デプロイプロセスの中で、確実にconfig:cache Artisanコマンドを実行してください。
```
php artisan config:cache
```
>このコマンドは、Laravelの全設定ファイルをキャッシュされる一つのファイルへまとめるため、設定値をロードする場合に、フレームワークがファイルシステムを数多くアクセスする手間を大いに減らします。

>Note: 開発時にconfig:cacheコマンドを実行する場合は、設定ファイルの中だけで、env関数を呼び出していることを確認してください。
>設定ファイルがキャッシュされてしまうと、.envファイルはロードされなくなり、env関数の呼び出し結果はすべてnullになります。

これは以前にも出てきた。
設定ファイルをいちいち読み込まないようにするやつ。

### ルートロードの最適化
>多くのルートを持つ大きなアプリケーションを構築した場合、デプロイプロセス中に、route:cache Artisanコマンドを確実に実行すべきでしょう。
```
php artisan route:cache
```
>このコマンドはキャッシュファイルの中の、一つのメソッド呼び出しへ全ルート登録をまとめるため、数百のルートを登録する場合、ルート登録のパフォーマンスを向上します。

>Note: この機能はPHPのシリアライゼーション機能を使用するため、アプリケーションの全ルートをキャッシュするには、コントローラベースのルート定義だけを使用してください。PHPはクロージャをシリアライズできません。

ルートがたくさんある場合は、このコマンドを実行しておけば早くなりますよってことみたい。

### ビューロードの最適化
>実機環境へアプリケーションをデプロイする場合は、その手順の中でview:cache Artisanコマンドを実行すべきでしょう。
```
php artisan view:cache
```
>このコマンドは全Bladeビューを事前にコンパイルし、要求ごとにコンパイルしなくて済むため、ビューを返すリクエストすべてでパフォーマンスが向上します。

これを実行しておけば、パフォーマンスが向上するみたい。

## Forgeによるデプロイ
>自分のサーバ設定管理に準備不足であったり、堅牢なLaravelアプリケーション実行に必要な数多くのサービスすべての設定について慣れていなければ、Laravel Forgeは素晴らしい代替案です
>Laravel ForgeはDigitalOcean、Linode、AWSなど数多くのインフラプロバイダー上に、サーバを作成できます。
>それに加え、ForgeはNginx、MySQL、Redis、Memcached、Beanstalkなどのような、堅牢なLaravelアプリケーションを構築するために必要なツールを全部インストールし、管理します。

何かと思ったら、Laravel LLCが提供している、環境の構築・管理をするサービスみたい。
今回は使わないけど、ちょっと便利そうかも。


最適化の部分はよくわからなかったけど、全部実行しておけばいいのかな？笑
第5回はここまで。