Laravel勉強 その2 設定の確認

## 前回記事
[Laravel勉強 その1 サーバのセットアップ、DockerでのLaravel環境構築](https://qiita.com/masa_skd30/items/bf8889b2eaa059fdd62b)

## 目的
- 勉強のため、Laravel 7.xの公式ドキュメントを読み解いていく。
- 今回は、公式ドキュメントの「インストール」の章を扱う。

## 参考
[Laravel 7.x インストール](https://readouble.com/laravel/7.x/ja/installation.html)


## サーバ要件
## Laravelのインストール
この辺りについては、Dockerのコンテナ上でLaravel 7.xが動いていることも確認できているので、飛ばします。

## 設定  
### Publicディレクトリ
>Laravelをインストールできたら、Webサーバのドキュメント／Webルートがpublicディレクトリになるように設定してください。
>このディレクトリのindex.phpは、アプリケーションへ送信された、全HTTPリクエストを始めに処理するフロントコントローラとして動作します。

Webサーバ（nginx）の設定ファイルを確認してみる。

```:nginxコンテナ内で操作
rootの設定値がpublicに設定されていることを確認
# grep "root " /etc/nginx/conf.d/default.conf
  root  /var/www/public;
```

publicって本当にここなのかな？
とも思ったので、ちょっと試してみる。

```
# echo aaa > /var/www/public/aaa.txt
# cat /var/www/public/aaa.txt
aaa
```  

http://<EC2のIP>/aaa.txtにリクエストしてみたところ、「aaa」が表示されたのでここでよさそう。
というか、docker-compose.ymlを作った時にvolumesで指定しているのね。

```
php:
（略）
    volumes:
      - ./server:/var/www

（略）

      nginx:
      （略）
        volumes:
          - ./server:/var/www
          - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
```


### 設定ファイル
>フレームワークで使用する設定ファイルは、すべてconfigディレクトリ下に設置しています。
>それぞれのオプションにコメントがついていますので、使用可能なオプションを理解するため、ファイル全体に目を通しておくのが良いでしょう。

```  
# ll server/config
合計 72
-rw-rw-r-- 1 root root 9239  5月 21 20:33 app.php
-rw-rw-r-- 1 root root 3796  5月 21 20:33 auth.php
-rw-rw-r-- 1 root root 1601  5月 21 20:33 broadcasting.php
-rw-rw-r-- 1 root root 3100  5月 21 20:33 cache.php
-rw-rw-r-- 1 root root  823  5月 21 20:33 cors.php
-rw-rw-r-- 1 root root 5054  5月 21 20:33 database.php
-rw-rw-r-- 1 root root 2688  5月 21 20:33 filesystems.php
-rw-rw-r-- 1 root root 1571  5月 21 20:33 hashing.php
-rw-rw-r-- 1 root root 2896  5月 21 20:33 logging.php
-rw-rw-r-- 1 root root 3372  5月 21 20:33 mail.php
-rw-rw-r-- 1 root root 2760  5月 21 20:33 queue.php
-rw-rw-r-- 1 root root  950  5月 21 20:33 services.php
-rw-rw-r-- 1 root root 7041  5月 21 20:33 session.php
-rw-rw-r-- 1 root root 1053  5月 21 20:33 view.php
```  

あ、こんなにあるの…？
ちょっと面倒k…時間がかかりそうなので、必要に応じて見ていくことにしよう。決めた。


### ディレクトリパーミッション
>Laravelをインストールした後に、多少のパーミッションの設定が必要です。
>storage下とbootstrap/cacheディレクトリをWebサーバから書き込み可能にしてください。設定しないとLaravelは正しく実行されません。

これも前回設定してある。（セキュリティ的な面は度外視したけど）
``` 
# sudo chmod -R 777 /var/project/server/storage/
# sudo chmod -R 777 /var/project/server/bootstrap/cache
``` 

### アプリケーションキー
>次にインストール後に行うべきなのは、アプリケーションキーにランダムな文字列を設定することです。
>ComposerかLaravelインストーラを使ってインストールしていれば、php artisan key:generateコマンドが、あらかじめ設定しています。
>
>通常、この文字列は３２文字にすべきです。キーは.env環境ファイルに設定されます。
>もし、.env.exampleファイルをまだ.envへコピーしていなければ、今すぐ行ってください。
>**アプリケーションキーが設定されていなければ、ユーザーセッションや他の暗号化済みデーターは安全でありません！**

要は暗号化のための鍵ってことで、大事そうだけどいまいちよくわからない。
調べてたらこれが一番わかりやすいかも？（バージョンは古いけど）
[[Laravel5.5] APP_KEY の行方を追う](https://qiita.com/yk2220s/items/dcbf54c6d1f33a0cb06f)

```:phpコンテナで実行
# php artisan key:generate
Application key set successfully.
```
```
APP_KEYの値を確認
# grep ^APP_KEY /var/project/server/.env
APP_KEY=****************************　←実際にはKEYが記載されている
```  

### その他の設定
>Laravelのその他の設定は、最初に指定する必要がありません。すぐに開発を開始しても大丈夫です！
>しかし、config/app.phpファイルと、その中の記述を確認しておいたほうが良いでしょう。
>アプリケーションに合わせ変更したい、timezoneやlocalのような多くのオプションが含まれています。

app.phpだけ見てみようかと思う。

| 設定項目        | 説明                                            | デフォルト値                       | 変更後の値   |
| --------------- | ----------------------------------------------- | ---------------------------------- | ------------ |
| name            | アプリケーション名                              | env('APP_NAME', 'Laravel')         | -            |
| env             | 環境名                                          | env('APP_ENV', 'production')       | -            |
| debug           | デバッグモード                                  | (bool) env('APP_DEBUG', false)     | -            |
| url             | コンソールで使用するURL                         | env('APP_URL', 'http://localhost') | -            |
| asset_url       | ここに設定したurlを元に、asset()でurl生成できる | env('ASSET_URL', null)             | -            |
| timezone        | date系の関数で使用されるタイムゾーン            | 'UTC'                              | 'Asia/Tokyo' |
| locale          | ロケール                                        | 'en'                               | 'ja'         |
| fallback_locale | 指定ロケールが存在しない時に使用されるロケール  | 'en'                               | 'ja'         |
| faker_locale    | Faker（フェイクデータ作成）で使用される言語     | 'en_US'                            | 'ja_JP'      |
| key             | 暗号化キー                                      | env('APP_KEY')                     | -            |
| cipher          | 暗号化のサイファー                              | 'AES-256-CBC'                      | -            |
| providers       | 自動読み込みサービスプロバイダー                | （略）                             | -            |
| aliases         | クラスのエイリアス                              | （略）                             | -            |

動作確認のため、設定を変える前に時刻を確認。

```:phpコンテナで実行
# php artisan tinker
Psy Shell v0.10.4 (PHP 7.3.18 ― cli) by Justin Hileman
>>> echo Carbon\Carbon::now();
2020-05-22 08:34:47?
```

確かに、日本時間ではない。
app.phpを編集してみる。

```
# diff app.php{_bk,}
70c70
<     'timezone' => 'UTC',
---
>     'timezone' => 'Asia/Tokyo',
83c83
<     'locale' => 'en',
---
>     'locale' => 'ja',
96c96
<     'fallback_locale' => 'en',
---
>     'fallback_locale' => 'ja',
109c109
<     'faker_locale' => 'en_US',
---
>     'faker_locale' => 'ja_JP',
```  

もう一度、時刻を確認する。

```:phpコンテナで実行
# php artisan tinker
Psy Shell v0.10.4 (PHP 7.3.18 ― cli) by Justin Hileman
>>> echo Carbon\Carbon::now();
2020-05-22 17:38:30?
```  

確かに変わっている。

## Webサーバ設定
### ディレクトリ設定

>Laravelは常にWebサーバで設定した「Webディレクトリ」のルートから提供する必要があります。
>「Webディレクトリ」のサブディレクトリでLaravelアプリケーションを提供しようと試みてはいけません。
>そうした試みはアプリケーションの中に存在するセンシティブなファイルを曝してしまう可能性があります。

特にいじる必要はなさそう。
というか具体例がないとよくわからない。

### きれいなURL
#### Apache

>URLパスにフロントコントローラのindex.phpを付けなくても良いように、Laravelはpublic/.htaccessファイルを用意しています。
>LaravelをApache上で動作させるときは、確実にmod_rewriteモジュールを有効に設定し、そのサーバで.htaccessファイルを動作させます。

今回はNginxを使用しているので、直接は関係ない。
デフォルトで.htaccessファイルが用意されているが、動作しない場合はmod_rewriteの設定を入れろとのこと。

#### Nginx
>Nginxを使用する場合は、すべてのリクエストがindex.phpフロントコントローラへ集まるように、サイト設定に以下のディレクティブを使用します。

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

Dockerの時点で作成したdefault.confに、上記設定は入っている。



2回目はここまで。