nginxでlaravelを動かす際にいろいろ詰んだ話

#環境
 - macOS 10.12.6
 - MacBook pro 2016
 - VirtualBox 5.2.18
 - CentOS 7.6-1810
 - PHP 7.0.33
 - Laravel Framework 5.5.45
 - nginx 1.14.2

#前提
nginx, PHP, PHP-FPM（設定済）, composer をインストール済み

#今回の手順
1.laravelプロジェクトの新規作成
2.nginxの設定ファイルを新規作成
3.nginxの再起動 ←ちょっと詰まった
4.ブラウザ確認　←結構詰まった

#laravelプロジェクトの新規作成
プロジェクトを作りたい場所で、コマンド一発叩きます。
自分は、`/home/username/www/`の配下に作りました。

```
# cd ~/www/
# composer create-project --prefer-dist laravel/laravel projectname
```

#nginxの設定ファイルを新規作成
nginxの設定ファイルは`/etc/nginx/conf.d/`配下に作ります。
デフォルトでは、`default.conf`がいるので、こいつをコピーして作りましょう。

```
# cd /etc/nginx/conf.d/
# cp default.conf laravel.conf //設定ファイルの名前は好きなように（プロジェクト名にするのが無難かも）
```

設定ファイルは、デフォルトのままでは動きませんので、書き換えます。
自分の場合は、以下のような感じです。

```laravel.conf
server {
    listen       5000; //ポート番号はお好みで
    server_name  localhost;

    root   /home/username/www/projectname/public/; //先ほどlaravelプロジェクトを作成した場所に設定します。publicに関しては以下で説明
    index  index.php index.html index.htm;

    #charset koi8-r;
    access_log  /var/log/nginx/projectname/access.log  main; //アクセスログの出力先を指定
    error_log   /var/log/nginx/projectname/error.log  warn;//エラーログの出力先を指定

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

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root/index.php; //ここの$document_rootは、ファイルの上の方で設定したrootが代入されています。

        fastcgi_max_temp_file_size 0;
        fastcgi_buffer_size 4K;
        fastcgi_buffers 64 4k;

        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
```
コメントにも記載したが、`root`で指定したものが`$document_root`に代入される。
デフォルトでは、`location ~ \.php$ {}`内に`root`が宣言されているが、ここでrootを宣言すると、**上の`root`を上書きしてしまう**みたいなので気を付けましょう。

この`root`を、`/home/username/www/projectname/public/`としているが、**laravelで設定したルーティングを使用するためには、`projectname/public/index.php`を最初に見に行かせればいい**ので、このような設定になっている。

###nginx用のログディレクトリ作成
今回は、ログの出力場所を`/var/log/nginx/projectname/`配下にしたので、ディレクトリをしっかり作成しておく。

```
# cd /var/log/nginx/
# mkdir projectname
```
これでログの置き場所はできた。
###ポート開放
あとは、ファイアーウォールの壁に変更したポートの穴を開けてあげなければ外部からのアクセスができないので、ポート開放をしてあげます。

```
# firewall-cmd --add-port=開けたいポート番号/tcp --zone=public --permanent
# firewall-cmd --reload //反映
```

#nginxの再起動
まずは、普通に再起動。

```
# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
```
エラーや…と思い、エラーログを確認。

```error.log
2019/02/24 13:24:50 [error] 4690#4690: *1 "/home/username/www/projectname/public/index.php" is forbidden (13: Permission denied), client: ***.***.***.***, server: localhost, request: "GET / HTTP/1.1", host: "host-name:5000"
```
パーミッション！？と思い`sudo`で実行してもダメ。
詰んだ…と思ったけど、以下の手順で解決できました！

#SELinuxというクセもの
SELinuxという標準の制御機能があるらしく、そいつの制御に引っかかって弾かれていたみたいです…（そんなの今回のこのエラーだけじゃわからんよ…）
SELinuxの状態は以下で確認できます。

```
# getenforce
enforcing
```
>・enforcing SELinux有効でありアクセス制御が有効となる
・permissive アクセス制御は無効だが警告メッセージを表示する
・disabled SELinux無効

[こちら](https://eng-entrance.com/linux-selinux)より

なので、今回はSELinuxを`permissive`にしなくてはなりませんね。
変更のやり方はこうです

```
# setenforce 0 //permissiveに変更
# setenforce 1 //enforcingに変更
```
これで、無事にnginxの再起動ができました！（めでたしめでたし。。。ではなかった）

#ブラウザ確認
あとは、ブラウザ確認だ！ということで、先ほど設定して開放もしたポートにアクセス。
すると、laravelにアクセスできてはいるものの、laravelからエラーが返ってきました。
こんな感じ↓
<img width="1423" alt="スクリーンショット 2019-02-27 0.00.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/183984/6860b2d9-bfa7-3287-ae69-11710d8d769d.png">
エラー内容は以下です。

```
The stream or file "/home/username/www/projectname/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied
```
こいつは、`projectname/storage/logs/`を開けないため起きているみたいです。
laravelに最初にアクセスするとき、この`projectname/storage/logs/`配下に`laravel.log`というアプリケーションログファイルを新規で作成しようとするのですが、書き込み権限がないためにエラーが出ているみたいですね。
※ちなみに、最初のアクセス時だけこのエラーが出るので、一回このエラーを解消してしまえば、後にパーミッションを元に戻してもエラーは起こりません。
チャチャっとパーミッションの変更。

```
# cd storage/
# chmod 777 logs //元は775でした
```
これで解決だ！！
と思いきやまた別のエラー。。。

こんな感じ↓
<img width="1422" alt="スクリーンショット 2019-02-27 0.07.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/183984/6c0c216f-9159-8bd9-fc48-bcc4a14de14a.png">
エラー内容は以下

```
file_put_contents(/home/username/www/projectname/storage/framework/views/ddedc3f39a1683fbdb7b78fe94e93c581d280345.php): failed to open stream: Permission denied
```
同じく、`projectname/storage/framework/views/`配下がいじれないぞと言われていますね。
同じようにパーミッション変更！

```
# cd storage/framework/
# chmod 777 views //元は775でした
```

これで再度アクセス！
<img width="1392" alt="スクリーンショット 2019-02-27 0.13.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/183984/72fbb651-4347-884a-9d2c-155037d440ae.png">

やったぞ！！！アクセス成功！！！
お疲れました…。